  NOM
    bind - associe des scripts Tcl aux évènements d'interface graphique
  SYNTAXE
    bind tag
    bind tag séquence
    bind tag séquence script
    bind tag séquence +script
  INTRODUCTION
  MODELES D'EVENEMENTS
  MODIFICATEURS
  TYPES D'EVENEMENTS
    Activate
    Deactivate
    MouseWheel
  SCRIPTS DE LIAISON ET SUBSTITUTIONS
    %%
    %#
    %a
    %b
    %c
    %d
    %f
    %h
    %k
    %m
    %o
    %p
    %s
    %t
    %w
    %x
    %y
    %A
    %B
    %D
    %E
    %K
    %N
    %R
    %S
    %T
    %W
    %X
    %Y
  MULTIPLE MATCHES
  MULTI-EVENT SEQUENCES AND IGNORED EVENTS
  ERREURS
  VOIR EGALEMENT
  MOTS-CLES

### NOM

bind - associe des scripts Tcl avec les évènements d'interface graphique

### SYNTAXE

bind tag
bind tag séquence
bind tag séquence script
bind tag séquence +script

### INTRODUCTION

La commande bind lie les scripts Tcl avec les évènements d'interface graphique. Si les trois arguments sont spécifiés, bind préparera script (un script Tcl) a être évalué chaque fois que l'évènement(s) désigné par séquence se produit dans la fenêtre(s) identifiée par tag. Si script est précédé de ``+'', alors il est ajouté à toute liaison existante pour séquence; autrement script remplace toute liaison existante. Si script est une chaîne vide alors la liaison courante pour séquence est détruite, et séquence n'est pas liée. Dans tous les cas où un argument script est fourni, bindretourne une chaîne vide.

Si séquence est spécifiée sans script, alors le script couramment lié à séquence est renvoyé, ou une chaîne vide est renvoyée s'il n'y a pas de liaison pour séquence. Si ni séquence ni script ne sont spécifiés, alors la valeur de retour est une liste dont les éléments sont toutes les séquences pour lesquelles il existe des liaisons pour tag.

L'argument tag détermine à quelle fenêtre(s) la liaison s'applique. Si tag commence avec un point, comme dans .a.b.c, alors ce doit être le nom de chemin d'une fenêtre; autrement ce peut être une chaîne arbitraire. Chaque fenêtre a une liste de tags associés, et une liaison est appliquée à une fenêtre particulière si son tag est parmi ceux spécifiés pour la fenêtre. Bien que la commande bindtags puisse être employée pour assigner un ensemble arbitraire de tags de liaison à une fenêtre, le tag de liaison par défaut fournit les comportement suivants:

  Si un tag est le nom d'une fenêtre interne la liaison s'applique à cette fenêtre.

  Si le tag est le nom d'une de premier plan la liaison s'applique à la fenêtre de premier plan et à toutes ses fenêtres internes.

  Si le tag est le nom d'un classe de widgets, tel que Button, la liaison s'applique à tous les widgets dans cette classe;

  Si tag a la valeur all, la liaison s'applique à toutes les fenêtres dans l'application.

### MODELES D'EVENEMENTS

L'argument séquence spécifie une séquence d'un ou plusieurs modèles d'évènement, avec un espace optionnel entre les modèles. Chaque modèle d'évènement peut prendre une parmi trois formes. Dans le cas le plus simple c'est un simple caractère ASCII imprimable, tel que a ou [. Le caractère ne peut pas être un espace ou le caractère <. Cette forme de modèle correspond a un évènement KeyPress pour le caractère. La seconde forme de modèle est plus longue mais plus générale. Elle a la syntaxe suivante:

    <modificateur-modificateur-type-detail>

Le modèle d'évènement entier est entouré par des signes inférieur à/supérieur à. Entre les signes on trouve zéro ou plusieurs modificateurs, un type d'évènement, et une information additionelle type, detail) iidentifiant une touche ou un bouton particulier. N'importe quel des champs peut être omis, tant qu'au moins un des type et detail est présent. Les champs doivent être séparés par des espaces ou des tirets.

