NOM

Tk::event - Facilités diverses pour la gestion d'événements : définir des événements virtuels, générer des événements


SYNOPSIS

$widget->eventAction(?arg, arg, ...?);


DESCRIPTION

Les méthodes eventAction fournissent diverses facilités pour jouer avec les événements du système de fenêtres, comme définir des événements virtuels ou synthétiser des événements. Les événements virtuels sont partagés par tous les widgets de la même MainWindow. Des MainWindows différentes peuvent avoir des événements virtuels différents.

Les méthodes suivantes sont actuellement supportées :

$widget->eventAdd('<<virtual>>', sequence ?, sequence, ...?)
Associe l'événement virtuel virtual avec la séquence d'événements physiques donnée par les arguments sequence, ainsi l'événement virtuel sera déclenché chaque fois que l'une des sequences se produit. virtual peut être n'importe quelle valeur chaîne et sequence peut prendre toutes les valeurs permises pour l'argument sequence de la méthode bind. Si virtual est déjà défini, les nouvelles séquences d'événements physiques s'ajoutent aux séquences existant pour l'événement.

$widget->eventDelete('<<virtual>>' ?, sequence, sequence, ...?)
Supprime chaque sequence de celles associées à l'événement virtuel virtual. virtual peut être n'importe quelle valeur chaîne et sequence peut prendre toutes les valeurs permises pour l'argument sequence de la méthode bind. Toutes les sequences qui ne sont pas actuellement associées à virtual sont ignorées. Si l'on ne fournit aucun argument sequence, toutes les séquences d'événements physiques sont supprimées de virtual, par conséquent cet événement virtuel ne sera plus jamais déclenché.

$widget->eventGenerate(event ?, option => value, option => value, ...?)
Génère un événement fenêtre et fait en sorte qu'il soit traité comme s'il provenait du système de fenêtres. $window est une référence à la fenêtre pour laquelle l'événement a été généré. Event fournit une description de base de l'événement, telle que <Shift-Button-2> ou <>Paste>>. Si Window est vide l'écran entier est concerné, et les coordonnées sont relatives à l'écran. Event peut avoir toute forme permise pour l'argument sequence de la méthode bind sauf qu'il doit consister en un seul motif d'événement et non une séquence. Des paires Option-value peuvent être utilisées pour spécifier des attributs additionnels pour l'événement, tels que les positions x et y de la souris ; voir ``CHAMPS D'UN ÉVÉNEMENT'' ci-dessous. Si l'option -when n'est pas spécifiée, l'événement est traité immédiatement : tous les handlers de l'événement doivent avoir terminé avant que la méthode eventGenerate ne rende la main. Si l'option -when est spécifiée elle détermine le moment où l'événement sera traité.

$widget->eventInfo(?'<<virtual>>'?)
Renvoie l'information associée à l'événement virtuel. Si l'argument <<virtual>> est omis, la valeur de retour est une liste de tous les événements virtuels actuellement définis. Si <<virtual>> est spécifié la valeur de retour est une liste des séquences d'événements physiques actuellement définis pour l'événement virtuel ; si l'événement virtuel n'est pas défini undef est renvoyé.


CHAMPS D'UN ÉVÉNEMENT

La méthode eventGenerate supporte les options suivantes ; elles correspondent aux expansions ``%'' permises dans les callbacks de liaison pour la méthode bind.

-above => window
window spécifie le champ above de l'événement, soit comme un nom de chemin de fenêtre soit comme un identifiant de fenêtre. Valide pour les événements Configure. Correspond à la substitution %a des scripts de liaison.

-borderwidth => size
size doit être une distance d'écran ; elle spécifie le champ border_width de l'événement. Valide pour les événements Configure. Correspond à la substitution %B des scripts de liaison.

-button => number
number doit être un entier ; il spécifie le champ detail pour un événement ButtonPress ou ButtonRelease, écrasant tout numéro de bouton fourni dans la base de l'argument event. Correspond à la substitution %b des scripts de liaison.

-count => number
number doit être un entier ; il spécifie le champ count de l'événement. Valide pour les événements Expose. Correspond à la substitution %c des scripts de liaison.

-detail => detail
detail spécifie le champ detail de l'événement et doit être un des suivants :
  NotifyAncestor   NotifyNonlinearVirtual  NotifyDetailNone
  NotifyPointer    NotifyInferior          NotifyPointerRoot
  NotifyNonlinear  NotifyVirtual

