Dnes a zítra probíhá vývojářská konference Google I/O 2026. Sledovat lze na YouTube a na síti 𝕏 (#GoogleIO).
Canonical vydal Ubuntu Core 26. Vychází z Ubuntu 26.04 LTS a podporováno bude 15 let. Ubuntu Core je minimální neměnný operační systém určený pro vestavěné systémy.
Bylo vydáno OpenBSD 7.9. Po dlouhé době opět se songem: Diamond in the Rough.
Byl vydán Mozilla Firefox 151.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 151 bude brzy k dispozici také na Flathubu a Snapcraftu.
Elon Musk prohrál soudní spor se společností OpenAI, která se podle jeho žaloby odchýlila od původně uváděného cíle vyvíjet umělou inteligenci (AI) ku prospěchu lidstva. Porota včera po necelých dvou hodinách dospěla k jednomyslnému závěru, že Musk žalobu podal příliš pozdě. Musk byl jedním ze spoluzakladatelů společnosti OpenAI, která vznikla v roce 2015 a vyvinula populární chatovací systém ChatGPT. V roce 2018 na svůj post ve vedení
… více »Byla vydána nová verze 10.4 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Opraveny jsou zranitelnosti Copy Fail a Dirty Frag. Přibyl nový obraz pro Orange Pi 5B.
Pokud je zranitelnost Linuxu v nepoužívaném jaderném modulu, lze ji jednoduše vyřešit zakázáním automatického načítání tohoto konkrétního zranitelného modulu. Projekt ModuleJail si klade za cíl zvýšit bezpečnost Linuxu zakázáním automatického načítání všech nepoužívaných jaderných modulů. Jedná se o skript, který dá všechny nepoužívané jaderné moduly na blacklist (/etc/modprobe.d/modulejail-blacklist.conf).
Odborníci z Penn State University zkoumají způsob ukládání informací na lepicí pásku. Principiálně by podle nich bylo možné kombinací odlepení a zpětného přilepení dosáhnout uložení informace, kterou opětovným odlepením dokážou přečíst. Výhodou je, že způsob uložení i přečtení je čistě mechanický. Zde o tom referují ve volně dostupném článku. Zajímavé bude sledovat zda se jim v rámci výzkumu podaří prokázat použitelnost i v jiné než
… více »Na GitHubu byl publikován reprodukovatelný návod, jak rozchodit Adobe Lightroom CC na Linuxu a Wine. Návod byl vytvořený pomocí AI Claude Code.
Pokud by někdo potřeboval Wayland kompozitor uvnitř počítačové hry Minecraft, aby mohl zobrazovat okna desktopových aplikací přímo v herním prostředí, může sáhnout po Waylandcraftu. Ukázka na YouTube.
Selector::OnMenuButton1Click()
{
// prizpusob chovani tridy
};
Kdy by se tato metoda vyvolala jen tehdy, kdy by bylo to tlačítko v menu stisknuto ?
Vůbec nevím kudy do toho ... budu vděčný, když mi někdo dokážete poradit ...
OnMenuButton1Click(Sender) {
if MENUITEM(Sender)->down {
...
} else {
...
}
}
class Base;
typedef void (Base::*Event) (Base *Sender);
class Base{
public:
Event OnClick;
};
class MyChild : public Base{
public:
Event OnClick;
MyChild(){
OnClick = &MyChild::MyClick; // ?
}
void MyClick(Base *Sender){
}
};
Ovšem toto nefunguje a na označeném řádku vyhazuje chybu, že nemůže přetypovat MyChild na Base. Co tam je udělané blbě ? A pokud je celá úvaha blbě, tak jak to řešit ?
static_cast<Event>. Ale podle meho byste se mel predevsim vazne zamyslet nad navrhem - proc nepouzivate virtualni funkce, nebo sigc++?
=== base.h ===
class Base;
typedef void (Base::*Event) (Base *Sender);
class Base{
};
=== derived1.cpp ===
class Derived1 : public Base{
public:
void MyClick1(Base *Sender){
cout << "MyClick1" <<endl;
}
};
Event ev1 = &Derived1::MyClick1;
=== derived2.cpp
class Derived2 : public Base{
public:
void MyClick2(Base *Sender){
cout << "MyClick2" <<endl;
}
};
Event ev2 = &Derived2::MyClick2;
Jak by se v paměti lišily ev1 a ev2? Fungovalo by to, kdyby Base měla virtuální metodu MyClick(), Derived[12] by ji implementovaly, ev[12] by se inicializovaly &Base::Myclick a volaly na instanci buď jedné nebo druhé třídy. Ale pak by ty ukazatele ztrácely smysl.
ev1 by byla adresa Derived1::MyClick1 a ev2 adresa Derived2::MyClick2 (ale musite castovat, samo vam to neprojde). Nicmene takovehle zonglovani s ukazatelama na funkce neni prilis moudre, ztracite informaci o typu a velmi hlasite si rikate o segfaulty.
Skús z chybného riadku vymazať ampersand '&'. Ak to nepôjde skús aj typ Event definovať bez toho Base::.
Selector obsahuje zoznam položiek v menu, alebo položky obsahuje tá "PrváMenuTrieda"?
#include <string>
use namespace std;
class PrvaMenuTrieda {
public:
PrvaMenuTrieda(Selector *s);
void draw_menu();
...
private:
string *polozky_menu; // Text v menu
void *(*callback_fcie)(Event e); // i-ta funkcia = i-ta polozka
Selector *selector;
...
}
PrvaMenuTrieda::draw_menu() {
// vykresli menu
...
// spracuj eventy (klavesnica, mys)
// selector zisti, ci a kam si klikol
// ak si klikol na i-tu poloku, zalova:
// (prvaMenuTrieda -> getFciu(i))(event);
selector -> process_event(this);
}
Toto ti asi nepomôže, ale popis tvojho problému tiež nie je najasnejší. Ešte ti ukážem, ako sa robia callbacky v C:
#include <stdio.h>
int callback_fcia(int i) {
printf("fcia: %d => %d", i, i + 1);
return i + 1;
}
int callback_fcia_2(int i) {
printf("fcia_2: %d => %d", i, i * 2);
return i * 2;
}
void call_on_array(int[] ary, int size, int (*callback(int))) {
int i;
for(i = 0; i < size; i++) ary[i] = callback(ary[i]);
}
int main(int argc, char **argv) {
int ary[] = {0, 1, 2, 3, -5};
call_on_array(ary, 5, callback_fcia);
call_on_array(ary, 5, callback_fcia_2);
return 0;
}
class Fomular : public CForm
{
public :
Edit *pEdit1;
Button *pButton01;
Button *pButton02;
void OnButton01Click(Object *Sender) { Zpracuj kod podmineni stiskem tlacitka 01; };
Draw(); // vykresli to okno
};
class Info // zde v teto tride chci pouzit to okno ( formular ) definovaný výše.
{
Formular *pForm;
public :
Draw() { pForm->Draw();};
void NastalaUdalostNaKlavesniciNeboMysi(struct popisUdalosti)
{
pForm->ZpracujUdalostARozhodniZdaSeTeTyka(popisUdalost);
};
};
Takhle nějak by měl vypadat ten kód. Bohužel tohle je už jen obálka. Nevím jak implementovat tu část, kde vlastně potřebuji "do toho buttonu dostat metodu jiné třídy".
/* knihovna */
class Widget;
class Clickable {
public:
virtual int OnClick(Widget *Sender) = 0;
};
class Widget {
public:
Widget(): m_handler(0) {}
void addHandler(Clickable *handler)
{
m_handler = handler;
}
private:
Clickable *m_handler;
int click()
{
if (m_handler) return m_handler->OnClick(this);
return 0;
}
};
/* aplikace */
class Form {
Form() : btnclick(this)
{
m_widget = new Widget;
m_widget->addHandler(&btnclick);
}
~Form()
{
delete m_widget;
}
class button1Click : public Clickable {
public:
button1Click(Form *parent) : m_parent(parent) {};
private:
Form *m_parent;
int OnClick(Widget *Sender)
{
m_parent->m_data = 42;
return 0;
}
} btnclick;
private:
int m_data;
Widget *m_widget;
};
Takže jednodušší by bylo mít handlery jako globální funkce s dalším argumentem, ve kterém bude uložený ukazatel na třídu, kterou uživatel potřebuje měnit (jako handlery v Gtk). Na funkce lze ukládat ukazatele dle libosti
Vezmime si hypotetickú situáciu: Formulár obsahuje objekty Tlacidlo. Každé tlačidlo by malo volať nejakú špeciálne jemu priradenú fciu. Potom cez konštruktor, alebo cez accessor by táto fcia mala byť nastaviťeľná (predaná buttonu). Neviem, či poznáme základný princíp OOP (ja ho síce poznám, ale zdá sa mi neužitočný). Vytvoríme abstraktnú triedu Action, od ktorej odvodíme viacero tried, ktoré budú obsahuvať našu callback fciu:
class Action {
void do_the_action() = 0;
}
class EditAction : public Action {
TextBox text_box;
EditAction(TextBox t) {
text_box = t
}
void do_the_action() {
text_box -> begin_edit();
}
}
class SaveAction : public Action {
TextBox text_box;
SaveAction(TextBox t) {
text_box = t;
}
void do_the_action() {
char *data = text_box -> getData();
save_data_to_file(the_file, data);
delete data;
}
}
class Button {
Action action;
Button(Action a) {
action = a;
}
void draw(event) {
if(event is my event) {
a -> do_the_action();
}
}
}
class Formular {
TextBox *text_box;
Action *a_edit;
Action *a_save;
Button *b_edit;
Button *b_save;
Formular() {
text_box = new TextBox(this);
a_edit = new EditAction(text_box);
a_save = new SaveAction(text_box);
b_edit = new Button(a_edit);
b_save = new Button(a_save);
}
void draw() {
text_box -> draw(event);
b_edit -> draw(event);
b_save -> draw(event);
}
}
Tiskni
Sdílej: