next up previous contents
suivant: Les conteneurs de bases monter: Tour d'horizon précédent: Tour d'horizon   Table des matières


Sous-sections

Signaux et Évènements

Théorie des signaux et des rappels

Gtk est une ``boîte à outils dirigée par les évènements'' ce qui signifie qu'il veille dans main Gtk jusqu'à ce qu'un évènement se produise. Si c'est le cas, le contrôle est alors passé à la fonction appropriée.

Ce passage de contrôle se fait en utilisant l'idée de ``signal''. Ces signaux ne sont pas les mêmes que les signaux d'un système Unix et ne sont pas implémentés en les utilisant bien que la terminologie soit presque identique. Quand quelque chose, comme `` la pression sur un bouton de souris'' se produit, le signal approprié sera émis par le widget qui fut pressé. C'est ainsi que Gtk fait la plupart de son travail utile. Il est des signaux dont tous les widgets héritent tel que ``destroy'', et d'autres qui sont spécifiques tel que le ``toggled'' signal d'un bouton ``toggle''.

Pour faire agir un bouton, nous plaçons un gestionnaire de signal qui appellera la fonction appropriée. On le fait avec des fonctions comme celles-ci :

En Perl, les deux premières formes sont identiques ainsi que les deux suivantes car Perl envoit tous les arguments sous la forme d'une seule liste de scalaires. Bien sûr, vous pouvez envoyer autant d'éléments par liste que vous le désirez.

La variable à gauche du signal_connect() est le widget qui émettra le signal. Le premier argument est une chaîne de caractères représentant le signal dont vous aimeriez enregistrer le rappel de signal. Le second argument est la routine que vous voulez appeler. Cette routine est appelée rappel de signal. Si vous passez des arguments à la routine, vous les précisez en les ajoutant à la fin de la liste d'arguments. Tout ce qui est après le second argument est passé en tant que liste, c'est pourquoi vous pouvez vous permettre de passer autant d'arguments que vous le souhaitez.

Si vous ne comprenez pas les références Perl, souvenez-vous que les routines sont précédées par un \& et que vous ne pouvez pas placer des parenthèses après le nom de la routine.

Pour les rappels de signaux associés avec uniquement un signal et composés de quelques lignes, il est courant de voir quelque chose comme ceci :

Une routine est habituellement définié par :

Le premier argument envoyé à un rappel de signal sera toujours le widget émetteur et le reste des arguments sont des données optionnelles envoyées par la fonction signal_connect() . Souvenez-vous que Perl ne vous oblige pas à déclarer ou à utiliser les arguments envoyés à une routine.

Noter que la forme ci-dessus pour une fonction de rappel de signal est uniquement un guide général et que certains signaux spécifiques à certains widgets génèrent différents paramètres appelants. Par exemple, le signal Clist select row fournit à la fois les paramètres de ligne et de colonne.

Évènements

En plus du mécanisme des signaux décrit précédemment, il y a un ensemble d'évènements qui reflètent les mécanismes des évènements X. Les rappels signaux peuvent également être attaché à ces évènements qui sont :

Afin de connecter une fonction de rappel à l'un de ces évènements, on utilise signal_connect() comme on la connecterait à un signal en utilisant seulement l'un des noms d'évènements à la place du nom du signal. Le dernier argument passé au rappel de signal est une structure d'évènement ainsi au début de votre fonction, vous devriez dire :

ou si vous voulez passer un ensemble de données :

Les domaines les plus courants dans les structures d'évènements sont les ``boutons'', ``les touches'' et ``type''. Le domaine des boutons contient un nombre avec le bouton pressé ( typiquement 1, 2 ou 3 ). Le domaine `` touche'' contient la touche pressée ( s'il y en a une ). Le domaine ``type'' contient l'une des chaînes suivantes :

Cela permet de déterminer facilement la cause d'un évènement. Par exemple, cela fut-il causé par un bouton pressé ? si oui, lequel ?

Gardez à l'esprit que le code précédent ne fonctionne que si le rappel est lié à l'un des évènements mentionnés ci-dessus. Les signaux n'envoient pas une structure d'évènement ainsi, à moins que vous ne connaissiez exactement le nombre d'arguments envoyés, vous n'avez pas besoin de l'information sur la structure d'un évènement. Je milite pour ne pas connecter un signal et un évènement au même retour.

Plus sur les gestionnaires de signaux

La valeur de retour de la fonction signal_connect() est un ``tag'' qui identifie la fonction de rappel. Vous pouvez avoir autant de rappels par signal ou par objet que vous le souhaitez et ils seront exécutés les uns après les autres dans l'ordre ou ils ont été attaché.

Émettre un signal

Si vous voulez émettre un signal spécifique, vous pouvez le faire en appelant l'une des fonctions suivantes :

L'argument de la première forme est le ``id tag'' qui est retourné par signal_connect() . L'argument de la seconde forme est une chaîne identifiant le nom du signal ? Ainsi beaucoup de widgets ont des fonctions qui émettent des signaux les plus courants. Par exemple, la fonction destroy() permettra au signal 'destroy' d'être émis et la fonction activate () permettra au signal 'activate' d'être émis.

Supprimer des retours

Ce ``id tag'' vous permet également de supprimer un retour de la liste en utilisant signal_disconnect() comme ceci :

Si vous voulez ôter tous les gestionnaires d'un widget, vous pouvez appeler la fonction :

Cet appel se passe de commentaires. Il enlève simplement tous les gestionnaires de l'objet passé en tant que premier argument.

Désactiver temporairement des gestionnaires

Vous pouvez débrancher temporairement des gestionnaires avec :

Connecter ou déconnecter des gestionnaires

Voici un aperçu des fonctions utilisées pour connecter ou déconnecter un gestionnaire pour chacun des signal_connect disponibles. Vous trouverez plus de détails dans la documentation Gtk.

Émission et propagation d'un signal

L'émission d'un signal est un processus par lequel Gtk fait fonctionner tous les gestionnaires pour un objet et un signal spécifique. Premièrement, sachez que la valeur de retour de l'émission est la valeur du dernier gestionnaire utilisé. Puisque tous les signaux d'évènements sont du type `` last'', ce sera le gestionnaire par défaut, à moins que vous ne les connectiez avec les signal signal_connect_after() .

La manière dont un évènement est pris en charge est :

Quelques conséquences

La valeur de retour d'un gestionnaire n'aura aucun effet s'il y a un gestionnaire par défaut, à moins que vous ne connectiez avec signal_connect_after() . Pour empêcher le gestionnaire par défaut de se déclencher, vous avez besoin de connecter avec signal_connect() et d'utiliser signal_emit_stop_by_name() . La valeur de retour affecte seulement si le signal est propagé et pas l'émission courante.


next up previous contents
suivant: Les conteneurs de bases monter: Tour d'horizon précédent: Tour d'horizon   Table des matières
LE BORGNE Patrice 2001-01-11