Valide pour les événements Enter, Leave, FocusIn et FocusOut. Correspond à la substitution %d des scripts de liaison.

-focus boolean
boolean doit être une valeur booléenne ; elle spécifie le champ focus pour l'événement. Valide pour les événements Enter et Leave. Correspond à la substitution %f des scripts de liaison.

-height size
size doit être une distance d'écran ; elle spécifie le champ height pour l'événement. Valide pour les événements Configure. Correspond à la substitution %h des scripts de liaison.

-keycode number
number doit être un entier ; il spécifie le champ keycode de l'événement. Valide pour les événements KeyPress et KeyRelease. Correspond à la substitution %k des scripts de liaison.

-keysym name
name doit être un nom valide de code symbolique de touche, tel que g, space, ou Return ; la valeur correspondante de code de touche est utilisée comme champ keycode de l'événement, écrasant tout détail spécifié dans l'argument de base de event. Valide pour les événements KeyPress et KeyRelease. Correspond à la substitution %K des scripts de liaison.

-mode notify
notify spécifie le champ mode de l'événement et doit être l'un parmi NotifyNormal, NotifyGrab, NotifyUngrab, ou NotifyWhileGrabbed. Valide pour les événements Enter, Leave, FocusIn et FocusOut. Correspond à la substitution %m des scripts de liaison.

-override boolean
boolean doit être une valeur booléenne ; elle spécifie le champ override_redirect de l'événement. Valide pour les événements Map, Reparent et Configure. Correspond à la substitution %o des scripts de liaison.

-place where
where spécifie le champ place de l'événement ; sa valeur est PlaceOnTop ou PlaceOnBottom. Valide pour les événements Circulate. Correspond à la substitution %p des scripts de liaison.

-root window
window est soit un nom de chemin de fenêtre soit un entier identifiant de fenêtre ; il spécifie le champ root de l'événement. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave et Motion. Correspond à la substitution %R des scripts de liaison.

-rootx coord
coord doit être une distance d'écran ; elle spécifie le champ x_root de l'événement. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave et Motion. Correspond à la substitution %X des scripts de liaison.

-rooty coord
coord doit être une distance d'écran ; elle spécifie le champ y_root de l'événement. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave et Motion. Correspond à la substitution %Y des scripts de liaison.

-sendevent boolean
boolean doit être une valeur booléenne ; elle spécifie le champ send_event de l'événement. Valide pour tous les événements. Correspond à la substitution %E des scripts de liaison.

-serial number
number doit être un entier ; il spécifie le champ serial de l'événement. Valide pour tous les événements. Correspond à la substitution %# des scripts de liaison.

-state state
state spécifie le champ state de l'événement. Une valeur entière pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave et Motion. Pour les événements Visibility ce doit être VisibilityUnobscured, VisibilityPartiallyObscured ou VisibilityFullyObscured. Cette option outrepasse tout modificateur tel que Meta or Control qui serait spécifié pour l'événement de base. Correspond à la substitution %s des scripts de liaison.

-subwindow window
window spécifie le champ subwindow de l'événement, soit le nom de chemin d'un widget Tk soit un identifiant de fenêtre. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave et Motion. Correspond à la substitution %S des scripts de liaison.

-time integer
integer doit être une valeur entière ; elle spécifie le champ time de l'événement. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave, Motion et Property. Correspond à la substitution %t des scripts de liaison.

-warp boolean
boolean doit être une valeur booléenne ; elle spécifie si le pointeur d'écran doit être déformé [whether the screen pointer should be warped as well.] Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease et Motion.

-width size
size doit être une distance d'écran ; elle spécifie le champ width de l'événement. Valide pour les événements Configure. Correspond à la substitution %w des scripts de liaison.

-when when
when détermine le moment où l'événement doit être traité ; il doit avoir l'une des valeurs suivantes :
now
Traiter l'événement immédiatement, avant que la commande se termine. C'est le comportement par défaut lorsque l'option -when est omise.

tail
Place l'événement dans la file d'événements de perl/Tk après tous les événements déjà programmés pour cette application.

head
Place l'événement en tête de la file d'événements de perl/Tk, ainsi il sera traité avant tout événement se trouvant déjà dans cette file.