La troisième forme est utilisée pour spécifier un modèle défini par l'utilisateur, nommé évènement virtuel. Elle a la syntaxe suivante:

    <<NOM>>

Le modèle d'évènement virtuel est entouré par des double signes inférieur à/supérieur à. Entre les signes on trouve le nom de l'évènement virtuel. Les modificateurs, tel que Shift ou Control, , ne peuvent pas être combinés avec un évènement virtuel pour le modificateur. Les liaisons sur un évènement virtuel peuvent être créés avant que l'évènement virtuel soit défini, et si la définition d'un évènement virtuel change dynamiquement, toutes les fenêtres attachées à cet évènement virtuel répondront immédiatement à la nouvelle définition.

### MODIFICATEURS

Les modificateurs consistent en n'importe quelle des valeurs suivantes:

    Control	Mod2, M2
    Shift	Mod3, M3
    Lock	Mod4, M4
    Button1, B1	Mod5, M5
    Button2, B2	Meta, M
    Button3, B3	Alt
    Button4, B4	Double
    Button5, B5	Triple
    Mod1, M1	Quadruple

Si plusieurs valeurs sont listées, séparées par des virgules, les valeurs sont équivalentes. La plupart des modificateurs ont une signification évidente. Par exemple, Button1 exige un appui sur le bouton quand l'évènement se produit. Pour qu'une liaison corresponde à un évènement donné, les modificateurs dans l'évènement doivent inclure tous ceux spécifiés dans le modèle de l'évènement. Un évènement peut aussi contenir des modificateurs supplémentaires non spécifiés dans la liaison. Par exemple, si le bouton 1 est pressé alors que les touches shift et contrôle sont enfoncées, le modèle <Control-Button-1> correspondra à l'évènement, mais <Mod1-Button-1> > non. Si aucuns modificateurs ne sont spécifiés, alors n'importe quelle combinaison de modificateurs peut être présente dans l'évènement.

Meta et M se referent à chacun des modificateurs M1 à M5 associés à la meta touche(s) sur le clavier (touches Meta_R et Meta_L). Si il n'y a pas de meta touches, ou si elles ne sont pas associées à un modificateur, alors Meta et M ne correspondront à aucun évènements. De même, le modificateur Alt se refère à tout modificateur associé à la touche alt sur le clavier (touches Alt_L et Alt_R).

Les modificateurs Double, Triple et Quadruple servent à specifier les double clics et autres évènements répétés. Ils provoquent la répétition d'un modèle d'évènement particulier 2 ou 3 fois, et pose également une condition de temps et d'espace sur la séquence: pour qu'une séquence d'évènements corresponde à un modèle Double, Triple ou Quadruple, tous les évènements doivent se produire dans une durée très courte et sans déplacement de la souris. Par exemple, <Double-Button-1> est équivalent à <Button-1><Button-1> avec la condition supplémentaire de temps et d'espace.

### TYPES D'EVENEMENTS

Le champ typepeut être n'importe quel des types standard d'évènement X, avec quelques abréviations. Le champ type admet également plusieurs types d'évènement X qui ont été ajoutés pour mieux supporter les plateformes Macintosh et Windows. Voir ci-dessous une liste de tous les types valides; quand deux noms apparaissent ensemble, ils sont synonymes.

    Activate	Enter	Map
    ButtonPress, Button	Expose	Motion
    ButtonRelease	FocusIn	MouseWheel
    Circulate	FocusOut	Property
    Colormap	Gravity	Reparent
    Configure	KeyPress, Key	Unmap
    Deactivate	KeyRelease	Visibility
    Destroy	Leave

