Signály událostí X
Třída Widget má speciální signály, které odpovídají událostem systému X-Windows v pozadí. Mají za svým názvem připojeno _event, např. Widget::signal_button_press_event().
Občas, když něčeho nejde dosáhnout s normálními signály, můžete shledat užitečným obsluhovat události X. Gtk::Button například neposílá v jeho signálu clicked souřadnice ukazatele myši, ale pokud tuto informaci potřebujete, mohli byste obsluhovat button_press_event. Události X jsou také často využívány k obsluze zmačknutí kláves.
Tyto signály se chovají lehce jinak. Hodnota vrácená z obsluhy signálu říká, jestli událost byla „plně“ obsloužena. Pokud je hodnota false, pak gtkmm předá událost následující obsluze signálu v hierarchii. Pokud je hodnota true, není potřeba volat žádnou další obsluhu signálu.
Obsluha událostí X neovlivňuje ostatní signály widgetu. Pokud třeba obsluhujete button_press_event pro Gtk::Button, stále budete schopni obdržet signál clicked. Obojí je vysláno v (téměř) stejnou chvíli.
Here's a simple example:
bool on_button_press(GdkEventButton* event); Gtk::Button button("label"); button.signal_button_press_event().connect( sigc::ptr_fun(&on_button_press) );
Když je ukazatel myši nad tlačítkem a zmáčknete tlačítko myši, je zavoláno on_button_press().
GdkEventButton je struktura, která obsahuje parametry události, jako jsou souřadnice ukazatele myši ve chvíli, kdy bylo tlačítko zmáčknuto. Existuje několik různých typů struktury GdkEvent pro různé události.
- B.6.1. Posloupnost obsluhy signálu
B.6.1. Posloupnost obsluhy signálu
By default, your signal handlers are called after any previously-connected signal handlers. However, this can be a problem with the X Event signals. For instance, the existing signal handlers, or the default signal handler, might return true to stop other signal handlers from being called. To specify that your signal handler should be called before the other signal handlers, so that it will always be called, you can specify false for the optional after parameter. For instance,
button.signal_button_press_event().connect( sigc::ptr_fun(&on_mywindow_button_press), false );
Událost se nejprve doručí do widgetu, ve kterém se objevila. Pokud všechny obsluhy signálu v tomto widgetu vrátí false (což značí, že událost nebyl obsloužena), je signál propagován do rodičovského widgetu a vyslán zde. Tak se postupně pokračuje až do widgetu v nejvyšší úrovni, dokud se neobjeví nějaký, který událost obslouží.