Manuel PHP-GTK

Signaux et evénements

Les signaux GTK, les événements GDK.

Un signal n'est pas un événement et inversement. Un signal est un message émis par un GtkObject en fonction d'éléments prédeterminés de son environement (une action de l'utilisateur ou une instruction venant d'une méthode ou d'une fonction). Les signaux sont toujours définis dans le code, soit en interne dans GTK ou alors dans votre application.

Les évenements sont représentés par un flux de messages sur l'etat de l'environnement. La boucle principale de GTK contient ces évenements.

Il n'est pas possible de connecter directement un rappel à un événement GdkEvent.

Chaque widget possédant un objet GdkWindow peut capturer les événements qui lui sont associés. Les widgets sans GdkWindow - ceux créent avec l'option GTK_NO_WINDOW - ne peuvent pas recevoir les évenements à moins d'utiliser l'objet GtkEventBox - un widget creé a cet effet. Il existe des occasions où il est très utile de capturer les événements; par exemple, la création d'une instance de GtkToolTips est déclenchée lorsque le widget capture l'événement GDK_ENTER_NOTIFY et détruit lorqu'il recoit l'événement GDK_LEAVE_NOTIFY.

Il est également impossible d'utiliser l'évenement pour déclencher un rappel comme le ferait un signal, il existe une série de signal dérivée de l'objet GtkWidget, connue sous le nom de signaux événements. Il est possible de définir un événement comme un signal en permettant à un rappel d'être déclenché lors de la capture de l'événement GdkEventTypes. L'objet GtkTooltips utilise la méthode connect_object et le signal générique "event" sur le widget.

Le concept d'événement n'est pas facile à comprendre. Pour mieux comprendre, éxécuter ce script pour voir les différents événements en action.

Exemple 2.8. Démonstration du flux d'événements sur un GtkButton

  1. <?php
  2.  
  3. dl("php_gtk." . (strstr(PHP_OS, "WIN") ? "dll" :  
  4. "so")) || die("Can't load php_gtk module!\n");  
  5.  
  6. function show_event_type($button, $event, $text)  
  7. { 
  8.    $event_type = $event->type; 
  9.    $insert = $text->get_length(); 
  10.    $text->freeze(); 
  11.    switch($event_type) { 
  12.    case 2: 
  13.       $text->insert_text("GDK_EXPOSE\n", $insert); 
  14.    break; 
  15.    case 3: 
  16.       $text->insert_text("GDK_MOTION_NOTIFY\n", $insert); 
  17.    break; 
  18.    case 4: 
  19.       $text->insert_text("GDK_BUTTON_PRESS\n", $insert); 
  20.    break; 
  21.    case 5: 
  22.       $text->insert_text("GDK_2BUTTON_PRESS\n", $insert); 
  23.       $button->hide(); 
  24.    break; 
  25.    case 7: 
  26.       $text->insert_text("GDK_BUTTON_RELEASE\n", $insert); 
  27.    break; 
  28.    case 8: 
  29.       $text->insert_text("GDK_KEY_PRESS\n", $insert); 
  30.    break; 
  31.    case 9: 
  32.       $text->insert_text("GDK_KEY_RELEASE\n", $insert); 
  33.    break; 
  34.    case 10: 
  35.       $text->insert_text("GDK_ENTER_NOTIFY\n", $insert); 
  36.    break; 
  37.    case 11: 
  38.       $text->insert_text("GDK_LEAVE_NOTIFY\n", $insert); 
  39.    break; 
  40.    case 12: 
  41.       $text->insert_text("GDK_FOCUS_CHANGE\n", $insert); 
  42.    break; 
  43.    case 14: 
  44.       $text->insert_text("GDK_MAP\n", $insert); 
  45.    break; 
  46.    case 15: 
  47.       $text->insert_text("GDK_UNMAP\n", $insert); 
  48.       $button->destroy(); 
  49.       $text->insert_text(  
  50. "\n* EVENEMENTS GDK ET SIGNAUX SIGNALS - flux vs message *
  51. \n
  52. * Le plupart des GdkEventTypes ont un équivalent dans les signaux GTK, les
  53. événements signaux, implémentés dans l'objet GtkWidget. Les types que vous
  54. voyez sont là car l'objet GtkButton a été programmé pour émettre des
  55. signaux événements génériques à chaque fois qu'ils sont capturés sur le flux
  56. des événements GDK events. Dans chacun des cas, l'événement GdkEvent
  57. capturé a été passé en paramètre du rappel et ainsi les types énumérés
  58. peuvent être détérminés dans la fonction signal. Scrollez vers le bas pour
  59. voir une série d'événements récents générés par votre interaction avec le
  60. widget GtkButton. *
  61. \n
  62. * Il faut noter que la majorité des signaux GTK ne correpondent pas aux événements
  63. GDK! Par exemple, la connexion au signal suivante
  64.                 \$button->connect('pressed', 'whatever');
  65. n'a pas de relation avec l'événement GDK_BUTTON_PRESS, qui fait référence
  66. à l'action sur le bouton de la souris et non pas au signal 'pressed' sur
  67. l'objet GtkButton. *
  68. \n", 0); 
  69.    break; 
  70.    } 
  71.    $text->thaw(); 
  72.    return false;  
  73. }  
  74.  
  75. $window = &new GtkWindow();  
  76. $window->set_position(GTK_WIN_POS_CENTER);  
  77. $window->set_default_size((gdk::screen_width()/1.5),  
  78. (gdk::screen_height()-20));  
  79. $window->connect_object("destroy", array("gtk",  
  80. "main_quit"));  
  81. $window->realize();  
  82.  
  83. $box = &new GtkVBox(false, 5);  
  84. $window->add($box);  
  85. $scrlwin = &new GtkScrolledWindow();  
  86. $box->pack_start($scrlwin, true, true, 0);  
  87. $text = &new GtkText();  
  88. $scrlwin->add($text);  
  89.  
  90. $button = &new GtkButton("Double Cliquez ici pour plus
  91. d'informations..");  
  92. $button->add_events(GDK_ALL_EVENTS_MASK);  
  93. $button->connect("event", "show_event_type", $text);  
  94. $box->pack_end($button, false, false, 5);  
  95.  
  96. $window->show_all();  
  97.  
  98. gtk::main();  
  99.  
  100.  
  101. ?> 

Remonter Remonter
L'éditeur javascript - CSS - Gentoo - Tutoriaux PHP - Tutoriels PHP - Bretagne - php - Moto - Kit graphique