La plupart des évènements ci-dessus ont les même champs et comportements que les évènements du système X Window. Vous pouvez trouver des descriptions plus détaillées de ces évènements dans n'importe quel livre de programmation X. Plusieurs de ces évènements sont des extensions au système d'évènements X pour supporter des fonctionnalités particulières au plateformes Macintosh et Windows. Nous vous donnons ici un peu plus de détais sur ces évènements. Ils incluent:

Activate

Deactivate
  Ces deux évènements sont envoyés à chaque sous-fenêtres d'une toplevel quand elles changent d'état. En plus de la fenêtre qui détient le focus, les plateformes Macintosh et Windows ont une notion de fenêtre active (qui souvent mais pas toujours détient le focus). Sur Macintosh, les widgets dans la fenêtre active ont un aspect différent des widgets dans une fenêtre inactive. L'évènement Activate est envoyé à toutes les sous-fenêtres d'une toplevel quand elle devient active. De même, l'évènement Deactive est envoyé quand l'état de la fenêtre passe d'actif à inactif. Vous ne pouvez pas utiliser les substitutions pourcentage quand vous liez à ces évènements.

MouseWheel
  Certaines souris sous Windows ont une roulette utilisée pour faire défiler les documents sans utiliser les barres de défilement. Quand la roulette tourne, le système génère des évènements MouseWheel que l'application peut utiliser pour scroller. Comme les évènements Key l'évènement est toujours dirigé vers la fenêtre qui détient le focus. Quand l'évènement est reçu vous pouvez utiliser la substitution %D pour obtenir le champ delta de l'évènement qui est la valeur entière du déplacement de la souris. La plus petite valeur que le système rapporte est définie par l'OS. Sur les machines Windows 95 & 98 cette valeur est au moins de 120 avant d'être signalée. Néanmoins, des périphériques avec des résolution supérieures pourraient apparaitre dans le futur. Le signe de la valeur determine la direction du défilement du widget. Les valeurs positives défileront vers le haut, les négatives vers le bas.

La dernière partie de cette longue spécification est detail. Dans le cas d'un évènement ButtonPress ou ButtonRelease , c'est le numéro du bouton(1-5). Si un numéro de bouton est donné, alors seulement un évènement de ce bouton sera affecté; Si aucun numéro de bouton n'est indiqué, alors un évènement sur n'importe quel bouton correspondra. Note: indiquer un numéro de bouton spécifique est différent d'indiquer un modificateur de bouton; dans le premier cas, il se réfère à l'appui ou au relachement d'un bouton, dans le second il se réfère à un autre bouton qui est déja appuyé quand l'évènement correspondant se produit. Si un numéro de bouton est donné alors type peut être omis: il sera par défaut ButtonPress. Par exemple, le spécificateur <1> est équivalent à <ButtonPress-1>.

Si le type d'évènement est KeyPress ou KeyRelease, alors detail peut être spécifié sous la forme d'une keysym X. Les keysyms sont des spécifications textuelles de touches du clavier; elles incluent tous les caractères alphanumériques ASCII (ex. ``a'' est la keysym du caractère ASCII ``a''), plus des descriptions des caractères non-alphanumériques (``comma'' est la keysym de la virgule ), et des descriptions des touches non-ASCII (``Shift_L'' est la keysm de la touche shift gauche, et ``F1'' est la keysym de la touche de fonction F1 , si elle existe). La liste complète of keysyms n'est pas exposée ici; elle est disponible dans la documentation X et peut varier d'un système à un autre. Si nécessaire, vous pouvez utiliser la notation %K décrite ci-dessous pour afficher le nom de la keysym d'une touche particulière. Si un detail de keysym est donné, alors le champ type peut être omis; il sera par défaut de KeyPress. Par exemple, <Control-comma> est équivalent à <Control-KeyPress-comma>.

### SCRIPTS DE LIAISON ET SUBSTITUTIONS