mark
Place l'événement au début de la file d'événements de perl/Tk's mais après tout autre événement comportant une marque -when. Cette option est très utile lorsqu'on génère une série d'événements devant être traités dans l'ordre mais en tête de la file.

-x coord
coord doit être une distance d'écran ; elle spécifie le champ x de l'événement. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Motion, Enter, Leave, Expose, Configure, Gravity et Reparent. Correspond à la substitution %x des scripts de liaison. Si Window est vide la coordonnée est relative à l'écran, et cette option correspond à la substitution %X des scripts de liaison.

-y coord
coord doit être une distance d'écran ; elle spécifie le champ y de l'événement. Valide pour les événements KeyPress, KeyRelease, ButtonPress, ButtonRelease, Motion, Enter, Leave, Expose, Configure, Gravity et Reparent. Correspond à la substitution %y des scripts de liaison. Si Window est vide la coordonnée est relative à l'écran, et cette option correspond à la substitution %Y des scripts de liaison.

Toute option non spécifiée lors de la génération d'un événement est initialisée à la valeur 0, sauf serial, qui est initialisée avec le numéro de série de l'événement X suivant.


EXEMPLES D'ÉVÉNEMENTS VIRTUELS

Pour qu'un événement virtuel soit déclenché deux choses doivent se produire. Tout d'abord, l'événement virtuel doit être défini avec la méthode eventAdd. Ensuite, une liaison doit être créée pour cet événement virtuel au moyen de la méthode bind. Considérons les définitions suivantes d'événements virtuels :

  $widget->eventAdd('<<Paste>>' => '<Control-y>'); 
  $widget->eventAdd('<<Paste>>' => '<Button-2>'); 
  $widget->eventAdd('<<Save>>' => '<Control-X><Control-S>'); 
  $widget->eventAdd('<<Save>>' => '<Shift-F12>');

Dans la méthode bind, un événement virtuel peut être lié avec un autre type d'événement construit de cette manière :

  $entry->bind('Tk::Entry', '<<Paste>>' => sub {
      $entry->Insert($entry->selectionGet) });

``<<'' et ``>>'' sont utilisés pour spécifier qu'on est en train de lier un événement virtuel. Si l'utilisateur frappe Control-y ou presse le bouton 2, ou si un événement virtuel <<Paste>> est synthétisé avec eventGenerate, la liaison <<Paste>> sera invoquée.

Si une liaison virtuelle a exactement la même séquence qu'une liaison physique différente, la liaison physique aura la précédence. Considérons l'exemple suivant :

  $mw->eventAdd('<<Paste>>' => '<Control-y>','<Meta-Control-y>'); 
  $mw->bind('Tk::Entry', '<Control-y>' => sub{print 'Control-y'}); 
  $mw->bind('Tk::Entry', '<<Paste>>'   => sub{print 'Paste'});

Lorsque l'utilisateur frappe Control-y la liaison <Control-y> sera invoquée, car un événement physique est prioritaire sur un événement virtuel, toutes choses égales par ailleurs. Toutefois si l'utilisateur frappe Meta-Control-y la liaison <<Paste>> sera invoquée, car le modificateur Meta du motif physique associé à la liaison virtuelle est plus spécifique que la séquence <Control-y> de l'événement physique.

Les liaisons d'un événement virtuel doivent être créées avant que l'événement virtuel existe. Bien entendu, l'événement virtuel n'a pas besoin d'êre défini, par exemple sur les plateformes où l'événement virtuel n'aurait pas de sens ou ne pourrait pas être généré.

Lorsque la définition d'un événement virtuel change au moment du run, toutes les fenêtres répondent immédiatement à la nouvelle définition. En partant de l'exemple précédent, si le code suivant est exécuté :

  $entry->bind(ref($entry), '<Control-y>' => undef); 
  $entry->eventAdd('<<Paste>>' => '<Key-F6>');

le comportement changera de deux manières. D'abord, la liaison cachée <<Paste>> va émerger. Frapper Control-y n'invoquera plus la liaison <Control-y>, mais plutôt l'événement virtuel <<Paste>>. Ensuite, la touche F6 invoquera maintenant la liaison <<Paste>>.


VOIR AUSSI

Tk::bind Tk::callbacks


MOTS-CLÉS

event, binding, define, handle, virtual event


TRADUCTION

Jean-Pierre Vidal jeanpierre.vidal@free.fr


RELECTURE Aucune relecture pour le moment.