Señales GTK, Eventos GDK.
Las señales no son eventos, y los eventos no son señales. Una señal es un mensaje emitido por una instancia de GtkObject en respuesta a algun elemento predeterminado de su ambiente, e.j. una acción generada por el usuario final, o una instrucción generada desde una función o método. Las señales son siempre programadas en en codigo, o internamente dentro de GTK o externamente por el programador PHP-GTK.
Los eventos, por otro lado, son un continuo flujo de impulsos de comunación de mensajes que dejan ver cambios en el ambiente en el sistema de ventanas. El ciclo pricipal de PHP-GTK esta hecho de estos flujos de eventos entre otras cosas.
No es posible conectar una función callback a un GdkEvent directamente.
Cualquier widget que tiene su GdkWindow puede capturar eventos que son reelevantes para el. Los Widgets que carecen de una GdkWindow - esos que son creados con el flag GTK_NO_WINDOW - no pueden hacer eso, a menos que sean contenidos dentro de un GtkEventBox - un widget creado con proposito especifico. Hay ocaciones cuando es muy favorable permitir la captura de eventos; un ejemplo obvio seria la creación de una instancia de GtkToolTips la cual se dispara cuando su subject widget captura el evento GDK_ENTER_NOTIFY y destruido cuando el mismo widget captura el evento GDK_LEAVE_NOTIFY.
Aunque no es posible usa run evento como disparador de un callback de la misma forma que una señal, hay una serie de señales que derivan de GtkWidget colectivamente conocidos como 'event' signals. Estos son formas efectivamente de descriibir un evento en terminos de una señal, permitiendo a las callbacks ser indirectamente disparadas por medio de la captura de la ocurrencia de las mayoria de los GdkEventTypes. El objeto GtkTooltips por si mismo utiliza el método connect_object y la señal generica "event" para monitorear su subject widget.
El concepto de events no es fácil de entender. Por favor copie, pegue y ejecute el siguiente script para ver como se muestran los eventos sobre la acción de los widgets.
Ejemplo 2.8. Demonstración del flujo de los eventos de un GtkButton
<?php dl("php_gtk." . (strstr(PHP_OS, "WIN") ? "dll" : "so")) || die("Can't load php_gtk module!\n"); function show_event_type($button, $event, $text) { $event_type = $event->type; $insert = $text->get_length(); $text->freeze(); switch($event_type) { case 2: $text->insert_text("GDK_EXPOSE\n", $insert); break; case 3: $text->insert_text("GDK_MOTION_NOTIFY\n", $insert); break; case 4: $text->insert_text("GDK_BUTTON_PRESS\n", $insert); break; case 5: $text->insert_text("GDK_2BUTTON_PRESS\n", $insert); $button->hide(); break; case 7: $text->insert_text("GDK_BUTTON_RELEASE\n", $insert); break; case 8: $text->insert_text("GDK_KEY_PRESS\n", $insert); break; case 9: $text->insert_text("GDK_KEY_RELEASE\n", $insert); break; case 10: $text->insert_text("GDK_ENTER_NOTIFY\n", $insert); break; case 11: $text->insert_text("GDK_LEAVE_NOTIFY\n", $insert); break; case 12: $text->insert_text("GDK_FOCUS_CHANGE\n", $insert); break; case 14: $text->insert_text("GDK_MAP\n", $insert); break; case 15: $text->insert_text("GDK_UNMAP\n", $insert); $button->destroy(); $text->insert_text( "\n* GDK EVENTS AND GTK SIGNALS - background stream vs foreground messaging * \n * Most GdkEventTypes have counterpart GTK signals, known as 'event' signals, implemented in GtkWidget. The types on your screen are there because the GtkButton was programmed to emit the generic 'event' signal each time it captured one of the stream of GDK events that makes up the GTK main loop. In each case, the captured GdkEvent was passed as a callback parameter so that its enumerated type value could be determined within the signal handler function. Scroll down to see the series of event values captured during your recent interaction with the GtkButton widget. * \n * Please note that the majority of GTK signals do NOT correspond to GDK events in this or any other way! For example, the signal connection \$button->connect('pressed', 'whatever'); has no relationship to the GDK_BUTTON_PRESS event it generates, which refers to mouse-button activity and not to the GtkButton 'pressed' signal. * \n", 0); break; } $text->thaw(); return false; } $window = &new GtkWindow(); $window->set_position(GTK_WIN_POS_CENTER); $window->set_default_size((gdk::screen_width()/1.5), (gdk::screen_height()-20)); $window->connect_object("destroy", array("gtk", "main_quit")); $window->realize(); $box = &new GtkVBox(false, 5); $window->add($box); $scrlwin = &new GtkScrolledWindow(); $box->pack_start($scrlwin, true, true, 0); $text = &new GtkText(); $scrlwin->add($text); $button = &new GtkButton("Double-click here for information.."); $button->add_events(GDK_ALL_EVENTS_MASK); $button->connect("event", "show_event_type", $text); $box->pack_end($button, false, false, 5); $window->show_all(); gtk::main(); ?> |