L'argument script de bind est un script Tcl, qui sera exécuté chaque fois que l'évènement désigné se produit. Command sera exécutée dans le même interpréteur que celui dans lequel la commande bind a été exécutée, et s'exécutera au niveau global (seules les variables globales seront accessibles). Si script contient des caractères% , alors le script ne sera pas exécuté directement. A la place, un nouveau script sera généré en remplacant chaque %, et le caractère suivant, par l'information de l'évènement courant. Le remplacement depend du caractère suivant la %, comme défini dans la liste ci-dessous. A moins qu'autrement indiqué, la chaîne de remplacement est la valeur décimale du champ donné de l'évènement courant. Certaines des substitutions sont seulement valides pour certain types d'évènements; si elles sont utilisées pour d'autres types d'évènements la valeur substituée est indéfinie.

%%
  Remplacée par un seul signe pourcentage.

%#
  Le numéro de la dernière requête client traitée par le serveur (le champ serial de l'évènement). Valide pour tout types d'évènements.

%a
  Le champ above de l'évènement, formaté en nombre hexadécimal. Valide seulement pour les évènementsConfigure .

%b
  Le numéro du bouton pressé ou relaché. Valide seulement pour les évènementsButtonPress et ButtonRelease .

%c
  Le champ count de l'évènement. Valide seulement pour les évènements Expose .

%d
  Le champ detail de l'évènement. Le %d est remplacé par une chaîne identifiant le détail. Pour les évènementsEnter, Leave, FocusIn, et FocusOut , la chaîne sera une des suivantes:

      NotifyAncestor	NotifyNonlinearVirtual
      NotifyDetailNone	NotifyPointer
      NotifyInferior	NotifyPointerRoot
      NotifyNonlinear	NotifyVirtual

  Pour les évènements autre que ceux-ci, la chaîne substituée est indéfinie.

%f
  Le champ focus de l'évènement (0 ou 1). Valide seulement pour les évènementsEnter et Leave .

%h
  Le champ height de l'évènement. Valide pour les évènementsConfigure et Expose .

%k
  Le champ keycode de l'évènement. Valide seulement pour les évènementsKeyPress et KeyRelease .

%m
  Le champ mode de l'évènement. La chaîne substituée est une de NotifyNormal, NotifyGrab, NotifyUngrab, ou NotifyWhileGrabbed. Valide seulement pour les évènementsEnter, FocusIn, FocusOut, et Leave .

%o
  Le champ override_redirect de l'évènement. Valide seulement pour les évènements Map, Reparent, et Configure .

%p
  Le champ place de l'évènement, substituée comme une des chaînes PlaceOnTop ou PlaceOnBottom. Valide seulement pour les évènementsCirculate .

%s
  Le champ state de l'évènement. Pour les évènementsButtonPress, ButtonRelease, Enter, KeyPress, KeyRelease, Leave, et Motion , une chaîne décimale est substituée. Pour Visibility, une des chaînes VisibilityUnobscured, VisibilityPartiallyObscured, et VisibilityFullyObscured est substituée.

%t
  Le champ time de l'évènement. Valide seulement pour les évènements qui contiennent un champtime .

%w
  Le champ width de l'évènement. Valide seulement pour les évènements Configure et Expose .

%x
  Le champ x de l'évènement. Valide seulement pour les évènements contenant un champx .

%y
  Le champ y de l'évènement. Valide seulement pour les évènements contenant un champy .

%A
  Substitue le caractère ASCII correspondant à l'évènement, ou la chaîne vide si l'évènement ne correspond pas à un caractère ASCII (ex. la touche shift a été appuyée). XLookupString accomplit tout le travail de traduction de l'évènement en caractère ASCII . Valide seulement pour les évènementsKeyPress et KeyRelease .

%B
  Le champ border_width from l'évènement. Valide seulement pour les évènements Configure .

%D
  Ceci renvoie la valeur delta d'un évènementMouseWheel. La valeur delta represente les unités de rotation dont la souris à roulette a été déplacée. Sur Windows 95 & 98 la plus petite valeur de delta est 120. Des systèmes futurs pourront supporter des résolution plus èlevées pour delta. Le signe de la valeur represente la direction dans laquelle la roulette a tourné.

%E
  Le champ send_event de l'évènement. Valide pour tous types d'évènement.

%K
  La keysym correspondant à l'évènement, substituée en chaîne textuelle. Valide seulement pour les évènements KeyPress et KeyRelease .

%N
  La keysym correspondant à l'évènement, substituée en nombre décimal. Valide seulement pour les évènementsKeyPress et KeyRelease .

%R
  L'identificateur de fenêtre root de l'évènement. Valide seulement pour évènements contenant un champroot .

%S
  L'identificateur de fenêtre subwindow de l'évènement, formaté comme nombre hexadécimal. Valide seulement pour évènements contenant un champ subwindow .

%T
  Le champ type de l'évènement. Valide pour tout types d'évènement.

%W
  Le nom de chemin de fenêtre auquel l'évènement se rapporte (le champ fenêtre de l'évènement). Valide pour tout types d'évènement.

