Tk::event - Facilités diverses pour la gestion d'événements : définir des
événements virtuels, générer des événements
$widget->eventAction(?arg, arg, ...?);
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é.
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.
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>>.
Tk::bind Tk::callbacks
event, binding, define, handle, virtual event
Jean-Pierre Vidal jeanpierre.vidal@free.fr