%X
  Le champ x_root de l'évènement. Si un gestionnaire de fenêtres virtuel-root est utilisé alors la valeur substituée est la coordonnée x correspondante dans la virtuel root. Valide seulement pour les évènements ButtonPress, ButtonRelease, KeyPress, KeyRelease, et Motion .

%Y
  le champ y_root de l'évènement. Si un gestionnaire de fenêtres virtuel-root est utilisé alors la valeur substituée est la coordonnée y correspondante dans la virtuel root. Valide seulement pour les évènements ButtonPress, ButtonRelease, KeyPress, KeyRelease, et Motion .

La chaîne de remplacement induite par % est formatée comme un élément de liste Tcl correct. Ceci signifie qu'il sera entouré d'accolades s'il contient des espaces, ou que les caractères speciaux comme $ et { soient précédés de backslashes. Ceci garantit que la chaîne sera transmise à l'analyseur Tcl quand le script de liaison est evalué. La plupart des remplacements sont des nombres ou des chaînes clairement définies comme Above; pour ces remplacements aucun formatage spécial n'est nécessaire. Le cas le plus commun ou le formatage se produit est lors de la substitution%A . Par exemple, si script est

    insert %A

et que le caractère tapé est un crochet ouvrant, alors le script exécuté sera

    insert \[

Ceci provoquera la reception par insert de la chaîne originale de remplacement (le crochet ouvrant) comme premier argument Si le backslash supplémentaire n'avait été ajouté, Tcl n'aurait pas pu analyser le script correctement.

### CORRESPONDANCES MULTIPLES

Il est possible pour plusieurs bindings de correspondre à un évènement X donné. Si les bindings sont associés à différents tag's, alors chacun des bindings sera exécuté, dans l'ordre. Par défaut, le binding du widget sera exécuté d'abord, suivi par le binding de class, le binding de sa toplevel, et un bindingall . La commande bindtags peut être utilisée pour changer cet ordre pour une fenêtre particulière ou pour associer des tags de binding supplémentaires à la fenêtre.

Les commandes continue et break peuvent être utilisées dans un script de binding pour contrôler le traitement des scripts. Si continue est appelée, alors le binding script courant est interrompu mais Tk will continue le traitement des scripts associés aux autres tag's. Si la commande break est appelée dans un script de binding , alors ce script se termine et aucun autre script sera appelé pour l'évènement.

Si plus d'un binding est associé à un évènement particulier et qu'ils ont les même tag, alors le binding le plus spécifique est choisi et son script est evalué. Les tests suivants sont appliqués, dans l'ordre, pour déterminer laquelle parmi plusieurs séquences est la plus spécifique: (a) un modèle d'évènement qui désigne un bouton ou une touche spécifique est plus spécifique qu'un modèle qui ne désigne rien; (b) une séquence plus longue (en termes de nombre d'évènements associés) est plus spécifique qu'une séquence courte; (c) si les modificateurs spécifiés dans un modèle sont un sous-ensemble des modificateurs d'un autre modèle, alors le modèle avec le plus de modificateurs est plus spécifique. (d) un évènement virtuel dont le modèle physique correspond à la séquence est moins spécifique que le même modèle physique qui n'est pas associés à un évènement virtuel . (e) si une séquence donnée correspond à deux ou plus évènements virtuels, un des évènements virtuels sera choisi, mais l'ordre est indéfini.

Si les séquences correspondantes contiennet plus d'un évènement, alors les tests (c)-(e) sont appliqués dans l'ordre du plus recent évènement au plus ancien. Si ces tests échouent à déterminer un gagnant, alors la séquence la plus récemment déclarée l'emporte.

S'il y a deux (ou plus) évènements virtuels déclenchés par la même séquence, et qu'ils sont liés au même tag de fenêtre, alors seulement un des évènements virtuels sera déclenché, et il sera choisi au hasard:

    event add <<Paste>> <Control-y>
    event add <<Paste>> <Button-2>
    event add <<Scroll>> <Button-2>
    bind Entry <<Paste>> {puts Paste}
    bind Entry <<Scroll>> {puts Scroll}

Si l'utilisateur tape Control-y, le binding<<Paste>> sera appelé, mais si l'utilisateur presse le bouton2 alors un des deux bindings <<Paste>> ou the <<Scroll>> sera appelé, mais celui qui sera appelé exactement est indéfini.

Si un évènement X n'est associé à aucun binding existant , alors l'évènement est ignoré. Un évènement non lié n'est pas considéré comme une erreur.

### SEQUENCES MULTI-EVENEMENT ET EVENEMENTS IGNORES

Quand une séquence spécifiée dans une commande bind contient plus d'un modèle d'évènement, alors son script est exécuté quand bien même les évènements récents (jusqu'à et incluant l'évènement courant ) correspondent à la séquence donnée. Ceci signifie, par exemple, que si le bouton1 est cliqué répétitivement, la séquence <Double-ButtonPress-1> correspondra à chaque clic sauf le premier. Si des évènements étrangers qui pourraient empêcher la correpondance se produisent au milieu d'une séquence d'évènement alors les évènements étrangers sont ignoré à moins que ce soient des évènements KeyPress ou ButtonPress. Par exemple, <Double-ButtonPress-1> correspondra à une séquence d'appui sur le bouton1, même s'il y a des évènements ButtonRelease (et probablement des évènements Motion) entre les évènements ButtonPress . De plus, un évènement KeyPress peut être précédé par n'importe quel nombre d'évènements KeyPress pour les touches modificatrices sans que les ces touches modificatrices nuisent à la correspondance. Par exemple, la séquence d'évènement aB correspondra à un appui sur la touche a, le relachement de la touche a, un appui sur la touche Shift, et un appui sur la touche b : l'appui sur la toucheShift est ignoré parceque c'est une touche modificatrice. Finalement, si plusieurs évènements Motion se produisent, seul le dernier est utilisé pour la correspondance avec des séquences de binding .

### ERREURS

Si une erreur se produit pendant l'exécution du script pour un binding alors le mécanisme bgerror est utilisé pour rapporter l'erreur. La commande bgerror sera exécutée au niveau global (en dehors du contexte de toute procedure Tcl).

### VOIR EGALEMENT

bgerror, keysyms

### MOTS-CLES

form, manual

    Copyright © 1990 The Regents of the University of California.
    Copyright © 1994-1996 Sun Microsystems, Inc.
    Copyright © 1998 by Scriptics Corporation.
    Copyright © 1995-1997 Roger E. Critchlow Jr.

Copyright © 2003 - Le Portail Tcl/Tk Francophone.