Hex Artifact Content

Artifact 899df738ec40531947b63d4d98a57505e1b42ec1:


0000: 2f 2a 20 0a 20 2a 20 74 6b 42 69 6e 64 2e 63 20  /* . * tkBind.c 
0010: 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a 20 2a 09 54  (CTk) --. *. *.T
0020: 68 69 73 20 66 69 6c 65 20 70 72 6f 76 69 64 65  his file provide
0030: 73 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 61  s procedures tha
0040: 74 20 61 73 73 6f 63 69 61 74 65 20 54 63 6c 20  t associate Tcl 
0050: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 09 77 69 74 68  commands. *.with
0060: 20 58 20 65 76 65 6e 74 73 20 6f 72 20 73 65 71   X events or seq
0070: 75 65 6e 63 65 73 20 6f 66 20 58 20 65 76 65 6e  uences of X even
0080: 74 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69  ts.. *. * Copyri
0090: 67 68 74 20 28 63 29 20 31 39 38 39 2d 31 39 39  ght (c) 1989-199
00a0: 34 20 54 68 65 20 52 65 67 65 6e 74 73 20 6f 66  4 The Regents of
00b0: 20 74 68 65 20 55 6e 69 76 65 72 73 69 74 79 20   the University 
00c0: 6f 66 20 43 61 6c 69 66 6f 72 6e 69 61 2e 0a 20  of California.. 
00d0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  * Copyright (c) 
00e0: 31 39 39 34 2d 31 39 39 35 20 53 75 6e 20 4d 69  1994-1995 Sun Mi
00f0: 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e  crosystems, Inc.
0100: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63  . * Copyright (c
0110: 29 20 31 39 39 35 20 43 6c 65 76 65 6c 61 6e 64  ) 1995 Cleveland
0120: 20 43 6c 69 6e 69 63 20 46 6f 75 6e 64 61 74 69   Clinic Foundati
0130: 6f 6e 0a 20 2a 0a 20 2a 20 53 65 65 20 74 68 65  on. *. * See the
0140: 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 2e 74   file "license.t
0150: 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f 72 6d  erms" for inform
0160: 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 20 61  ation on usage a
0170: 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 69 6f  nd redistributio
0180: 6e 0a 20 2a 20 6f 66 20 74 68 69 73 20 66 69 6c  n. * of this fil
0190: 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 49 53  e, and for a DIS
01a0: 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c 20 57  CLAIMER OF ALL W
01b0: 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 0a 20 2a  ARRANTIES.. *. *
01c0: 20 40 28 23 29 20 24 49 64 3a 20 63 74 6b 2e 73   @(#) $Id: ctk.s
01d0: 68 61 72 2c 76 20 31 2e 35 30 20 31 39 39 36 2f  har,v 1.50 1996/
01e0: 30 31 2f 31 35 20 31 34 3a 34 37 3a 31 36 20 61  01/15 14:47:16 a
01f0: 6e 64 72 65 77 6d 20 45 78 70 20 61 6e 64 72 65  ndrewm Exp andre
0200: 77 6d 20 24 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  wm $. */..#inclu
0210: 64 65 20 22 74 6b 50 6f 72 74 2e 68 22 0a 23 69  de "tkPort.h".#i
0220: 6e 63 6c 75 64 65 20 22 74 6b 49 6e 74 2e 68 22  nclude "tkInt.h"
0230: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 43 55 52  .#ifdef HAVE_CUR
0240: 53 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  SES_H.#  include
0250: 20 3c 63 75 72 73 65 73 2e 68 3e 0a 23 65 6c 69   <curses.h>.#eli
0260: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 43  f defined(HAVE_C
0270: 55 52 53 45 53 5f 43 55 52 53 45 53 5f 48 29 0a  URSES_CURSES_H).
0280: 23 20 20 69 6e 63 6c 75 64 65 20 3c 63 75 72 73  #  include <curs
0290: 65 73 2f 63 75 72 73 65 73 2e 68 3e 0a 23 65 6c  es/curses.h>.#el
02a0: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
02b0: 43 55 52 53 45 53 5f 4e 43 55 52 53 45 53 5f 48  CURSES_NCURSES_H
02c0: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 63 75  ).#  include <cu
02d0: 72 73 65 73 2f 6e 63 75 72 73 65 73 2e 68 3e 0a  rses/ncurses.h>.
02e0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
02f0: 56 45 5f 4e 43 55 52 53 45 53 5f 4e 43 55 52 53  VE_NCURSES_NCURS
0300: 45 53 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64 65  ES_H).#  include
0310: 20 3c 6e 63 75 72 73 65 73 2f 6e 63 75 72 73 65   <ncurses/ncurse
0320: 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  s.h>.#endif../*.
0330: 20 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65   * The structure
0340: 20 62 65 6c 6f 77 20 72 65 70 72 65 73 65 6e 74   below represent
0350: 73 20 61 20 62 69 6e 64 69 6e 67 20 74 61 62 6c  s a binding tabl
0360: 65 2e 20 20 41 20 62 69 6e 64 69 6e 67 20 74 61  e.  A binding ta
0370: 62 6c 65 0a 20 2a 20 72 65 70 72 65 73 65 6e 74  ble. * represent
0380: 73 20 61 20 64 6f 6d 61 69 6e 20 69 6e 20 77 68  s a domain in wh
0390: 69 63 68 20 65 76 65 6e 74 20 62 69 6e 64 69 6e  ich event bindin
03a0: 67 73 20 6d 61 79 20 6f 63 63 75 72 2e 20 20 49  gs may occur.  I
03b0: 74 20 69 6e 63 6c 75 64 65 73 0a 20 2a 20 61 20  t includes. * a 
03c0: 73 70 61 63 65 20 6f 66 20 6f 62 6a 65 63 74 73  space of objects
03d0: 20 72 65 6c 61 74 69 76 65 20 74 6f 20 77 68 69   relative to whi
03e0: 63 68 20 65 76 65 6e 74 73 20 6f 63 63 75 72 20  ch events occur 
03f0: 28 75 73 75 61 6c 6c 79 20 77 69 6e 64 6f 77 73  (usually windows
0400: 2c 0a 20 2a 20 62 75 74 20 6e 6f 74 20 61 6c 77  ,. * but not alw
0410: 61 79 73 29 2c 20 61 20 68 69 73 74 6f 72 79 20  ays), a history 
0420: 6f 66 20 72 65 63 65 6e 74 20 65 76 65 6e 74 73  of recent events
0430: 20 69 6e 20 74 68 65 20 64 6f 6d 61 69 6e 2c 20   in the domain, 
0440: 61 6e 64 0a 20 2a 20 61 20 73 65 74 20 6f 66 20  and. * a set of 
0450: 6d 61 70 70 69 6e 67 73 20 74 68 61 74 20 61 73  mappings that as
0460: 73 6f 63 69 61 74 65 20 70 61 72 74 69 63 75 6c  sociate particul
0470: 61 72 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 73 20  ar Tcl commands 
0480: 77 69 74 68 20 73 65 71 75 65 6e 63 65 73 0a 20  with sequences. 
0490: 2a 20 6f 66 20 65 76 65 6e 74 73 20 69 6e 20 74  * of events in t
04a0: 68 65 20 64 6f 6d 61 69 6e 2e 20 20 4d 75 6c 74  he domain.  Mult
04b0: 69 70 6c 65 20 62 69 6e 64 69 6e 67 20 74 61 62  iple binding tab
04c0: 6c 65 73 20 6d 61 79 20 65 78 69 73 74 20 61 74  les may exist at
04d0: 20 6f 6e 63 65 2c 0a 20 2a 20 65 69 74 68 65 72   once,. * either
04e0: 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61   because there a
04f0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 61 70 70 6c  re multiple appl
0500: 69 63 61 74 69 6f 6e 73 20 6f 70 65 6e 2c 20 6f  ications open, o
0510: 72 20 62 65 63 61 75 73 65 20 74 68 65 72 65 0a  r because there.
0520: 20 2a 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20   * are multiple 
0530: 64 6f 6d 61 69 6e 73 20 77 69 74 68 69 6e 20 61  domains within a
0540: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 77 69  n application wi
0550: 74 68 20 73 65 70 61 72 61 74 65 20 65 76 65 6e  th separate even
0560: 74 0a 20 2a 20 62 69 6e 64 69 6e 67 73 20 66 6f  t. * bindings fo
0570: 72 20 65 61 63 68 20 28 66 6f 72 20 65 78 61 6d  r each (for exam
0580: 70 6c 65 2c 20 65 61 63 68 20 63 61 6e 76 61 73  ple, each canvas
0590: 20 77 69 64 67 65 74 20 68 61 73 20 61 20 73 65   widget has a se
05a0: 70 61 72 61 74 65 0a 20 2a 20 62 69 6e 64 69 6e  parate. * bindin
05b0: 67 20 74 61 62 6c 65 20 66 6f 72 20 61 73 73 6f  g table for asso
05c0: 63 69 61 74 69 6e 67 20 65 76 65 6e 74 73 20 77  ciating events w
05d0: 69 74 68 20 74 68 65 20 69 74 65 6d 73 20 69 6e  ith the items in
05e0: 20 74 68 65 20 63 61 6e 76 61 73 29 2e 0a 20 2a   the canvas).. *
05f0: 0a 20 2a 20 4e 6f 74 65 3a 20 69 74 20 69 73 20  . * Note: it is 
0600: 70 72 6f 62 61 62 6c 79 20 61 20 62 61 64 20 69  probably a bad i
0610: 64 65 61 20 74 6f 20 72 65 64 75 63 65 20 45 56  dea to reduce EV
0620: 45 4e 54 5f 42 55 46 46 45 52 5f 53 49 5a 45 20  ENT_BUFFER_SIZE 
0630: 6d 75 63 68 0a 20 2a 20 62 65 6c 6f 77 20 33 30  much. * below 30
0640: 2e 20 20 54 6f 20 73 65 65 20 74 68 69 73 2c 20  .  To see this, 
0650: 63 6f 6e 73 69 64 65 72 20 61 20 74 72 69 70 6c  consider a tripl
0660: 65 20 6d 6f 75 73 65 20 62 75 74 74 6f 6e 20 63  e mouse button c
0670: 6c 69 63 6b 20 77 68 69 6c 65 0a 20 2a 20 74 68  lick while. * th
0680: 65 20 53 68 69 66 74 20 6b 65 79 20 69 73 20 64  e Shift key is d
0690: 6f 77 6e 20 28 61 6e 64 20 61 75 74 6f 2d 72 65  own (and auto-re
06a0: 70 65 61 74 69 6e 67 29 2e 20 20 54 68 65 72 65  peating).  There
06b0: 20 6d 61 79 20 62 65 20 61 73 20 6d 61 6e 79 0a   may be as many.
06c0: 20 2a 20 61 73 20 33 20 61 75 74 6f 2d 72 65 70   * as 3 auto-rep
06d0: 65 61 74 20 65 76 65 6e 74 73 20 61 66 74 65 72  eat events after
06e0: 20 65 61 63 68 20 6d 6f 75 73 65 20 62 75 74 74   each mouse butt
06f0: 6f 6e 20 70 72 65 73 73 20 6f 72 20 72 65 6c 65  on press or rele
0700: 61 73 65 0a 20 2a 20 28 73 65 65 20 74 68 65 20  ase. * (see the 
0710: 66 69 72 73 74 20 6c 61 72 67 65 20 63 6f 6d 6d  first large comm
0720: 65 6e 74 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ent block within
0730: 20 54 6b 5f 42 69 6e 64 45 76 65 6e 74 20 66 6f   Tk_BindEvent fo
0740: 72 20 6d 6f 72 65 20 6f 6e 0a 20 2a 20 74 68 69  r more on. * thi
0750: 73 29 2c 20 66 6f 72 20 61 20 74 6f 74 61 6c 20  s), for a total 
0760: 6f 66 20 32 30 20 65 76 65 6e 74 73 20 74 6f 20  of 20 events to 
0770: 63 6f 76 65 72 20 74 68 65 20 74 68 72 65 65 20  cover the three 
0780: 62 75 74 74 6f 6e 20 70 72 65 73 73 65 73 0a 20  button presses. 
0790: 2a 20 61 6e 64 20 74 77 6f 20 69 6e 74 65 72 76  * and two interv
07a0: 65 6e 69 6e 67 20 72 65 6c 65 61 73 65 73 2e 20  ening releases. 
07b0: 20 49 66 20 79 6f 75 20 72 65 64 75 63 65 20 45   If you reduce E
07c0: 56 45 4e 54 5f 42 55 46 46 45 52 5f 53 49 5a 45  VENT_BUFFER_SIZE
07d0: 20 74 6f 6f 0a 20 2a 20 6d 75 63 68 2c 20 73 68   too. * much, sh
07e0: 69 66 74 20 6d 75 6c 74 69 2d 63 6c 69 63 6b 73  ift multi-clicks
07f0: 20 77 69 6c 6c 20 62 65 20 6c 6f 73 74 2e 0a 20   will be lost.. 
0800: 2a 20 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  * . */..#define 
0810: 45 56 45 4e 54 5f 42 55 46 46 45 52 5f 53 49 5a  EVENT_BUFFER_SIZ
0820: 45 20 33 30 0a 74 79 70 65 64 65 66 20 73 74 72  E 30.typedef str
0830: 75 63 74 20 42 69 6e 64 69 6e 67 54 61 62 6c 65  uct BindingTable
0840: 20 7b 0a 20 20 20 20 58 45 76 65 6e 74 20 65 76   {.    XEvent ev
0850: 65 6e 74 52 69 6e 67 5b 45 56 45 4e 54 5f 42 55  entRing[EVENT_BU
0860: 46 46 45 52 5f 53 49 5a 45 5d 3b 2f 2a 20 43 69  FFER_SIZE];/* Ci
0870: 72 63 75 6c 61 72 20 71 75 65 75 65 20 6f 66 20  rcular queue of 
0880: 72 65 63 65 6e 74 20 65 76 65 6e 74 73 0a 09 09  recent events...
0890: 09 09 09 20 2a 20 28 68 69 67 68 65 72 20 69 6e  ... * (higher in
08a0: 64 69 63 65 73 20 61 72 65 20 66 6f 72 20 6d 6f  dices are for mo
08b0: 72 65 20 72 65 63 65 6e 74 0a 09 09 09 09 09 20  re recent...... 
08c0: 2a 20 65 76 65 6e 74 73 29 2e 20 2a 2f 0a 20 20  * events). */.  
08d0: 20 20 69 6e 74 20 64 65 74 61 69 6c 52 69 6e 67    int detailRing
08e0: 5b 45 56 45 4e 54 5f 42 55 46 46 45 52 5f 53 49  [EVENT_BUFFER_SI
08f0: 5a 45 5d 3b 09 2f 2a 20 22 44 65 74 61 69 6c 22  ZE];./* "Detail"
0900: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 6b 65   information (ke
0910: 79 53 79 6d 20 6f 72 0a 09 09 09 09 09 20 2a 20  ySym or...... * 
0920: 62 75 74 74 6f 6e 20 6f 72 20 30 29 20 66 6f 72  button or 0) for
0930: 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 09   each entry in..
0940: 09 09 09 09 20 2a 20 65 76 65 6e 74 52 69 6e 67  .... * eventRing
0950: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 75 72  . */.    int cur
0960: 45 76 65 6e 74 3b 09 09 09 2f 2a 20 49 6e 64 65  Event;.../* Inde
0970: 78 20 69 6e 20 65 76 65 6e 74 52 69 6e 67 20 6f  x in eventRing o
0980: 66 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 09 09  f most recent...
0990: 09 09 09 20 2a 20 65 76 65 6e 74 2e 20 20 4e 65  ... * event.  Ne
09a0: 77 65 72 20 65 76 65 6e 74 73 20 68 61 76 65 20  wer events have 
09b0: 68 69 67 68 65 72 0a 09 09 09 09 09 20 2a 20 69  higher...... * i
09c0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 54  ndices. */.    T
09d0: 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 70 61 74  cl_HashTable pat
09e0: 74 65 72 6e 54 61 62 6c 65 3b 09 09 2f 2a 20 55  ternTable;../* U
09f0: 73 65 64 20 74 6f 20 6d 61 70 20 66 72 6f 6d 20  sed to map from 
0a00: 61 6e 20 65 76 65 6e 74 20 74 6f 20 61 20 6c 69  an event to a li
0a10: 73 74 0a 09 09 09 09 09 20 2a 20 6f 66 20 70 61  st...... * of pa
0a20: 74 74 65 72 6e 73 20 74 68 61 74 20 6d 61 79 20  tterns that may 
0a30: 6d 61 74 63 68 20 74 68 61 74 0a 09 09 09 09 09  match that......
0a40: 20 2a 20 65 76 65 6e 74 2e 20 20 4b 65 79 73 20   * event.  Keys 
0a50: 61 72 65 20 50 61 74 74 65 72 6e 54 61 62 6c 65  are PatternTable
0a60: 4b 65 79 0a 09 09 09 09 09 20 2a 20 73 74 72 75  Key...... * stru
0a70: 63 74 73 2c 20 76 61 6c 75 65 73 20 61 72 65 20  cts, values are 
0a80: 28 50 61 74 53 65 71 20 2a 29 2e 20 2a 2f 0a 20  (PatSeq *). */. 
0a90: 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65     Tcl_HashTable
0aa0: 20 6f 62 6a 65 63 74 54 61 62 6c 65 3b 09 09 2f   objectTable;../
0ab0: 2a 20 55 73 65 64 20 74 6f 20 6d 61 70 20 66 72  * Used to map fr
0ac0: 6f 6d 20 61 6e 20 6f 62 6a 65 63 74 20 74 6f 20  om an object to 
0ad0: 61 20 6c 69 73 74 0a 09 09 09 09 09 20 2a 20 6f  a list...... * o
0ae0: 66 20 70 61 74 74 65 72 6e 73 20 61 73 73 6f 63  f patterns assoc
0af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 61 74 0a  iated with that.
0b00: 09 09 09 09 09 20 2a 20 6f 62 6a 65 63 74 2e 20  ..... * object. 
0b10: 20 4b 65 79 73 20 61 72 65 20 43 6c 69 65 6e 74   Keys are Client
0b20: 44 61 74 61 2c 0a 09 09 09 09 09 20 2a 20 76 61  Data,...... * va
0b30: 6c 75 65 73 20 61 72 65 20 28 50 61 74 53 65 71  lues are (PatSeq
0b40: 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   *). */.    Tcl_
0b50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09  Interp *interp;.
0b60: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72  ../* Interpreter
0b70: 20 69 6e 20 77 68 69 63 68 20 63 6f 6d 6d 61 6e   in which comman
0b80: 64 73 20 61 72 65 0a 09 09 09 09 09 20 2a 20 65  ds are...... * e
0b90: 78 65 63 75 74 65 64 2e 20 2a 2f 0a 7d 20 42 69  xecuted. */.} Bi
0ba0: 6e 64 69 6e 67 54 61 62 6c 65 3b 0a 0a 2f 2a 0a  ndingTable;../*.
0bb0: 20 2a 20 53 74 72 75 63 74 75 72 65 73 20 6f 66   * Structures of
0bc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
0bd0: 6f 72 6d 20 61 72 65 20 75 73 65 64 20 61 73 20  orm are used as 
0be0: 6b 65 79 73 20 69 6e 20 74 68 65 20 70 61 74 74  keys in the patt
0bf0: 65 72 6e 54 61 62 6c 65 0a 20 2a 20 66 6f 72 20  ernTable. * for 
0c00: 61 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65 3a  a binding table:
0c10: 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74  . */..typedef st
0c20: 72 75 63 74 20 50 61 74 74 65 72 6e 54 61 62 6c  ruct PatternTabl
0c30: 65 4b 65 79 20 7b 0a 20 20 20 20 43 6c 69 65 6e  eKey {.    Clien
0c40: 74 44 61 74 61 20 6f 62 6a 65 63 74 3b 09 09 2f  tData object;../
0c50: 2a 20 49 64 65 6e 74 69 66 69 65 73 20 6f 62 6a  * Identifies obj
0c60: 65 63 74 20 28 6f 72 20 63 6c 61 73 73 20 6f 66  ect (or class of
0c70: 20 6f 62 6a 65 63 74 73 29 0a 09 09 09 09 20 2a   objects)..... *
0c80: 20 72 65 6c 61 74 69 76 65 20 74 6f 20 77 68 69   relative to whi
0c90: 63 68 20 65 76 65 6e 74 20 6f 63 63 75 72 72 65  ch event occurre
0ca0: 64 2e 20 20 46 6f 72 0a 09 09 09 09 20 2a 20 65  d.  For..... * e
0cb0: 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 77  xample, in the w
0cc0: 69 64 67 65 74 20 62 69 6e 64 69 6e 67 20 74 61  idget binding ta
0cd0: 62 6c 65 20 66 6f 72 0a 09 09 09 09 20 2a 20 61  ble for..... * a
0ce0: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 68  n application th
0cf0: 69 73 20 69 73 20 74 68 65 20 70 61 74 68 20 6e  is is the path n
0d00: 61 6d 65 20 6f 66 0a 09 09 09 09 20 2a 20 61 20  ame of..... * a 
0d10: 77 69 64 67 65 74 2c 20 6f 72 20 61 20 77 69 64  widget, or a wid
0d20: 67 65 74 20 63 6c 61 73 73 2c 20 6f 72 20 22 61  get class, or "a
0d30: 6c 6c 22 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll". */.    int 
0d40: 74 79 70 65 3b 09 09 09 2f 2a 20 54 79 70 65 20  type;.../* Type 
0d50: 6f 66 20 65 76 65 6e 74 20 28 66 72 6f 6d 20 58  of event (from X
0d60: 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 65  ). */.    int de
0d70: 74 61 69 6c 3b 09 09 09 2f 2a 20 41 64 64 69 74  tail;.../* Addit
0d80: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
0d90: 6e 2c 20 73 75 63 68 20 61 73 0a 09 09 09 09 20  n, such as..... 
0da0: 2a 20 6b 65 79 73 79 6d 20 6f 72 20 62 75 74 74  * keysym or butt
0db0: 6f 6e 2c 20 6f 72 20 30 20 69 66 20 6e 6f 74 68  on, or 0 if noth
0dc0: 69 6e 67 0a 09 09 09 09 20 2a 20 61 64 64 69 74  ing..... * addit
0dd0: 69 6f 6e 61 6c 2e 2a 2f 0a 7d 20 50 61 74 74 65  ional.*/.} Patte
0de0: 72 6e 54 61 62 6c 65 4b 65 79 3b 0a 0a 2f 2a 0a  rnTableKey;../*.
0df0: 20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67   * The following
0e00: 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
0e10: 65 73 20 61 20 70 61 74 74 65 72 6e 2c 20 77 68  es a pattern, wh
0e20: 69 63 68 20 69 73 20 6d 61 74 63 68 65 64 0a 20  ich is matched. 
0e30: 2a 20 61 67 61 69 6e 73 74 20 58 20 65 76 65 6e  * against X even
0e40: 74 73 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ts as part of th
0e50: 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6e  e process of con
0e60: 76 65 72 74 69 6e 67 20 58 20 65 76 65 6e 74 73  verting X events
0e70: 0a 20 2a 20 69 6e 74 6f 20 54 63 6c 20 63 6f 6d  . * into Tcl com
0e80: 6d 61 6e 64 73 2e 0a 20 2a 2f 0a 0a 74 79 70 65  mands.. */..type
0e90: 64 65 66 20 73 74 72 75 63 74 20 50 61 74 74 65  def struct Patte
0ea0: 72 6e 20 7b 0a 20 20 20 20 69 6e 74 20 65 76 65  rn {.    int eve
0eb0: 6e 74 54 79 70 65 3b 09 09 2f 2a 20 54 79 70 65  ntType;../* Type
0ec0: 20 6f 66 20 58 20 65 76 65 6e 74 2c 20 65 2e 67   of X event, e.g
0ed0: 2e 20 42 75 74 74 6f 6e 50 72 65 73 73 2e 20 2a  . ButtonPress. *
0ee0: 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 4d 6f  /.    int needMo
0ef0: 64 73 3b 09 09 2f 2a 20 4d 61 73 6b 20 6f 66 20  ds;../* Mask of 
0f00: 6d 6f 64 69 66 69 65 72 73 20 74 68 61 74 20 6d  modifiers that m
0f10: 75 73 74 20 62 65 0a 09 09 09 09 20 2a 20 70 72  ust be..... * pr
0f20: 65 73 65 6e 74 20 28 30 20 6d 65 61 6e 73 20 6e  esent (0 means n
0f30: 6f 20 6d 6f 64 69 66 69 65 72 73 20 61 72 65 0a  o modifiers are.
0f40: 09 09 09 09 20 2a 20 72 65 71 75 69 72 65 64 29  .... * required)
0f50: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 65 74  . */.    int det
0f60: 61 69 6c 3b 09 09 09 2f 2a 20 41 64 64 69 74 69  ail;.../* Additi
0f70: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
0f80: 20 74 68 61 74 20 6d 75 73 74 0a 09 09 09 09 20   that must..... 
0f90: 2a 20 6d 61 74 63 68 20 65 76 65 6e 74 2e 20 20  * match event.  
0fa0: 4e 6f 72 6d 61 6c 6c 79 20 74 68 69 73 20 69 73  Normally this is
0fb0: 20 30 2c 0a 09 09 09 09 20 2a 20 6d 65 61 6e 69   0,..... * meani
0fc0: 6e 67 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c  ng no additional
0fd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 09 09 09   information....
0fe0: 09 20 2a 20 6d 75 73 74 20 6d 61 74 63 68 2e 20  . * must match. 
0ff0: 20 46 6f 72 20 4b 65 79 50 72 65 73 73 20 61 6e   For KeyPress an
1000: 64 0a 09 09 09 09 20 2a 20 4b 65 79 52 65 6c 65  d..... * KeyRele
1010: 61 73 65 20 65 76 65 6e 74 73 2c 20 61 20 6b 65  ase events, a ke
1020: 79 53 79 6d 20 6d 61 79 0a 09 09 09 09 20 2a 20  ySym may..... * 
1030: 62 65 20 73 70 65 63 69 66 69 65 64 20 74 6f 20  be specified to 
1040: 73 65 6c 65 63 74 20 61 0a 09 09 09 09 20 2a 20  select a..... * 
1050: 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 73 74  particular keyst
1060: 72 6f 6b 65 20 28 30 20 6d 65 61 6e 73 20 61 6e  roke (0 means an
1070: 79 0a 09 09 09 09 20 2a 20 6b 65 79 73 74 72 6f  y..... * keystro
1080: 6b 65 73 29 2e 20 20 46 6f 72 20 62 75 74 74 6f  kes).  For butto
1090: 6e 20 65 76 65 6e 74 73 2c 0a 09 09 09 09 20 2a  n events,..... *
10a0: 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
10b0: 74 69 63 75 6c 61 72 20 62 75 74 74 6f 6e 20 28  ticular button (
10c0: 30 0a 09 09 09 09 20 2a 20 6d 65 61 6e 73 20 61  0..... * means a
10d0: 6e 79 20 62 75 74 74 6f 6e 73 20 61 72 65 20 4f  ny buttons are O
10e0: 4b 29 2e 20 2a 2f 0a 7d 20 50 61 74 74 65 72 6e  K). */.} Pattern
10f0: 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 74 72  ;../*. * The str
1100: 75 63 74 75 72 65 20 62 65 6c 6f 77 20 64 65 66  ucture below def
1110: 69 6e 65 73 20 61 20 70 61 74 74 65 72 6e 20 73  ines a pattern s
1120: 65 71 75 65 6e 63 65 2c 20 77 68 69 63 68 20 63  equence, which c
1130: 6f 6e 73 69 73 74 73 0a 20 2a 20 6f 66 20 6f 6e  onsists. * of on
1140: 65 20 6f 72 20 6d 6f 72 65 20 70 61 74 74 65 72  e or more patter
1150: 6e 73 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  ns.  In order to
1160: 20 74 72 69 67 67 65 72 2c 20 61 20 70 61 74 74   trigger, a patt
1170: 65 72 6e 0a 20 2a 20 73 65 71 75 65 6e 63 65 20  ern. * sequence 
1180: 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 6d  must match the m
1190: 6f 73 74 20 72 65 63 65 6e 74 20 58 20 65 76 65  ost recent X eve
11a0: 6e 74 73 20 28 66 69 72 73 74 20 70 61 74 74 65  nts (first patte
11b0: 72 6e 0a 20 2a 20 74 6f 20 6d 6f 73 74 20 72 65  rn. * to most re
11c0: 63 65 6e 74 20 65 76 65 6e 74 2c 20 6e 65 78 74  cent event, next
11d0: 20 70 61 74 74 65 72 6e 20 74 6f 20 6e 65 78 74   pattern to next
11e0: 20 65 76 65 6e 74 2c 20 61 6e 64 20 73 6f 20 6f   event, and so o
11f0: 6e 29 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64 65 66  n).. */..typedef
1200: 20 73 74 72 75 63 74 20 50 61 74 53 65 71 20 7b   struct PatSeq {
1210: 0a 20 20 20 20 69 6e 74 20 6e 75 6d 50 61 74 73  .    int numPats
1220: 3b 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;../* Number of 
1230: 70 61 74 74 65 72 6e 73 20 69 6e 20 73 65 71 75  patterns in sequ
1240: 65 6e 63 65 0a 09 09 09 09 20 2a 20 28 75 73 75  ence..... * (usu
1250: 61 6c 6c 79 20 31 29 2e 20 2a 2f 0a 20 20 20 20  ally 1). */.    
1260: 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 3b 09 09  char *command;..
1270: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e  /* Command to in
1280: 76 6f 6b 65 20 77 68 65 6e 20 74 68 69 73 0a 09  voke when this..
1290: 09 09 09 20 2a 20 70 61 74 74 65 72 6e 20 73 65  ... * pattern se
12a0: 71 75 65 6e 63 65 20 6d 61 74 63 68 65 73 20 28  quence matches (
12b0: 6d 61 6c 6c 6f 63 2d 65 64 29 2e 20 2a 2f 0a 20  malloc-ed). */. 
12c0: 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 09 09 09     int flags;...
12d0: 2f 2a 20 4d 69 73 63 65 6c 6c 61 6e 65 6f 75 73  /* Miscellaneous
12e0: 20 66 6c 61 67 20 76 61 6c 75 65 73 3b 20 20 73   flag values;  s
12f0: 65 65 0a 09 09 09 09 20 2a 20 62 65 6c 6f 77 20  ee..... * below 
1300: 66 6f 72 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  for definitions.
1310: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 50   */.    struct P
1320: 61 74 53 65 71 20 2a 6e 65 78 74 53 65 71 50 74  atSeq *nextSeqPt
1330: 72 3b 0a 09 09 09 09 2f 2a 20 4e 65 78 74 20 69  r;...../* Next i
1340: 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  n list of all pa
1350: 74 74 65 72 6e 0a 09 09 09 09 20 2a 20 73 65 71  ttern..... * seq
1360: 75 65 6e 63 65 73 20 74 68 61 74 20 68 61 76 65  uences that have
1370: 20 74 68 65 20 73 61 6d 65 0a 09 09 09 09 20 2a   the same..... *
1380: 20 69 6e 69 74 69 61 6c 20 70 61 74 74 65 72 6e   initial pattern
1390: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 0a 09 09  .  NULL means...
13a0: 09 09 20 2a 20 65 6e 64 20 6f 66 20 6c 69 73 74  .. * end of list
13b0: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 48 61 73  . */.    Tcl_Has
13c0: 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 09 2f 2a  hEntry *hPtr;./*
13d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 68 61 73 68   Pointer to hash
13e0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 6f 72   table entry for
13f0: 0a 09 09 09 09 20 2a 20 74 68 65 20 69 6e 69 74  ..... * the init
1400: 69 61 6c 20 70 61 74 74 65 72 6e 2e 20 20 54 68  ial pattern.  Th
1410: 69 73 20 69 73 20 74 68 65 0a 09 09 09 09 20 2a  is is the..... *
1420: 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73   head of the lis
1430: 74 20 6f 66 20 77 68 69 63 68 20 6e 65 78 74 53  t of which nextS
1440: 65 71 50 74 72 0a 09 09 09 09 20 2a 20 66 6f 72  eqPtr..... * for
1450: 6d 73 20 61 20 70 61 72 74 2e 20 2a 2f 0a 20 20  ms a part. */.  
1460: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 6f 62 6a    ClientData obj
1470: 65 63 74 3b 09 09 2f 2a 20 49 64 65 6e 74 69 66  ect;../* Identif
1480: 69 65 73 20 6f 62 6a 65 63 74 20 77 69 74 68 20  ies object with 
1490: 77 68 69 63 68 20 65 76 65 6e 74 20 69 73 0a 09  which event is..
14a0: 09 09 09 20 2a 20 61 73 73 6f 63 69 61 74 65 64  ... * associated
14b0: 20 28 65 2e 67 2e 20 77 69 6e 64 6f 77 29 2e 20   (e.g. window). 
14c0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 50 61  */.    struct Pa
14d0: 74 53 65 71 20 2a 6e 65 78 74 4f 62 6a 50 74 72  tSeq *nextObjPtr
14e0: 3b 0a 09 09 09 09 2f 2a 20 4e 65 78 74 20 69 6e  ;...../* Next in
14f0: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 74   list of all pat
1500: 74 65 72 6e 0a 09 09 09 09 20 2a 20 73 65 71 75  tern..... * sequ
1510: 65 6e 63 65 73 20 66 6f 72 20 74 68 65 20 73 61  ences for the sa
1520: 6d 65 20 6f 62 6a 65 63 74 0a 09 09 09 09 20 2a  me object..... *
1530: 20 28 4e 55 4c 4c 20 66 6f 72 20 65 6e 64 20 6f   (NULL for end o
1540: 66 20 6c 69 73 74 29 2e 20 20 4e 65 65 64 65 64  f list).  Needed
1550: 20 74 6f 0a 09 09 09 09 20 2a 20 69 6d 70 6c 65   to..... * imple
1560: 6d 65 6e 74 20 54 6b 5f 44 65 6c 65 74 65 41 6c  ment Tk_DeleteAl
1570: 6c 42 69 6e 64 69 6e 67 73 2e 20 2a 2f 0a 20 20  lBindings. */.  
1580: 20 20 50 61 74 74 65 72 6e 20 70 61 74 73 5b 31    Pattern pats[1
1590: 5d 3b 09 09 2f 2a 20 41 72 72 61 79 20 6f 66 20  ];../* Array of 
15a0: 22 6e 75 6d 50 61 74 73 22 20 70 61 74 74 65 72  "numPats" patter
15b0: 6e 73 2e 20 20 4f 6e 6c 79 0a 09 09 09 09 20 2a  ns.  Only..... *
15c0: 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 73 20   one element is 
15d0: 64 65 63 6c 61 72 65 64 20 68 65 72 65 20 62 75  declared here bu
15e0: 74 0a 09 09 09 09 20 2a 20 69 6e 20 61 63 74 75  t..... * in actu
15f0: 61 6c 69 74 79 20 65 6e 6f 75 67 68 20 73 70 61  ality enough spa
1600: 63 65 20 77 69 6c 6c 20 62 65 0a 09 09 09 09 20  ce will be..... 
1610: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  * allocated for 
1620: 22 6e 75 6d 50 61 74 73 22 20 70 61 74 74 65 72  "numPats" patter
1630: 6e 73 2e 0a 09 09 09 09 20 2a 20 54 6f 20 6d 61  ns...... * To ma
1640: 74 63 68 2c 20 70 61 74 73 5b 30 5d 20 6d 75 73  tch, pats[0] mus
1650: 74 20 6d 61 74 63 68 20 65 76 65 6e 74 0a 09 09  t match event...
1660: 09 09 20 2a 20 6e 2c 20 70 61 74 73 5b 31 5d 20  .. * n, pats[1] 
1670: 6d 75 73 74 20 6d 61 74 63 68 20 65 76 65 6e 74  must match event
1680: 20 6e 2d 31 2c 0a 09 09 09 09 20 2a 20 65 74 63   n-1,..... * etc
1690: 2e 20 2a 2f 0a 7d 20 50 61 74 53 65 71 3b 0a 0a  . */.} PatSeq;..
16a0: 2f 2a 0a 20 2a 20 46 6c 61 67 20 76 61 6c 75 65  /*. * Flag value
16b0: 73 20 66 6f 72 20 50 61 74 53 65 71 20 73 74 72  s for PatSeq str
16c0: 75 63 74 75 72 65 73 3a 0a 20 2a 0a 20 2a 20 50  uctures:. *. * P
16d0: 41 54 5f 4e 45 41 52 42 59 09 09 31 20 6d 65 61  AT_NEARBY..1 mea
16e0: 6e 73 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74  ns that all of t
16f0: 68 65 20 65 76 65 6e 74 73 20 6d 61 74 63 68 69  he events matchi
1700: 6e 67 0a 20 2a 09 09 09 74 68 69 73 20 73 65 71  ng. *...this seq
1710: 75 65 6e 63 65 20 6d 75 73 74 20 6f 63 63 75 72  uence must occur
1720: 20 77 69 74 68 20 6e 65 61 72 62 79 20 58 0a 20   with nearby X. 
1730: 2a 09 09 09 61 6e 64 20 59 20 6d 6f 75 73 65 20  *...and Y mouse 
1740: 63 6f 6f 72 64 69 6e 61 74 65 73 20 61 6e 64 20  coordinates and 
1750: 63 6c 6f 73 65 20 69 6e 20 74 69 6d 65 2e 0a 20  close in time.. 
1760: 2a 09 09 09 54 68 69 73 20 69 73 20 74 79 70 69  *...This is typi
1770: 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 72 65  cally used to re
1780: 73 74 72 69 63 74 20 6d 75 6c 74 69 70 6c 65 0a  strict multiple.
1790: 20 2a 09 09 09 62 75 74 74 6f 6e 20 70 72 65 73   *...button pres
17a0: 73 65 73 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e  ses.. */..#defin
17b0: 65 20 50 41 54 5f 4e 45 41 52 42 59 09 09 31 0a  e PAT_NEARBY..1.
17c0: 0a 2f 2a 0a 20 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*. * Constants
17d0: 20 74 68 61 74 20 64 65 66 69 6e 65 20 68 6f 77   that define how
17e0: 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 20   close together 
17f0: 74 77 6f 20 65 76 65 6e 74 73 20 6d 75 73 74 20  two events must 
1800: 62 65 0a 20 2a 20 69 6e 20 6d 69 6c 6c 69 73 65  be. * in millise
1810: 63 6f 6e 64 73 20 6f 72 20 70 69 78 65 6c 73 20  conds or pixels 
1820: 74 6f 20 6d 65 65 74 20 74 68 65 20 50 41 54 5f  to meet the PAT_
1830: 4e 45 41 52 42 59 20 63 6f 6e 73 74 72 61 69 6e  NEARBY constrain
1840: 74 3a 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  t:. */..#define 
1850: 4e 45 41 52 42 59 5f 50 49 58 45 4c 53 09 09 35  NEARBY_PIXELS..5
1860: 0a 23 64 65 66 69 6e 65 20 4e 45 41 52 42 59 5f  .#define NEARBY_
1870: 4d 53 09 09 35 30 30 0a 0a 2f 2a 0a 20 2a 20 54  MS..500../*. * T
1880: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
1890: 65 20 61 6e 64 20 68 61 73 68 20 74 61 62 6c 65  e and hash table
18a0: 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20   below are used 
18b0: 74 6f 20 6d 61 70 20 66 72 6f 6d 0a 20 2a 20 74  to map from. * t
18c0: 65 78 74 75 61 6c 20 6b 65 79 73 79 6d 20 6e 61  extual keysym na
18d0: 6d 65 73 20 74 6f 20 6b 65 79 73 79 6d 20 6e 75  mes to keysym nu
18e0: 6d 62 65 72 73 2e 20 20 54 68 69 73 20 73 74 72  mbers.  This str
18f0: 75 63 74 75 72 65 20 69 73 0a 20 2a 20 70 72 65  ucture is. * pre
1900: 73 65 6e 74 20 68 65 72 65 20 62 65 63 61 75 73  sent here becaus
1910: 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
1920: 69 6e 67 20 58 20 70 72 6f 63 65 64 75 72 65 73  ing X procedures
1930: 20 61 72 65 0a 20 2a 20 72 69 64 69 63 75 6c 6f   are. * ridiculo
1940: 75 73 6c 79 20 73 6c 6f 77 2e 0a 20 2a 2f 0a 0a  usly slow.. */..
1950: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 7b  typedef struct {
1960: 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  .    char *name;
1970: 09 09 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 6b  ..../* Name of k
1980: 65 79 73 79 6d 2e 20 2a 2f 0a 20 20 20 20 4b 65  eysym. */.    Ke
1990: 79 53 79 6d 20 76 61 6c 75 65 3b 09 09 09 2f 2a  ySym value;.../*
19a0: 20 4e 75 6d 65 72 69 63 20 69 64 65 6e 74 69 66   Numeric identif
19b0: 69 65 72 20 66 6f 72 20 6b 65 79 73 79 6d 2e 20  ier for keysym. 
19c0: 2a 2f 0a 7d 20 4b 65 79 53 79 6d 49 6e 66 6f 3b  */.} KeySymInfo;
19d0: 0a 73 74 61 74 69 63 20 4b 65 79 53 79 6d 49 6e  .static KeySymIn
19e0: 66 6f 20 6b 65 79 41 72 72 61 79 5b 5d 20 3d 20  fo keyArray[] = 
19f0: 7b 0a 23 69 66 6e 64 65 66 20 6c 69 6e 74 0a 23  {.#ifndef lint.#
1a00: 69 6e 63 6c 75 64 65 20 22 6b 73 5f 6e 61 6d 65  include "ks_name
1a10: 73 2e 68 22 0a 23 65 6e 64 69 66 0a 20 20 20 20  s.h".#endif.    
1a20: 7b 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20  {(char *) NULL, 
1a30: 30 7d 0a 7d 3b 0a 73 74 61 74 69 63 20 54 63 6c  0}.};.static Tcl
1a40: 5f 48 61 73 68 54 61 62 6c 65 20 6b 65 79 53 79  _HashTable keySy
1a50: 6d 54 61 62 6c 65 3b 09 2f 2a 20 48 61 73 68 65  mTable;./* Hashe
1a60: 64 20 66 6f 72 6d 20 6f 66 20 61 62 6f 76 65 20  d form of above 
1a70: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 0a 73  structure. */..s
1a80: 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61  tatic int initia
1a90: 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 20  lized = 0;../*. 
1aa0: 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 69  * A hash table i
1ab0: 73 20 6b 65 70 74 20 74 6f 20 6d 61 70 20 66 72  s kept to map fr
1ac0: 6f 6d 20 74 68 65 20 73 74 72 69 6e 67 20 6e 61  om the string na
1ad0: 6d 65 73 20 6f 66 20 65 76 65 6e 74 0a 20 2a 20  mes of event. * 
1ae0: 6d 6f 64 69 66 69 65 72 73 20 74 6f 20 69 6e 66  modifiers to inf
1af0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1b00: 68 6f 73 65 20 6d 6f 64 69 66 69 65 72 73 2e 20  hose modifiers. 
1b10: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 0a 20   The structure. 
1b20: 2a 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  * for storing th
1b30: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20  is information, 
1b40: 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
1b50: 6c 65 20 62 75 69 6c 74 20 61 74 0a 20 2a 20 69  le built at. * i
1b60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1b70: 6d 65 2c 20 61 72 65 20 64 65 66 69 6e 65 64 20  me, are defined 
1b80: 62 65 6c 6f 77 2e 0a 20 2a 2f 0a 0a 74 79 70 65  below.. */..type
1b90: 64 65 66 20 73 74 72 75 63 74 20 7b 0a 20 20 20  def struct {.   
1ba0: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 09 09 09 2f   char *name;.../
1bb0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 6f 64 69 66 69  * Name of modifi
1bc0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  er. */.    int m
1bd0: 61 73 6b 3b 09 09 09 2f 2a 20 42 75 74 74 6f 6e  ask;.../* Button
1be0: 2f 6d 6f 64 69 66 69 65 72 20 6d 61 73 6b 20 76  /modifier mask v
1bf0: 61 6c 75 65 2c 09 09 09 09 09 09 09 20 2a 20 73  alue,....... * s
1c00: 75 63 68 20 61 73 20 42 75 74 74 6f 6e 31 4d 61  uch as Button1Ma
1c10: 73 6b 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66  sk. */.    int f
1c20: 6c 61 67 73 3b 09 09 09 2f 2a 20 56 61 72 69 6f  lags;.../* Vario
1c30: 75 73 20 66 6c 61 67 73 3b 20 20 73 65 65 20 62  us flags;  see b
1c40: 65 6c 6f 77 20 66 6f 72 0a 09 09 09 09 20 2a 20  elow for..... * 
1c50: 64 65 66 69 6e 69 74 69 6f 6e 73 2e 20 2a 2f 0a  definitions. */.
1c60: 7d 20 4d 6f 64 49 6e 66 6f 3b 0a 0a 2f 2a 0a 20  } ModInfo;../*. 
1c70: 2a 20 46 6c 61 67 73 20 66 6f 72 20 4d 6f 64 49  * Flags for ModI
1c80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 73 3a 0a  nfo structures:.
1c90: 20 2a 0a 20 2a 20 44 4f 55 42 4c 45 20 2d 09 09   *. * DOUBLE -..
1ca0: 4e 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 64  Non-zero means d
1cb0: 75 70 6c 69 63 61 74 65 20 74 68 69 73 20 65 76  uplicate this ev
1cc0: 65 6e 74 2c 0a 20 2a 09 09 09 65 2e 67 2e 20 66  ent,. *...e.g. f
1cd0: 6f 72 20 64 6f 75 62 6c 65 2d 63 6c 69 63 6b 73  or double-clicks
1ce0: 2e 0a 20 2a 20 54 52 49 50 4c 45 20 2d 09 09 4e  .. * TRIPLE -..N
1cf0: 6f 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 74 72  on-zero means tr
1d00: 69 70 6c 69 63 61 74 65 20 74 68 69 73 20 65 76  iplicate this ev
1d10: 65 6e 74 2c 0a 20 2a 09 09 09 65 2e 67 2e 20 66  ent,. *...e.g. f
1d20: 6f 72 20 74 72 69 70 6c 65 2d 63 6c 69 63 6b 73  or triple-clicks
1d30: 2e 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 44  .. */..#define D
1d40: 4f 55 42 4c 45 09 09 31 0a 23 64 65 66 69 6e 65  OUBLE..1.#define
1d50: 20 54 52 49 50 4c 45 09 09 32 0a 0a 2f 2a 0a 20   TRIPLE..2../*. 
1d60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d70: 73 70 65 63 69 61 6c 20 6d 6f 64 69 66 69 65 72  special modifier
1d80: 20 6d 61 73 6b 20 62 69 74 73 20 61 72 65 20 64   mask bits are d
1d90: 65 66 69 6e 65 64 2c 20 74 6f 20 69 6e 64 69 63  efined, to indic
1da0: 61 74 65 0a 20 2a 20 6c 6f 67 69 63 61 6c 20 6d  ate. * logical m
1db0: 6f 64 69 66 69 65 72 73 20 73 75 63 68 20 61 73  odifiers such as
1dc0: 20 4d 65 74 61 20 61 6e 64 20 41 6c 74 20 74 68   Meta and Alt th
1dd0: 61 74 20 6d 61 79 20 66 6c 6f 61 74 20 61 6d 6f  at may float amo
1de0: 6e 67 20 74 68 65 0a 20 2a 20 61 63 74 75 61 6c  ng the. * actual
1df0: 20 6d 6f 64 69 66 69 65 72 20 62 69 74 73 2e 0a   modifier bits..
1e00: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4d 45 54   */..#define MET
1e10: 41 5f 4d 41 53 4b 09 28 41 6e 79 4d 6f 64 69 66  A_MASK.(AnyModif
1e20: 69 65 72 3c 3c 31 29 0a 23 64 65 66 69 6e 65 20  ier<<1).#define 
1e30: 41 4c 54 5f 4d 41 53 4b 09 28 41 6e 79 4d 6f 64  ALT_MASK.(AnyMod
1e40: 69 66 69 65 72 3c 3c 32 29 0a 0a 73 74 61 74 69  ifier<<2)..stati
1e50: 63 20 4d 6f 64 49 6e 66 6f 20 6d 6f 64 41 72 72  c ModInfo modArr
1e60: 61 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 43  ay[] = {.    {"C
1e70: 6f 6e 74 72 6f 6c 22 2c 09 09 43 6f 6e 74 72 6f  ontrol",..Contro
1e80: 6c 4d 61 73 6b 2c 09 30 7d 2c 0a 20 20 20 20 7b  lMask,.0},.    {
1e90: 22 53 68 69 66 74 22 2c 09 09 53 68 69 66 74 4d  "Shift",..ShiftM
1ea0: 61 73 6b 2c 09 30 7d 2c 0a 20 20 20 20 7b 22 4c  ask,.0},.    {"L
1eb0: 6f 63 6b 22 2c 09 09 4c 6f 63 6b 4d 61 73 6b 2c  ock",..LockMask,
1ec0: 09 30 7d 2c 0a 20 20 20 20 7b 22 4d 65 74 61 22  .0},.    {"Meta"
1ed0: 2c 09 09 4d 45 54 41 5f 4d 41 53 4b 2c 09 30 7d  ,..META_MASK,.0}
1ee0: 2c 0a 20 20 20 20 7b 22 4d 22 2c 09 09 4d 45 54  ,.    {"M",..MET
1ef0: 41 5f 4d 41 53 4b 2c 09 30 7d 2c 0a 20 20 20 20  A_MASK,.0},.    
1f00: 7b 22 41 6c 74 22 2c 09 09 41 4c 54 5f 4d 41 53  {"Alt",..ALT_MAS
1f10: 4b 2c 09 30 7d 2c 0a 20 20 20 20 7b 22 42 31 22  K,.0},.    {"B1"
1f20: 2c 09 09 42 75 74 74 6f 6e 31 4d 61 73 6b 2c 09  ,..Button1Mask,.
1f30: 30 7d 2c 0a 20 20 20 20 7b 22 42 75 74 74 6f 6e  0},.    {"Button
1f40: 31 22 2c 09 09 42 75 74 74 6f 6e 31 4d 61 73 6b  1",..Button1Mask
1f50: 2c 09 30 7d 2c 0a 20 20 20 20 7b 22 42 32 22 2c  ,.0},.    {"B2",
1f60: 09 09 42 75 74 74 6f 6e 32 4d 61 73 6b 2c 09 30  ..Button2Mask,.0
1f70: 7d 2c 0a 20 20 20 20 7b 22 42 75 74 74 6f 6e 32  },.    {"Button2
1f80: 22 2c 09 09 42 75 74 74 6f 6e 32 4d 61 73 6b 2c  ",..Button2Mask,
1f90: 09 30 7d 2c 0a 20 20 20 20 7b 22 42 33 22 2c 09  .0},.    {"B3",.
1fa0: 09 42 75 74 74 6f 6e 33 4d 61 73 6b 2c 09 30 7d  .Button3Mask,.0}
1fb0: 2c 0a 20 20 20 20 7b 22 42 75 74 74 6f 6e 33 22  ,.    {"Button3"
1fc0: 2c 09 09 42 75 74 74 6f 6e 33 4d 61 73 6b 2c 09  ,..Button3Mask,.
1fd0: 30 7d 2c 0a 20 20 20 20 7b 22 42 34 22 2c 09 09  0},.    {"B4",..
1fe0: 42 75 74 74 6f 6e 34 4d 61 73 6b 2c 09 30 7d 2c  Button4Mask,.0},
1ff0: 0a 20 20 20 20 7b 22 42 75 74 74 6f 6e 34 22 2c  .    {"Button4",
2000: 09 09 42 75 74 74 6f 6e 34 4d 61 73 6b 2c 09 30  ..Button4Mask,.0
2010: 7d 2c 0a 20 20 20 20 7b 22 42 35 22 2c 09 09 42  },.    {"B5",..B
2020: 75 74 74 6f 6e 35 4d 61 73 6b 2c 09 30 7d 2c 0a  utton5Mask,.0},.
2030: 20 20 20 20 7b 22 42 75 74 74 6f 6e 35 22 2c 09      {"Button5",.
2040: 09 42 75 74 74 6f 6e 35 4d 61 73 6b 2c 09 30 7d  .Button5Mask,.0}
2050: 2c 0a 20 20 20 20 7b 22 4d 6f 64 31 22 2c 09 09  ,.    {"Mod1",..
2060: 4d 6f 64 31 4d 61 73 6b 2c 09 30 7d 2c 0a 20 20  Mod1Mask,.0},.  
2070: 20 20 7b 22 4d 31 22 2c 09 09 4d 6f 64 31 4d 61    {"M1",..Mod1Ma
2080: 73 6b 2c 09 30 7d 2c 0a 20 20 20 20 7b 22 4d 6f  sk,.0},.    {"Mo
2090: 64 32 22 2c 09 09 4d 6f 64 32 4d 61 73 6b 2c 09  d2",..Mod2Mask,.
20a0: 30 7d 2c 0a 20 20 20 20 7b 22 4d 32 22 2c 09 09  0},.    {"M2",..
20b0: 4d 6f 64 32 4d 61 73 6b 2c 09 30 7d 2c 0a 20 20  Mod2Mask,.0},.  
20c0: 20 20 7b 22 4d 6f 64 33 22 2c 09 09 4d 6f 64 33    {"Mod3",..Mod3
20d0: 4d 61 73 6b 2c 09 30 7d 2c 0a 20 20 20 20 7b 22  Mask,.0},.    {"
20e0: 4d 33 22 2c 09 09 4d 6f 64 33 4d 61 73 6b 2c 09  M3",..Mod3Mask,.
20f0: 30 7d 2c 0a 20 20 20 20 7b 22 4d 6f 64 34 22 2c  0},.    {"Mod4",
2100: 09 09 4d 6f 64 34 4d 61 73 6b 2c 09 30 7d 2c 0a  ..Mod4Mask,.0},.
2110: 20 20 20 20 7b 22 4d 34 22 2c 09 09 4d 6f 64 34      {"M4",..Mod4
2120: 4d 61 73 6b 2c 09 30 7d 2c 0a 20 20 20 20 7b 22  Mask,.0},.    {"
2130: 4d 6f 64 35 22 2c 09 09 4d 6f 64 35 4d 61 73 6b  Mod5",..Mod5Mask
2140: 2c 09 30 7d 2c 0a 20 20 20 20 7b 22 4d 35 22 2c  ,.0},.    {"M5",
2150: 09 09 4d 6f 64 35 4d 61 73 6b 2c 09 30 7d 2c 0a  ..Mod5Mask,.0},.
2160: 20 20 20 20 7b 22 44 6f 75 62 6c 65 22 2c 09 09      {"Double",..
2170: 30 2c 09 09 44 4f 55 42 4c 45 7d 2c 0a 20 20 20  0,..DOUBLE},.   
2180: 20 7b 22 54 72 69 70 6c 65 22 2c 09 09 30 2c 09   {"Triple",..0,.
2190: 09 54 52 49 50 4c 45 7d 2c 0a 20 20 20 20 7b 22  .TRIPLE},.    {"
21a0: 41 6e 79 22 2c 09 09 30 2c 09 09 30 7d 2c 09 2f  Any",..0,..0},./
21b0: 2a 20 49 67 6e 6f 72 65 64 3a 20 68 69 73 74 6f  * Ignored: histo
21c0: 72 69 63 61 6c 20 72 65 6c 69 63 2e 20 2a 2f 0a  rical relic. */.
21d0: 20 20 20 20 7b 4e 55 4c 4c 2c 09 09 30 2c 09 09      {NULL,..0,..
21e0: 30 7d 0a 7d 3b 0a 73 74 61 74 69 63 20 54 63 6c  0}.};.static Tcl
21f0: 5f 48 61 73 68 54 61 62 6c 65 20 6d 6f 64 54 61  _HashTable modTa
2200: 62 6c 65 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73  ble;../*. * This
2210: 20 6d 6f 64 75 6c 65 20 61 6c 73 6f 20 6b 65 65   module also kee
2220: 70 73 20 61 20 68 61 73 68 20 74 61 62 6c 65 20  ps a hash table 
2230: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 65 76 65  mapping from eve
2240: 6e 74 20 6e 61 6d 65 73 0a 20 2a 20 74 6f 20 69  nt names. * to i
2250: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
2260: 20 74 68 6f 73 65 20 65 76 65 6e 74 73 2e 20 20   those events.  
2270: 54 68 65 20 73 74 72 75 63 74 75 72 65 2c 20 61  The structure, a
2280: 6e 20 61 72 72 61 79 0a 20 2a 20 74 6f 20 75 73  n array. * to us
2290: 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
22a0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c 20  the hash table, 
22b0: 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
22c0: 6c 65 20 61 72 65 0a 20 2a 20 61 6c 6c 20 64 65  le are. * all de
22d0: 66 69 6e 65 64 20 62 65 6c 6f 77 2e 0a 20 2a 2f  fined below.. */
22e0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
22f0: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d   {.    char *nam
2300: 65 3b 09 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;.../* Name of 
2310: 65 76 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  event. */.    in
2320: 74 20 74 79 70 65 3b 09 09 09 2f 2a 20 45 76 65  t type;.../* Eve
2330: 6e 74 20 74 79 70 65 20 66 6f 72 20 58 2c 20 73  nt type for X, s
2340: 75 63 68 20 61 73 0a 09 09 09 09 20 2a 20 42 75  uch as..... * Bu
2350: 74 74 6f 6e 50 72 65 73 73 2e 20 2a 2f 0a 20 20  ttonPress. */.  
2360: 20 20 69 6e 74 20 65 76 65 6e 74 4d 61 73 6b 3b    int eventMask;
2370: 09 09 2f 2a 20 4d 61 73 6b 20 62 69 74 73 20 28  ../* Mask bits (
2380: 66 6f 72 20 58 53 65 6c 65 63 74 49 6e 70 75 74  for XSelectInput
2390: 29 0a 09 09 09 09 20 2a 20 66 6f 72 20 74 68 69  )..... * for thi
23a0: 73 20 65 76 65 6e 74 20 74 79 70 65 2e 20 2a 2f  s event type. */
23b0: 0a 7d 20 45 76 65 6e 74 49 6e 66 6f 3b 0a 0a 2f  .} EventInfo;../
23c0: 2a 0a 20 2a 20 4e 6f 74 65 3a 20 20 73 6f 6d 65  *. * Note:  some
23d0: 20 6f 66 20 74 68 65 20 6d 61 73 6b 73 20 62 65   of the masks be
23e0: 6c 6f 77 20 61 72 65 20 61 6e 20 4f 52 2d 65 64  low are an OR-ed
23f0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
2400: 20 2a 20 73 65 76 65 72 61 6c 20 6d 61 73 6b 73   * several masks
2410: 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
2420: 73 61 72 79 20 62 65 63 61 75 73 65 20 58 20 64  sary because X d
2430: 6f 65 73 6e 27 74 20 72 65 70 6f 72 74 0a 20 2a  oesn't report. *
2440: 20 75 70 20 65 76 65 6e 74 73 20 75 6e 6c 65 73   up events unles
2450: 73 20 79 6f 75 20 61 6c 73 6f 20 61 73 6b 20 66  s you also ask f
2460: 6f 72 20 64 6f 77 6e 20 65 76 65 6e 74 73 2e 20  or down events. 
2470: 20 41 6c 73 6f 2c 20 58 0a 20 2a 20 64 6f 65 73   Also, X. * does
2480: 6e 27 74 20 72 65 70 6f 72 74 20 62 75 74 74 6f  n't report butto
2490: 6e 20 73 74 61 74 65 20 69 6e 20 6d 6f 74 69 6f  n state in motio
24a0: 6e 20 65 76 65 6e 74 73 20 75 6e 6c 65 73 73 20  n events unless 
24b0: 79 6f 75 27 76 65 0a 20 2a 20 61 73 6b 65 64 20  you've. * asked 
24c0: 61 62 6f 75 74 20 62 75 74 74 6f 6e 20 65 76 65  about button eve
24d0: 6e 74 73 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  nts.. */..static
24e0: 20 45 76 65 6e 74 49 6e 66 6f 20 65 76 65 6e 74   EventInfo event
24f0: 41 72 72 61 79 5b 5d 20 3d 20 7b 0a 20 20 20 20  Array[] = {.    
2500: 7b 22 4d 6f 74 69 6f 6e 22 2c 09 09 43 54 4b 5f  {"Motion",..CTK_
2510: 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56 45 4e  UNSUPPORTED_EVEN
2520: 54 2c 09 43 54 4b 5f 55 4e 53 55 50 50 4f 52 54  T,.CTK_UNSUPPORT
2530: 45 44 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a  ED_EVENT_MASK},.
2540: 20 20 20 20 7b 22 42 75 74 74 6f 6e 22 2c 09 09      {"Button",..
2550: 43 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  CTK_UNSUPPORTED_
2560: 45 56 45 4e 54 2c 09 43 54 4b 5f 55 4e 53 55 50  EVENT,.CTK_UNSUP
2570: 50 4f 52 54 45 44 5f 45 56 45 4e 54 5f 4d 41 53  PORTED_EVENT_MAS
2580: 4b 7d 2c 0a 20 20 20 20 7b 22 42 75 74 74 6f 6e  K},.    {"Button
2590: 50 72 65 73 73 22 2c 09 43 54 4b 5f 55 4e 53 55  Press",.CTK_UNSU
25a0: 50 50 4f 52 54 45 44 5f 45 56 45 4e 54 2c 09 43  PPORTED_EVENT,.C
25b0: 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45  TK_UNSUPPORTED_E
25c0: 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20 20 20  VENT_MASK},.    
25d0: 7b 22 42 75 74 74 6f 6e 52 65 6c 65 61 73 65 22  {"ButtonRelease"
25e0: 2c 09 43 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45  ,.CTK_UNSUPPORTE
25f0: 44 5f 45 56 45 4e 54 2c 09 43 54 4b 5f 55 4e 53  D_EVENT,.CTK_UNS
2600: 55 50 50 4f 52 54 45 44 5f 45 56 45 4e 54 5f 4d  UPPORTED_EVENT_M
2610: 41 53 4b 7d 2c 0a 20 20 20 20 7b 22 43 6f 6c 6f  ASK},.    {"Colo
2620: 72 6d 61 70 22 2c 09 43 54 4b 5f 55 4e 53 55 50  rmap",.CTK_UNSUP
2630: 50 4f 52 54 45 44 5f 45 56 45 4e 54 2c 09 43 54  PORTED_EVENT,.CT
2640: 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56  K_UNSUPPORTED_EV
2650: 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20 20 20 7b  ENT_MASK},.    {
2660: 22 45 6e 74 65 72 22 2c 09 09 43 54 4b 5f 55 4e  "Enter",..CTK_UN
2670: 53 55 50 50 4f 52 54 45 44 5f 45 56 45 4e 54 2c  SUPPORTED_EVENT,
2680: 09 43 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44  .CTK_UNSUPPORTED
2690: 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20  _EVENT_MASK},.  
26a0: 20 20 7b 22 4c 65 61 76 65 22 2c 09 09 43 54 4b    {"Leave",..CTK
26b0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56 45  _UNSUPPORTED_EVE
26c0: 4e 54 2c 09 43 54 4b 5f 55 4e 53 55 50 50 4f 52  NT,.CTK_UNSUPPOR
26d0: 54 45 44 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c  TED_EVENT_MASK},
26e0: 0a 20 20 20 20 7b 22 45 78 70 6f 73 65 22 2c 09  .    {"Expose",.
26f0: 09 43 54 4b 5f 45 58 50 4f 53 45 5f 45 56 45 4e  .CTK_EXPOSE_EVEN
2700: 54 2c 09 43 54 4b 5f 45 58 50 4f 53 45 5f 45 56  T,.CTK_EXPOSE_EV
2710: 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20 20 20 7b  ENT_MASK},.    {
2720: 22 46 6f 63 75 73 49 6e 22 2c 09 09 43 54 4b 5f  "FocusIn",..CTK_
2730: 46 4f 43 55 53 5f 45 56 45 4e 54 2c 09 43 54 4b  FOCUS_EVENT,.CTK
2740: 5f 46 4f 43 55 53 5f 45 56 45 4e 54 5f 4d 41 53  _FOCUS_EVENT_MAS
2750: 4b 7d 2c 0a 20 20 20 20 7b 22 46 6f 63 75 73 4f  K},.    {"FocusO
2760: 75 74 22 2c 09 43 54 4b 5f 55 4e 46 4f 43 55 53  ut",.CTK_UNFOCUS
2770: 5f 45 56 45 4e 54 2c 09 43 54 4b 5f 46 4f 43 55  _EVENT,.CTK_FOCU
2780: 53 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20  S_EVENT_MASK},. 
2790: 20 20 20 7b 22 4b 65 79 22 2c 09 09 43 54 4b 5f     {"Key",..CTK_
27a0: 4b 45 59 5f 45 56 45 4e 54 2c 09 09 43 54 4b 5f  KEY_EVENT,..CTK_
27b0: 4b 45 59 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c  KEY_EVENT_MASK},
27c0: 0a 20 20 20 20 7b 22 4b 65 79 50 72 65 73 73 22  .    {"KeyPress"
27d0: 2c 09 43 54 4b 5f 4b 45 59 5f 45 56 45 4e 54 2c  ,.CTK_KEY_EVENT,
27e0: 09 09 43 54 4b 5f 4b 45 59 5f 45 56 45 4e 54 5f  ..CTK_KEY_EVENT_
27f0: 4d 41 53 4b 7d 2c 0a 20 20 20 20 7b 22 4b 65 79  MASK},.    {"Key
2800: 52 65 6c 65 61 73 65 22 2c 09 43 54 4b 5f 55 4e  Release",.CTK_UN
2810: 53 55 50 50 4f 52 54 45 44 5f 45 56 45 4e 54 2c  SUPPORTED_EVENT,
2820: 09 43 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44  .CTK_UNSUPPORTED
2830: 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20  _EVENT_MASK},.  
2840: 20 20 7b 22 50 72 6f 70 65 72 74 79 22 2c 09 43    {"Property",.C
2850: 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45  TK_UNSUPPORTED_E
2860: 56 45 4e 54 2c 09 43 54 4b 5f 55 4e 53 55 50 50  VENT,.CTK_UNSUPP
2870: 4f 52 54 45 44 5f 45 56 45 4e 54 5f 4d 41 53 4b  ORTED_EVENT_MASK
2880: 7d 2c 0a 20 20 20 20 7b 22 43 69 72 63 75 6c 61  },.    {"Circula
2890: 74 65 22 2c 09 43 54 4b 5f 55 4e 53 55 50 50 4f  te",.CTK_UNSUPPO
28a0: 52 54 45 44 5f 45 56 45 4e 54 2c 09 43 54 4b 5f  RTED_EVENT,.CTK_
28b0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56 45 4e  UNSUPPORTED_EVEN
28c0: 54 5f 4d 41 53 4b 7d 2c 0a 20 20 20 20 7b 22 43  T_MASK},.    {"C
28d0: 6f 6e 66 69 67 75 72 65 22 2c 09 43 54 4b 5f 4d  onfigure",.CTK_M
28e0: 41 50 5f 45 56 45 4e 54 2c 09 09 43 54 4b 5f 4d  AP_EVENT,..CTK_M
28f0: 41 50 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a  AP_EVENT_MASK},.
2900: 20 20 20 20 7b 22 44 65 73 74 72 6f 79 22 2c 09      {"Destroy",.
2910: 09 43 54 4b 5f 44 45 53 54 52 4f 59 5f 45 56 45  .CTK_DESTROY_EVE
2920: 4e 54 2c 09 43 54 4b 5f 44 45 53 54 52 4f 59 5f  NT,.CTK_DESTROY_
2930: 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20 20  EVENT_MASK},.   
2940: 20 7b 22 47 72 61 76 69 74 79 22 2c 09 09 43 54   {"Gravity",..CT
2950: 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56  K_UNSUPPORTED_EV
2960: 45 4e 54 2c 09 43 54 4b 5f 55 4e 53 55 50 50 4f  ENT,.CTK_UNSUPPO
2970: 52 54 45 44 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d  RTED_EVENT_MASK}
2980: 2c 0a 20 20 20 20 7b 22 4d 61 70 22 2c 09 09 43  ,.    {"Map",..C
2990: 54 4b 5f 4d 41 50 5f 45 56 45 4e 54 2c 09 09 43  TK_MAP_EVENT,..C
29a0: 54 4b 5f 4d 41 50 5f 45 56 45 4e 54 5f 4d 41 53  TK_MAP_EVENT_MAS
29b0: 4b 7d 2c 0a 20 20 20 20 7b 22 52 65 70 61 72 65  K},.    {"Repare
29c0: 6e 74 22 2c 09 43 54 4b 5f 55 4e 53 55 50 50 4f  nt",.CTK_UNSUPPO
29d0: 52 54 45 44 5f 45 56 45 4e 54 2c 09 43 54 4b 5f  RTED_EVENT,.CTK_
29e0: 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56 45 4e  UNSUPPORTED_EVEN
29f0: 54 5f 4d 41 53 4b 7d 2c 0a 20 20 20 20 7b 22 55  T_MASK},.    {"U
2a00: 6e 6d 61 70 22 2c 09 09 43 54 4b 5f 55 4e 4d 41  nmap",..CTK_UNMA
2a10: 50 5f 45 56 45 4e 54 2c 09 43 54 4b 5f 4d 41 50  P_EVENT,.CTK_MAP
2a20: 5f 45 56 45 4e 54 5f 4d 41 53 4b 7d 2c 0a 20 20  _EVENT_MASK},.  
2a30: 20 20 7b 22 56 69 73 69 62 69 6c 69 74 79 22 2c    {"Visibility",
2a40: 09 43 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44  .CTK_UNSUPPORTED
2a50: 5f 45 56 45 4e 54 2c 09 43 54 4b 5f 55 4e 53 55  _EVENT,.CTK_UNSU
2a60: 50 50 4f 52 54 45 44 5f 45 56 45 4e 54 5f 4d 41  PPORTED_EVENT_MA
2a70: 53 4b 7d 2c 0a 20 20 20 20 7b 28 63 68 61 72 20  SK},.    {(char 
2a80: 2a 29 20 4e 55 4c 4c 2c 09 30 2c 09 09 09 30 7d  *) NULL,.0,...0}
2a90: 0a 7d 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 48  .};.static Tcl_H
2aa0: 61 73 68 54 61 62 6c 65 20 65 76 65 6e 74 54 61  ashTable eventTa
2ab0: 62 6c 65 3b 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 74  ble;../*. * Prot
2ac0: 6f 74 79 70 65 73 20 66 6f 72 20 6c 6f 63 61 6c  otypes for local
2ad0: 20 70 72 6f 63 65 64 75 72 65 73 20 64 65 66 69   procedures defi
2ae0: 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
2af0: 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  :. */..static vo
2b00: 69 64 09 09 43 68 61 6e 67 65 53 63 72 65 65 6e  id..ChangeScreen
2b10: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 63   _ANSI_ARGS_((Tc
2b20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2b30: 2c 0a 09 09 09 20 20 20 20 63 68 61 72 20 2a 64  ,....    char *d
2b40: 69 73 70 4e 61 6d 65 29 29 3b 0a 73 74 61 74 69  ispName));.stati
2b50: 63 20 76 6f 69 64 09 09 45 78 70 61 6e 64 50 65  c void..ExpandPe
2b60: 72 63 65 6e 74 73 20 5f 41 4e 53 49 5f 41 52 47  rcents _ANSI_ARG
2b70: 53 5f 28 28 54 6b 57 69 6e 64 6f 77 20 2a 77 69  S_((TkWindow *wi
2b80: 6e 50 74 72 2c 0a 09 09 09 20 20 20 20 63 68 61  nPtr,....    cha
2b90: 72 20 2a 62 65 66 6f 72 65 2c 20 58 45 76 65 6e  r *before, XEven
2ba0: 74 20 2a 65 76 65 6e 74 50 74 72 2c 20 4b 65 79  t *eventPtr, Key
2bb0: 53 79 6d 20 6b 65 79 53 79 6d 2c 0a 09 09 09 20  Sym keySym,.... 
2bc0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a     Tcl_DString *
2bd0: 64 73 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20  dsPtr));.static 
2be0: 50 61 74 53 65 71 20 2a 09 09 46 69 6e 64 53 65  PatSeq *..FindSe
2bf0: 71 75 65 6e 63 65 20 5f 41 4e 53 49 5f 41 52 47  quence _ANSI_ARG
2c00: 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  S_((Tcl_Interp *
2c10: 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 42  interp,....    B
2c20: 69 6e 64 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e  indingTable *bin
2c30: 64 50 74 72 2c 20 43 6c 69 65 6e 74 44 61 74 61  dPtr, ClientData
2c40: 20 6f 62 6a 65 63 74 2c 0a 09 09 09 20 20 20 20   object,....    
2c50: 63 68 61 72 20 2a 65 76 65 6e 74 53 74 72 69 6e  char *eventStrin
2c60: 67 2c 20 69 6e 74 20 63 72 65 61 74 65 2c 0a 09  g, int create,..
2c70: 09 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  ..    unsigned l
2c80: 6f 6e 67 20 2a 6d 61 73 6b 50 74 72 29 29 3b 0a  ong *maskPtr));.
2c90: 73 74 61 74 69 63 20 63 68 61 72 20 2a 09 09 47  static char *..G
2ca0: 65 74 46 69 65 6c 64 20 5f 41 4e 53 49 5f 41 52  etField _ANSI_AR
2cb0: 47 53 5f 28 28 63 68 61 72 20 2a 70 2c 20 63 68  GS_((char *p, ch
2cc0: 61 72 20 2a 63 6f 70 79 2c 20 69 6e 74 20 73 69  ar *copy, int si
2cd0: 7a 65 29 29 3b 0a 73 74 61 74 69 63 20 50 61 74  ze));.static Pat
2ce0: 53 65 71 20 2a 09 09 4d 61 74 63 68 50 61 74 74  Seq *..MatchPatt
2cf0: 65 72 6e 73 20 5f 41 4e 53 49 5f 41 52 47 53 5f  erns _ANSI_ARGS_
2d00: 28 28 54 6b 44 69 73 70 6c 61 79 20 2a 64 69 73  ((TkDisplay *dis
2d10: 70 50 74 72 2c 0a 09 09 09 20 20 20 20 42 69 6e  pPtr,....    Bin
2d20: 64 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e 64 50  dingTable *bindP
2d30: 74 72 2c 20 50 61 74 53 65 71 20 2a 70 73 50 74  tr, PatSeq *psPt
2d40: 72 29 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  r));.../*. *----
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
2d90: 20 54 6b 5f 43 72 65 61 74 65 42 69 6e 64 69 6e   Tk_CreateBindin
2da0: 67 54 61 62 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09  gTable --. *. *.
2db0: 53 65 74 20 75 70 20 61 20 6e 65 77 20 64 6f 6d  Set up a new dom
2dc0: 61 69 6e 20 69 6e 20 77 68 69 63 68 20 65 76 65  ain in which eve
2dd0: 6e 74 20 62 69 6e 64 69 6e 67 73 20 6d 61 79 20  nt bindings may 
2de0: 62 65 20 63 72 65 61 74 65 64 2e 0a 20 2a 0a 20  be created.. *. 
2df0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
2e00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2e10: 73 20 61 20 74 6f 6b 65 6e 20 66 6f 72 20 74 68  s a token for th
2e20: 65 20 6e 65 77 20 74 61 62 6c 65 2c 20 77 68 69  e new table, whi
2e30: 63 68 20 6d 75 73 74 0a 20 2a 09 62 65 20 70 61  ch must. *.be pa
2e40: 73 73 65 64 20 74 6f 20 70 72 6f 63 65 64 75 72  ssed to procedur
2e50: 65 73 20 6c 69 6b 65 20 54 6b 5f 43 72 65 61 74  es like Tk_Creat
2e60: 42 69 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  Binding.. *. * S
2e70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
2e80: 4d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  Memory is alloca
2e90: 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
2ea0: 74 61 62 6c 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  table.. *. *----
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
2ef0: 54 6b 5f 42 69 6e 64 69 6e 67 54 61 62 6c 65 0a  Tk_BindingTable.
2f00: 54 6b 5f 43 72 65 61 74 65 42 69 6e 64 69 6e 67  Tk_CreateBinding
2f10: 54 61 62 6c 65 28 69 6e 74 65 72 70 29 0a 20 20  Table(interp).  
2f20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2f30: 74 65 72 70 3b 09 09 2f 2a 20 49 6e 74 65 72 70  terp;../* Interp
2f40: 72 65 74 65 72 20 74 6f 20 61 73 73 6f 63 69 61  reter to associa
2f50: 74 65 20 77 69 74 68 20 74 68 65 20 62 69 6e 64  te with the bind
2f60: 69 6e 67 0a 09 09 09 09 20 2a 20 74 61 62 6c 65  ing..... * table
2f70: 3a 20 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65 20  :  commands are 
2f80: 65 78 65 63 75 74 65 64 20 69 6e 20 74 68 69 73  executed in this
2f90: 0a 09 09 09 09 20 2a 20 69 6e 74 65 72 70 72 65  ..... * interpre
2fa0: 74 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65  ter. */.{.    re
2fb0: 67 69 73 74 65 72 20 42 69 6e 64 69 6e 67 54 61  gister BindingTa
2fc0: 62 6c 65 20 2a 62 69 6e 64 50 74 72 3b 0a 20 20  ble *bindPtr;.  
2fd0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a    int i;..    /*
2fe0: 0a 20 20 20 20 20 2a 20 49 66 20 74 68 69 73 20  .     * If this 
2ff0: 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  is the first tim
3000: 65 20 61 20 62 69 6e 64 69 6e 67 20 74 61 62 6c  e a binding tabl
3010: 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  e has been creat
3020: 65 64 2c 0a 20 20 20 20 20 2a 20 69 6e 69 74 69  ed,.     * initi
3030: 61 6c 69 7a 65 20 74 68 65 20 67 6c 6f 62 61 6c  alize the global
3040: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3050: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
3060: 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
3070: 20 7b 0a 09 72 65 67 69 73 74 65 72 20 4b 65 79   {..register Key
3080: 53 79 6d 49 6e 66 6f 20 2a 6b 50 74 72 3b 0a 09  SymInfo *kPtr;..
3090: 72 65 67 69 73 74 65 72 20 54 63 6c 5f 48 61 73  register Tcl_Has
30a0: 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0a 09 72  hEntry *hPtr;..r
30b0: 65 67 69 73 74 65 72 20 4d 6f 64 49 6e 66 6f 20  egister ModInfo 
30c0: 2a 6d 6f 64 50 74 72 3b 0a 09 72 65 67 69 73 74  *modPtr;..regist
30d0: 65 72 20 45 76 65 6e 74 49 6e 66 6f 20 2a 65 69  er EventInfo *ei
30e0: 50 74 72 3b 0a 09 69 6e 74 20 64 75 6d 6d 79 3b  Ptr;..int dummy;
30f0: 0a 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ...initialized =
3100: 20 31 3b 0a 20 20 20 20 0a 09 54 63 6c 5f 49 6e   1;.    ..Tcl_In
3110: 69 74 48 61 73 68 54 61 62 6c 65 28 26 6b 65 79  itHashTable(&key
3120: 53 79 6d 54 61 62 6c 65 2c 20 54 43 4c 5f 53 54  SymTable, TCL_ST
3130: 52 49 4e 47 5f 4b 45 59 53 29 3b 0a 09 66 6f 72  RING_KEYS);..for
3140: 20 28 6b 50 74 72 20 3d 20 6b 65 79 41 72 72 61   (kPtr = keyArra
3150: 79 3b 20 6b 50 74 72 2d 3e 6e 61 6d 65 20 21 3d  y; kPtr->name !=
3160: 20 4e 55 4c 4c 3b 20 6b 50 74 72 2b 2b 29 20 7b   NULL; kPtr++) {
3170: 0a 09 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c  ..    hPtr = Tcl
3180: 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 79  _CreateHashEntry
3190: 28 26 6b 65 79 53 79 6d 54 61 62 6c 65 2c 20 6b  (&keySymTable, k
31a0: 50 74 72 2d 3e 6e 61 6d 65 2c 20 26 64 75 6d 6d  Ptr->name, &dumm
31b0: 79 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  y);..    Tcl_Set
31c0: 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 2c 20  HashValue(hPtr, 
31d0: 6b 50 74 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 7d  kPtr->value);..}
31e0: 0a 20 20 20 20 0a 09 54 63 6c 5f 49 6e 69 74 48  .    ..Tcl_InitH
31f0: 61 73 68 54 61 62 6c 65 28 26 6d 6f 64 54 61 62  ashTable(&modTab
3200: 6c 65 2c 20 54 43 4c 5f 53 54 52 49 4e 47 5f 4b  le, TCL_STRING_K
3210: 45 59 53 29 3b 0a 09 66 6f 72 20 28 6d 6f 64 50  EYS);..for (modP
3220: 74 72 20 3d 20 6d 6f 64 41 72 72 61 79 3b 20 6d  tr = modArray; m
3230: 6f 64 50 74 72 2d 3e 6e 61 6d 65 20 21 3d 20 4e  odPtr->name != N
3240: 55 4c 4c 3b 20 6d 6f 64 50 74 72 2b 2b 29 20 7b  ULL; modPtr++) {
3250: 0a 09 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c  ..    hPtr = Tcl
3260: 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 79  _CreateHashEntry
3270: 28 26 6d 6f 64 54 61 62 6c 65 2c 20 6d 6f 64 50  (&modTable, modP
3280: 74 72 2d 3e 6e 61 6d 65 2c 20 26 64 75 6d 6d 79  tr->name, &dummy
3290: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 48  );..    Tcl_SetH
32a0: 61 73 68 56 61 6c 75 65 28 68 50 74 72 2c 20 6d  ashValue(hPtr, m
32b0: 6f 64 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 0a  odPtr);..}.    .
32c0: 09 54 63 6c 5f 49 6e 69 74 48 61 73 68 54 61 62  .Tcl_InitHashTab
32d0: 6c 65 28 26 65 76 65 6e 74 54 61 62 6c 65 2c 20  le(&eventTable, 
32e0: 54 43 4c 5f 53 54 52 49 4e 47 5f 4b 45 59 53 29  TCL_STRING_KEYS)
32f0: 3b 0a 09 66 6f 72 20 28 65 69 50 74 72 20 3d 20  ;..for (eiPtr = 
3300: 65 76 65 6e 74 41 72 72 61 79 3b 20 65 69 50 74  eventArray; eiPt
3310: 72 2d 3e 6e 61 6d 65 20 21 3d 20 4e 55 4c 4c 3b  r->name != NULL;
3320: 20 65 69 50 74 72 2b 2b 29 20 7b 0a 09 20 20 20   eiPtr++) {..   
3330: 20 68 50 74 72 20 3d 20 54 63 6c 5f 43 72 65 61   hPtr = Tcl_Crea
3340: 74 65 48 61 73 68 45 6e 74 72 79 28 26 65 76 65  teHashEntry(&eve
3350: 6e 74 54 61 62 6c 65 2c 20 65 69 50 74 72 2d 3e  ntTable, eiPtr->
3360: 6e 61 6d 65 2c 20 26 64 75 6d 6d 79 29 3b 0a 09  name, &dummy);..
3370: 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73 68 56      Tcl_SetHashV
3380: 61 6c 75 65 28 68 50 74 72 2c 20 65 69 50 74 72  alue(hPtr, eiPtr
3390: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
33a0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74   /*.     * Creat
33b0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
33c0: 20 61 20 6e 65 77 20 62 69 6e 64 69 6e 67 20 74   a new binding t
33d0: 61 62 6c 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  able..     */.. 
33e0: 20 20 20 62 69 6e 64 50 74 72 20 3d 20 28 42 69     bindPtr = (Bi
33f0: 6e 64 69 6e 67 54 61 62 6c 65 20 2a 29 20 63 6b  ndingTable *) ck
3400: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 69 6e  alloc(sizeof(Bin
3410: 64 69 6e 67 54 61 62 6c 65 29 29 3b 0a 20 20 20  dingTable));.   
3420: 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
3430: 20 45 56 45 4e 54 5f 42 55 46 46 45 52 5f 53 49   EVENT_BUFFER_SI
3440: 5a 45 3b 20 69 2b 2b 29 20 7b 0a 09 62 69 6e 64  ZE; i++) {..bind
3450: 50 74 72 2d 3e 65 76 65 6e 74 52 69 6e 67 5b 69  Ptr->eventRing[i
3460: 5d 2e 74 79 70 65 20 3d 20 2d 31 3b 0a 20 20 20  ].type = -1;.   
3470: 20 7d 0a 20 20 20 20 62 69 6e 64 50 74 72 2d 3e   }.    bindPtr->
3480: 63 75 72 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20  curEvent = 0;.  
3490: 20 20 54 63 6c 5f 49 6e 69 74 48 61 73 68 54 61    Tcl_InitHashTa
34a0: 62 6c 65 28 26 62 69 6e 64 50 74 72 2d 3e 70 61  ble(&bindPtr->pa
34b0: 74 74 65 72 6e 54 61 62 6c 65 2c 0a 09 20 20 20  tternTable,..   
34c0: 20 73 69 7a 65 6f 66 28 50 61 74 74 65 72 6e 54   sizeof(PatternT
34d0: 61 62 6c 65 4b 65 79 29 2f 73 69 7a 65 6f 66 28  ableKey)/sizeof(
34e0: 69 6e 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 49  int));.    Tcl_I
34f0: 6e 69 74 48 61 73 68 54 61 62 6c 65 28 26 62 69  nitHashTable(&bi
3500: 6e 64 50 74 72 2d 3e 6f 62 6a 65 63 74 54 61 62  ndPtr->objectTab
3510: 6c 65 2c 20 54 43 4c 5f 4f 4e 45 5f 57 4f 52 44  le, TCL_ONE_WORD
3520: 5f 4b 45 59 53 29 3b 0a 20 20 20 20 62 69 6e 64  _KEYS);.    bind
3530: 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  Ptr->interp = in
3540: 74 65 72 70 3b 0a 20 20 20 20 72 65 74 75 72 6e  terp;.    return
3550: 20 28 54 6b 5f 42 69 6e 64 69 6e 67 54 61 62 6c   (Tk_BindingTabl
3560: 65 29 20 62 69 6e 64 50 74 72 3b 0a 7d 0a 0c 0a  e) bindPtr;.}...
3570: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 5f 44 65 6c  ---. *. * Tk_Del
35c0: 65 74 65 42 69 6e 64 69 6e 67 54 61 62 6c 65 20  eteBindingTable 
35d0: 2d 2d 0a 20 2a 0a 20 2a 09 44 65 73 74 72 6f 79  --. *. *.Destroy
35e0: 20 61 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65   a binding table
35f0: 20 61 6e 64 20 66 72 65 65 20 75 70 20 61 6c 6c   and free up all
3600: 20 69 74 73 20 6d 65 6d 6f 72 79 2e 0a 20 2a 09   its memory.. *.
3610: 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
3620: 64 20 6e 6f 74 20 75 73 65 20 62 69 6e 64 69 6e  d not use bindin
3630: 67 54 61 62 6c 65 20 61 67 61 69 6e 20 61 66 74  gTable again aft
3640: 65 72 0a 20 2a 09 74 68 69 73 20 70 72 6f 63 65  er. *.this proce
3650: 64 75 72 65 20 72 65 74 75 72 6e 73 2e 0a 20 2a  dure returns.. *
3660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3670: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
3680: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 65 6d   effects:. *.Mem
3690: 6f 72 79 20 69 73 20 66 72 65 65 64 2e 0a 20 2a  ory is freed.. *
36a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 5f 44  -. */..void.Tk_D
36f0: 65 6c 65 74 65 42 69 6e 64 69 6e 67 54 61 62 6c  eleteBindingTabl
3700: 65 28 62 69 6e 64 69 6e 67 54 61 62 6c 65 29 0a  e(bindingTable).
3710: 20 20 20 20 54 6b 5f 42 69 6e 64 69 6e 67 54 61      Tk_BindingTa
3720: 62 6c 65 20 62 69 6e 64 69 6e 67 54 61 62 6c 65  ble bindingTable
3730: 3b 09 2f 2a 20 54 6f 6b 65 6e 20 66 6f 72 20 74  ;./* Token for t
3740: 68 65 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65  he binding table
3750: 20 74 6f 0a 09 09 09 09 09 20 2a 20 64 65 73 74   to...... * dest
3760: 72 6f 79 2e 20 2a 2f 0a 7b 0a 20 20 20 20 42 69  roy. */.{.    Bi
3770: 6e 64 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e 64  ndingTable *bind
3780: 50 74 72 20 3d 20 28 42 69 6e 64 69 6e 67 54 61  Ptr = (BindingTa
3790: 62 6c 65 20 2a 29 20 62 69 6e 64 69 6e 67 54 61  ble *) bindingTa
37a0: 62 6c 65 3b 0a 20 20 20 20 50 61 74 53 65 71 20  ble;.    PatSeq 
37b0: 2a 70 73 50 74 72 2c 20 2a 6e 65 78 74 50 74 72  *psPtr, *nextPtr
37c0: 3b 0a 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e  ;.    Tcl_HashEn
37d0: 74 72 79 20 2a 68 50 74 72 3b 0a 20 20 20 20 54  try *hPtr;.    T
37e0: 63 6c 5f 48 61 73 68 53 65 61 72 63 68 20 73 65  cl_HashSearch se
37f0: 61 72 63 68 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  arch;..    /*.  
3800: 20 20 20 2a 20 46 69 6e 64 20 61 6e 64 20 64 65     * Find and de
3810: 6c 65 74 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lete all of the 
3820: 70 61 74 74 65 72 6e 73 20 61 73 73 6f 63 69 61  patterns associa
3830: 74 65 64 20 77 69 74 68 20 74 68 65 20 62 69 6e  ted with the bin
3840: 64 69 6e 67 0a 20 20 20 20 20 2a 20 74 61 62 6c  ding.     * tabl
3850: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
3860: 66 6f 72 20 28 68 50 74 72 20 3d 20 54 63 6c 5f  for (hPtr = Tcl_
3870: 46 69 72 73 74 48 61 73 68 45 6e 74 72 79 28 26  FirstHashEntry(&
3880: 62 69 6e 64 50 74 72 2d 3e 70 61 74 74 65 72 6e  bindPtr->pattern
3890: 54 61 62 6c 65 2c 20 26 73 65 61 72 63 68 29 3b  Table, &search);
38a0: 0a 09 20 20 20 20 68 50 74 72 20 21 3d 20 4e 55  ..    hPtr != NU
38b0: 4c 4c 3b 20 68 50 74 72 20 3d 20 54 63 6c 5f 4e  LL; hPtr = Tcl_N
38c0: 65 78 74 48 61 73 68 45 6e 74 72 79 28 26 73 65  extHashEntry(&se
38d0: 61 72 63 68 29 29 20 7b 0a 09 66 6f 72 20 28 70  arch)) {..for (p
38e0: 73 50 74 72 20 3d 20 28 50 61 74 53 65 71 20 2a  sPtr = (PatSeq *
38f0: 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c  ) Tcl_GetHashVal
3900: 75 65 28 68 50 74 72 29 3b 0a 09 09 70 73 50 74  ue(hPtr);...psPt
3910: 72 20 21 3d 20 4e 55 4c 4c 3b 20 70 73 50 74 72  r != NULL; psPtr
3920: 20 3d 20 6e 65 78 74 50 74 72 29 20 7b 0a 09 20   = nextPtr) {.. 
3930: 20 20 20 6e 65 78 74 50 74 72 20 3d 20 70 73 50     nextPtr = psP
3940: 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72 3b 0a  tr->nextSeqPtr;.
3950: 09 20 20 20 20 63 6b 66 72 65 65 28 28 63 68 61  .    ckfree((cha
3960: 72 20 2a 29 20 70 73 50 74 72 2d 3e 63 6f 6d 6d  r *) psPtr->comm
3970: 61 6e 64 29 3b 0a 09 20 20 20 20 63 6b 66 72 65  and);..    ckfre
3980: 65 28 28 63 68 61 72 20 2a 29 20 70 73 50 74 72  e((char *) psPtr
3990: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
39a0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6c 65 61 6e   /*.     * Clean
39b0: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
39c0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
39d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
39e0: 74 68 65 0a 20 20 20 20 20 2a 20 62 69 6e 64 69  the.     * bindi
39f0: 6e 67 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a  ng table..     *
3a00: 2f 0a 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74  /..    Tcl_Delet
3a10: 65 48 61 73 68 54 61 62 6c 65 28 26 62 69 6e 64  eHashTable(&bind
3a20: 50 74 72 2d 3e 70 61 74 74 65 72 6e 54 61 62 6c  Ptr->patternTabl
3a30: 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  e);.    Tcl_Dele
3a40: 74 65 48 61 73 68 54 61 62 6c 65 28 26 62 69 6e  teHashTable(&bin
3a50: 64 50 74 72 2d 3e 6f 62 6a 65 63 74 54 61 62 6c  dPtr->objectTabl
3a60: 65 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 28  e);.    ckfree((
3a70: 63 68 61 72 20 2a 29 20 62 69 6e 64 50 74 72 29  char *) bindPtr)
3a80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3ad0: 54 6b 5f 43 72 65 61 74 65 42 69 6e 64 69 6e 67  Tk_CreateBinding
3ae0: 20 2d 2d 0a 20 2a 0a 20 2a 09 41 64 64 20 61 20   --. *. *.Add a 
3af0: 62 69 6e 64 69 6e 67 20 74 6f 20 61 20 62 69 6e  binding to a bin
3b00: 64 69 6e 67 20 74 61 62 6c 65 2c 20 73 6f 20 74  ding table, so t
3b10: 68 61 74 20 66 75 74 75 72 65 20 63 61 6c 6c 73  hat future calls
3b20: 20 74 6f 0a 20 2a 09 54 6b 5f 42 69 6e 64 45 76   to. *.Tk_BindEv
3b30: 65 6e 74 20 6d 61 79 20 65 78 65 63 75 74 65 20  ent may execute 
3b40: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 74  the command in t
3b50: 68 65 20 62 69 6e 64 69 6e 67 2e 0a 20 2a 0a 20  he binding.. *. 
3b60: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
3b70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
3b80: 73 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72 20  s 0 if an error 
3b90: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 73  occurred while s
3ba0: 65 74 74 69 6e 67 0a 20 2a 09 75 70 20 74 68 65  etting. *.up the
3bb0: 20 62 69 6e 64 69 6e 67 2e 20 20 49 6e 20 74 68   binding.  In th
3bc0: 69 73 20 63 61 73 65 2c 20 61 6e 20 65 72 72 6f  is case, an erro
3bd0: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 62  r message will b
3be0: 65 0a 20 2a 09 6c 65 66 74 20 69 6e 20 69 6e 74  e. *.left in int
3bf0: 65 72 70 2d 3e 72 65 73 75 6c 74 2e 20 20 49 66  erp->result.  If
3c00: 20 61 6c 6c 20 77 65 6e 74 20 77 65 6c 6c 20 74   all went well t
3c10: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 0a 20  hen the return. 
3c20: 2a 09 76 61 6c 75 65 20 69 73 20 61 20 6d 61 73  *.value is a mas
3c30: 6b 20 6f 66 20 74 68 65 20 65 76 65 6e 74 20 74  k of the event t
3c40: 79 70 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  ypes that must b
3c50: 65 20 6d 61 64 65 0a 20 2a 09 61 76 61 69 6c 61  e made. *.availa
3c60: 62 6c 65 20 74 6f 20 54 6b 5f 42 69 6e 64 45 76  ble to Tk_BindEv
3c70: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
3c80: 70 72 6f 70 65 72 6c 79 20 64 65 74 65 63 74 20  properly detect 
3c90: 77 68 65 6e 0a 20 2a 09 74 68 69 73 20 62 69 6e  when. *.this bin
3ca0: 64 69 6e 67 20 74 72 69 67 67 65 72 73 2e 20 20  ding triggers.  
3cb0: 54 68 69 73 20 76 61 6c 75 65 20 63 61 6e 20 62  This value can b
3cc0: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
3cd0: 69 6e 65 0a 20 2a 09 77 68 61 74 20 65 76 65 6e  ine. *.what even
3ce0: 74 73 20 74 6f 20 73 65 6c 65 63 74 20 66 6f 72  ts to select for
3cf0: 20 69 6e 20 61 20 77 69 6e 64 6f 77 2c 20 66 6f   in a window, fo
3d00: 72 20 65 78 61 6d 70 6c 65 2e 0a 20 2a 0a 20 2a  r example.. *. *
3d10: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
3d20: 2a 09 54 68 65 20 6e 65 77 20 62 69 6e 64 69 6e  *.The new bindin
3d30: 67 20 6d 61 79 20 63 61 75 73 65 20 66 75 74 75  g may cause futu
3d40: 72 65 20 63 61 6c 6c 73 20 74 6f 20 54 6b 5f 42  re calls to Tk_B
3d50: 69 6e 64 45 76 65 6e 74 20 74 6f 0a 20 2a 09 62  indEvent to. *.b
3d60: 65 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 6c  ehave differentl
3d70: 79 20 74 68 61 6e 20 74 68 65 79 20 64 69 64 20  y than they did 
3d80: 70 72 65 76 69 6f 75 73 6c 79 2e 0a 20 2a 0a 20  previously.. *. 
3d90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3dd0: 20 2a 2f 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f   */..unsigned lo
3de0: 6e 67 0a 54 6b 5f 43 72 65 61 74 65 42 69 6e 64  ng.Tk_CreateBind
3df0: 69 6e 67 28 69 6e 74 65 72 70 2c 20 62 69 6e 64  ing(interp, bind
3e00: 69 6e 67 54 61 62 6c 65 2c 20 6f 62 6a 65 63 74  ingTable, object
3e10: 2c 20 65 76 65 6e 74 53 74 72 69 6e 67 2c 20 63  , eventString, c
3e20: 6f 6d 6d 61 6e 64 2c 20 61 70 70 65 6e 64 29 0a  ommand, append).
3e30: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3e40: 69 6e 74 65 72 70 3b 09 09 09 2f 2a 20 55 73 65  interp;.../* Use
3e50: 64 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f  d for error repo
3e60: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 54 6b  rting. */.    Tk
3e70: 5f 42 69 6e 64 69 6e 67 54 61 62 6c 65 20 62 69  _BindingTable bi
3e80: 6e 64 69 6e 67 54 61 62 6c 65 3b 09 2f 2a 20 54  ndingTable;./* T
3e90: 61 62 6c 65 20 69 6e 20 77 68 69 63 68 20 74 6f  able in which to
3ea0: 20 63 72 65 61 74 65 20 62 69 6e 64 69 6e 67 2e   create binding.
3eb0: 20 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61   */.    ClientDa
3ec0: 74 61 20 6f 62 6a 65 63 74 3b 09 09 09 2f 2a 20  ta object;.../* 
3ed0: 54 6f 6b 65 6e 20 66 6f 72 20 6f 62 6a 65 63 74  Token for object
3ee0: 20 77 69 74 68 20 77 68 69 63 68 20 62 69 6e 64   with which bind
3ef0: 69 6e 67 0a 09 09 09 09 09 20 2a 20 69 73 20 61  ing...... * is a
3f00: 73 73 6f 63 69 61 74 65 64 2e 20 2a 2f 0a 20 20  ssociated. */.  
3f10: 20 20 63 68 61 72 20 2a 65 76 65 6e 74 53 74 72    char *eventStr
3f20: 69 6e 67 3b 09 09 09 2f 2a 20 53 74 72 69 6e 67  ing;.../* String
3f30: 20 64 65 73 63 72 69 62 69 6e 67 20 65 76 65 6e   describing even
3f40: 74 20 73 65 71 75 65 6e 63 65 0a 09 09 09 09 09  t sequence......
3f50: 20 2a 20 74 68 61 74 20 74 72 69 67 67 65 72 73   * that triggers
3f60: 20 62 69 6e 64 69 6e 67 2e 20 2a 2f 0a 20 20 20   binding. */.   
3f70: 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 3b 09   char *command;.
3f80: 09 09 2f 2a 20 43 6f 6e 74 61 69 6e 73 20 54 63  ../* Contains Tc
3f90: 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65  l command to exe
3fa0: 63 75 74 65 0a 09 09 09 09 09 20 2a 20 77 68 65  cute...... * whe
3fb0: 6e 20 62 69 6e 64 69 6e 67 20 74 72 69 67 67 65  n binding trigge
3fc0: 72 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  rs. */.    int a
3fd0: 70 70 65 6e 64 3b 09 09 09 09 2f 2a 20 30 20 6d  ppend;..../* 0 m
3fe0: 65 61 6e 73 20 72 65 70 6c 61 63 65 20 61 6e 79  eans replace any
3ff0: 20 65 78 69 73 74 69 6e 67 0a 09 09 09 09 09 20   existing...... 
4000: 2a 20 62 69 6e 64 69 6e 67 20 66 6f 72 20 65 76  * binding for ev
4010: 65 6e 74 53 74 72 69 6e 67 3b 20 20 31 20 6d 65  entString;  1 me
4020: 61 6e 73 0a 09 09 09 09 09 20 2a 20 61 70 70 65  ans...... * appe
4030: 6e 64 20 74 6f 20 74 68 61 74 20 62 69 6e 64 69  nd to that bindi
4040: 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 42 69 6e  ng. */.{.    Bin
4050: 64 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e 64 50  dingTable *bindP
4060: 74 72 20 3d 20 28 42 69 6e 64 69 6e 67 54 61 62  tr = (BindingTab
4070: 6c 65 20 2a 29 20 62 69 6e 64 69 6e 67 54 61 62  le *) bindingTab
4080: 6c 65 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72  le;.    register
4090: 20 50 61 74 53 65 71 20 2a 70 73 50 74 72 3b 0a   PatSeq *psPtr;.
40a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
40b0: 67 20 65 76 65 6e 74 4d 61 73 6b 3b 0a 0a 20 20  g eventMask;..  
40c0: 20 20 70 73 50 74 72 20 3d 20 46 69 6e 64 53 65    psPtr = FindSe
40d0: 71 75 65 6e 63 65 28 69 6e 74 65 72 70 2c 20 62  quence(interp, b
40e0: 69 6e 64 50 74 72 2c 20 6f 62 6a 65 63 74 2c 20  indPtr, object, 
40f0: 65 76 65 6e 74 53 74 72 69 6e 67 2c 20 31 2c 20  eventString, 1, 
4100: 26 65 76 65 6e 74 4d 61 73 6b 29 3b 0a 20 20 20  &eventMask);.   
4110: 20 69 66 20 28 70 73 50 74 72 20 3d 3d 20 4e 55   if (psPtr == NU
4120: 4c 4c 29 20 7b 0a 09 69 66 20 28 65 76 65 6e 74  LL) {..if (event
4130: 4d 61 73 6b 29 20 7b 0a 09 20 20 20 20 54 63 6c  Mask) {..    Tcl
4140: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
4150: 65 72 70 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e  erp);..}..return
4160: 20 65 76 65 6e 74 4d 61 73 6b 3b 0a 20 20 20 20   eventMask;.    
4170: 7d 0a 20 20 20 20 69 66 20 28 61 70 70 65 6e 64  }.    if (append
4180: 20 26 26 20 28 70 73 50 74 72 2d 3e 63 6f 6d 6d   && (psPtr->comm
4190: 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 29 20 7b 0a  and != NULL)) {.
41a0: 09 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 09 63 68  .int length;..ch
41b0: 61 72 20 2a 6e 65 77 3b 0a 0a 09 6c 65 6e 67 74  ar *new;...lengt
41c0: 68 20 3d 20 73 74 72 6c 65 6e 28 70 73 50 74 72  h = strlen(psPtr
41d0: 2d 3e 63 6f 6d 6d 61 6e 64 29 20 2b 20 73 74 72  ->command) + str
41e0: 6c 65 6e 28 63 6f 6d 6d 61 6e 64 29 20 2b 20 32  len(command) + 2
41f0: 3b 0a 09 6e 65 77 20 3d 20 28 63 68 61 72 20 2a  ;..new = (char *
4200: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67  ) ckalloc((unsig
4210: 6e 65 64 29 20 6c 65 6e 67 74 68 29 3b 0a 09 73  ned) length);..s
4220: 70 72 69 6e 74 66 28 6e 65 77 2c 20 22 25 73 5c  printf(new, "%s\
4230: 6e 25 73 22 2c 20 70 73 50 74 72 2d 3e 63 6f 6d  n%s", psPtr->com
4240: 6d 61 6e 64 2c 20 63 6f 6d 6d 61 6e 64 29 3b 0a  mand, command);.
4250: 09 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29  .ckfree((char *)
4260: 20 70 73 50 74 72 2d 3e 63 6f 6d 6d 61 6e 64 29   psPtr->command)
4270: 3b 0a 09 70 73 50 74 72 2d 3e 63 6f 6d 6d 61 6e  ;..psPtr->comman
4280: 64 20 3d 20 6e 65 77 3b 0a 20 20 20 20 7d 20 65  d = new;.    } e
4290: 6c 73 65 20 7b 0a 09 69 66 20 28 70 73 50 74 72  lse {..if (psPtr
42a0: 2d 3e 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c  ->command != NUL
42b0: 4c 29 20 7b 0a 09 20 20 20 20 63 6b 66 72 65 65  L) {..    ckfree
42c0: 28 28 63 68 61 72 20 2a 29 20 70 73 50 74 72 2d  ((char *) psPtr-
42d0: 3e 63 6f 6d 6d 61 6e 64 29 3b 0a 09 7d 0a 09 70  >command);..}..p
42e0: 73 50 74 72 2d 3e 63 6f 6d 6d 61 6e 64 20 3d 20  sPtr->command = 
42f0: 28 63 68 61 72 20 2a 29 20 63 6b 61 6c 6c 6f 63  (char *) ckalloc
4300: 28 28 75 6e 73 69 67 6e 65 64 29 20 28 73 74 72  ((unsigned) (str
4310: 6c 65 6e 28 63 6f 6d 6d 61 6e 64 29 20 2b 20 31  len(command) + 1
4320: 29 29 3b 0a 09 73 74 72 63 70 79 28 70 73 50 74  ));..strcpy(psPt
4330: 72 2d 3e 63 6f 6d 6d 61 6e 64 2c 20 63 6f 6d 6d  r->command, comm
4340: 61 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  and);.    }.    
4350: 72 65 74 75 72 6e 20 65 76 65 6e 74 4d 61 73 6b  return eventMask
4360: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
43b0: 54 6b 5f 44 65 6c 65 74 65 42 69 6e 64 69 6e 67  Tk_DeleteBinding
43c0: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 6d 6f 76 65   --. *. *.Remove
43d0: 20 61 6e 20 65 76 65 6e 74 20 62 69 6e 64 69 6e   an event bindin
43e0: 67 20 66 72 6f 6d 20 61 20 62 69 6e 64 69 6e 67  g from a binding
43f0: 20 74 61 62 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65   table.. *. * Re
4400: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65  sults:. *.The re
4410: 73 75 6c 74 20 69 73 20 61 20 73 74 61 6e 64 61  sult is a standa
4420: 72 64 20 54 63 6c 20 72 65 74 75 72 6e 20 76 61  rd Tcl return va
4430: 6c 75 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  lue.  If an erro
4440: 72 0a 20 2a 09 6f 63 63 75 72 73 20 74 68 65 6e  r. *.occurs then
4450: 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 20   interp->result 
4460: 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 6e 20  will contain an 
4470: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20  error message.. 
4480: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4490: 73 3a 0a 20 2a 09 54 68 65 20 62 69 6e 64 69 6e  s:. *.The bindin
44a0: 67 20 67 69 76 65 6e 20 62 79 20 6f 62 6a 65 63  g given by objec
44b0: 74 20 61 6e 64 20 65 76 65 6e 74 53 74 72 69 6e  t and eventStrin
44c0: 67 20 69 73 20 72 65 6d 6f 76 65 64 0a 20 2a 09  g is removed. *.
44d0: 66 72 6f 6d 20 62 69 6e 64 69 6e 67 54 61 62 6c  from bindingTabl
44e0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4520: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a  ------. */..int.
4530: 54 6b 5f 44 65 6c 65 74 65 42 69 6e 64 69 6e 67  Tk_DeleteBinding
4540: 28 69 6e 74 65 72 70 2c 20 62 69 6e 64 69 6e 67  (interp, binding
4550: 54 61 62 6c 65 2c 20 6f 62 6a 65 63 74 2c 20 65  Table, object, e
4560: 76 65 6e 74 53 74 72 69 6e 67 29 0a 20 20 20 20  ventString).    
4570: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4580: 72 70 3b 09 09 09 2f 2a 20 55 73 65 64 20 66 6f  rp;.../* Used fo
4590: 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  r error reportin
45a0: 67 2e 20 2a 2f 0a 20 20 20 20 54 6b 5f 42 69 6e  g. */.    Tk_Bin
45b0: 64 69 6e 67 54 61 62 6c 65 20 62 69 6e 64 69 6e  dingTable bindin
45c0: 67 54 61 62 6c 65 3b 09 2f 2a 20 54 61 62 6c 65  gTable;./* Table
45d0: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 64 65 6c   in which to del
45e0: 65 74 65 20 62 69 6e 64 69 6e 67 2e 20 2a 2f 0a  ete binding. */.
45f0: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 6f      ClientData o
4600: 62 6a 65 63 74 3b 09 09 09 2f 2a 20 54 6f 6b 65  bject;.../* Toke
4610: 6e 20 66 6f 72 20 6f 62 6a 65 63 74 20 77 69 74  n for object wit
4620: 68 20 77 68 69 63 68 20 62 69 6e 64 69 6e 67 0a  h which binding.
4630: 09 09 09 09 09 20 2a 20 69 73 20 61 73 73 6f 63  ..... * is assoc
4640: 69 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 63 68  iated. */.    ch
4650: 61 72 20 2a 65 76 65 6e 74 53 74 72 69 6e 67 3b  ar *eventString;
4660: 09 09 09 2f 2a 20 53 74 72 69 6e 67 20 64 65 73  .../* String des
4670: 63 72 69 62 69 6e 67 20 65 76 65 6e 74 20 73 65  cribing event se
4680: 71 75 65 6e 63 65 0a 09 09 09 09 09 20 2a 20 74  quence...... * t
4690: 68 61 74 20 74 72 69 67 67 65 72 73 20 62 69 6e  hat triggers bin
46a0: 64 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 42  ding. */.{.    B
46b0: 69 6e 64 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e  indingTable *bin
46c0: 64 50 74 72 20 3d 20 28 42 69 6e 64 69 6e 67 54  dPtr = (BindingT
46d0: 61 62 6c 65 20 2a 29 20 62 69 6e 64 69 6e 67 54  able *) bindingT
46e0: 61 62 6c 65 3b 0a 20 20 20 20 72 65 67 69 73 74  able;.    regist
46f0: 65 72 20 50 61 74 53 65 71 20 2a 70 73 50 74 72  er PatSeq *psPtr
4700: 2c 20 2a 70 72 65 76 50 74 72 3b 0a 20 20 20 20  , *prevPtr;.    
4710: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 76  unsigned long ev
4720: 65 6e 74 4d 61 73 6b 3b 0a 20 20 20 20 54 63 6c  entMask;.    Tcl
4730: 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72  _HashEntry *hPtr
4740: 3b 0a 0a 20 20 20 20 70 73 50 74 72 20 3d 20 46  ;..    psPtr = F
4750: 69 6e 64 53 65 71 75 65 6e 63 65 28 69 6e 74 65  indSequence(inte
4760: 72 70 2c 20 62 69 6e 64 50 74 72 2c 20 6f 62 6a  rp, bindPtr, obj
4770: 65 63 74 2c 20 65 76 65 6e 74 53 74 72 69 6e 67  ect, eventString
4780: 2c 20 30 2c 20 26 65 76 65 6e 74 4d 61 73 6b 29  , 0, &eventMask)
4790: 3b 0a 20 20 20 20 69 66 20 28 70 73 50 74 72 20  ;.    if (psPtr 
47a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
47b0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
47c0: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  rp);..return TCL
47d0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
47e0: 2f 2a 0a 20 20 20 20 20 2a 20 55 6e 6c 69 6e 6b  /*.     * Unlink
47f0: 20 74 68 65 20 62 69 6e 64 69 6e 67 20 66 72 6f   the binding fro
4800: 6d 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 69  m the list for i
4810: 74 73 20 6f 62 6a 65 63 74 2c 20 74 68 65 6e 20  ts object, then 
4820: 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 2a 20  from the.     * 
4830: 6c 69 73 74 20 66 6f 72 20 69 74 73 20 70 61 74  list for its pat
4840: 74 65 72 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  tern..     */.. 
4850: 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 46 69     hPtr = Tcl_Fi
4860: 6e 64 48 61 73 68 45 6e 74 72 79 28 26 62 69 6e  ndHashEntry(&bin
4870: 64 50 74 72 2d 3e 6f 62 6a 65 63 74 54 61 62 6c  dPtr->objectTabl
4880: 65 2c 20 28 63 68 61 72 20 2a 29 20 6f 62 6a 65  e, (char *) obje
4890: 63 74 29 3b 0a 20 20 20 20 69 66 20 28 68 50 74  ct);.    if (hPt
48a0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 70 61  r == NULL) {..pa
48b0: 6e 69 63 28 22 54 6b 5f 44 65 6c 65 74 65 42 69  nic("Tk_DeleteBi
48c0: 6e 64 69 6e 67 20 63 6f 75 6c 64 6e 27 74 20 66  nding couldn't f
48d0: 69 6e 64 20 6f 62 6a 65 63 74 20 74 61 62 6c 65  ind object table
48e0: 20 65 6e 74 72 79 22 29 3b 0a 20 20 20 20 7d 0a   entry");.    }.
48f0: 20 20 20 20 70 72 65 76 50 74 72 20 3d 20 28 50      prevPtr = (P
4900: 61 74 53 65 71 20 2a 29 20 54 63 6c 5f 47 65 74  atSeq *) Tcl_Get
4910: 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b  HashValue(hPtr);
4920: 0a 20 20 20 20 69 66 20 28 70 72 65 76 50 74 72  .    if (prevPtr
4930: 20 3d 3d 20 70 73 50 74 72 29 20 7b 0a 09 54 63   == psPtr) {..Tc
4940: 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 68  l_SetHashValue(h
4950: 50 74 72 2c 20 70 73 50 74 72 2d 3e 6e 65 78 74  Ptr, psPtr->next
4960: 4f 62 6a 50 74 72 29 3b 0a 20 20 20 20 7d 20 65  ObjPtr);.    } e
4970: 6c 73 65 20 7b 0a 09 66 6f 72 20 28 20 3b 20 3b  lse {..for ( ; ;
4980: 20 70 72 65 76 50 74 72 20 3d 20 70 72 65 76 50   prevPtr = prevP
4990: 74 72 2d 3e 6e 65 78 74 4f 62 6a 50 74 72 29 20  tr->nextObjPtr) 
49a0: 7b 0a 09 20 20 20 20 69 66 20 28 70 72 65 76 50  {..    if (prevP
49b0: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  tr == NULL) {...
49c0: 70 61 6e 69 63 28 22 54 6b 5f 44 65 6c 65 74 65  panic("Tk_Delete
49d0: 42 69 6e 64 69 6e 67 20 63 6f 75 6c 64 6e 27 74  Binding couldn't
49e0: 20 66 69 6e 64 20 6f 6e 20 6f 62 6a 65 63 74 20   find on object 
49f0: 6c 69 73 74 22 29 3b 0a 09 20 20 20 20 7d 0a 09  list");..    }..
4a00: 20 20 20 20 69 66 20 28 70 72 65 76 50 74 72 2d      if (prevPtr-
4a10: 3e 6e 65 78 74 4f 62 6a 50 74 72 20 3d 3d 20 70  >nextObjPtr == p
4a20: 73 50 74 72 29 20 7b 0a 09 09 70 72 65 76 50 74  sPtr) {...prevPt
4a30: 72 2d 3e 6e 65 78 74 4f 62 6a 50 74 72 20 3d 20  r->nextObjPtr = 
4a40: 70 73 50 74 72 2d 3e 6e 65 78 74 4f 62 6a 50 74  psPtr->nextObjPt
4a50: 72 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20  r;...break;..   
4a60: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
4a70: 70 72 65 76 50 74 72 20 3d 20 28 50 61 74 53 65  prevPtr = (PatSe
4a80: 71 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68  q *) Tcl_GetHash
4a90: 56 61 6c 75 65 28 70 73 50 74 72 2d 3e 68 50 74  Value(psPtr->hPt
4aa0: 72 29 3b 0a 20 20 20 20 69 66 20 28 70 72 65 76  r);.    if (prev
4ab0: 50 74 72 20 3d 3d 20 70 73 50 74 72 29 20 7b 0a  Ptr == psPtr) {.
4ac0: 09 69 66 20 28 70 73 50 74 72 2d 3e 6e 65 78 74  .if (psPtr->next
4ad0: 53 65 71 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  SeqPtr == NULL) 
4ae0: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c 65 74  {..    Tcl_Delet
4af0: 65 48 61 73 68 45 6e 74 72 79 28 70 73 50 74 72  eHashEntry(psPtr
4b00: 2d 3e 68 50 74 72 29 3b 0a 09 7d 20 65 6c 73 65  ->hPtr);..} else
4b10: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 48   {..    Tcl_SetH
4b20: 61 73 68 56 61 6c 75 65 28 70 73 50 74 72 2d 3e  ashValue(psPtr->
4b30: 68 50 74 72 2c 20 70 73 50 74 72 2d 3e 6e 65 78  hPtr, psPtr->nex
4b40: 74 53 65 71 50 74 72 29 3b 0a 09 7d 0a 20 20 20  tSeqPtr);..}.   
4b50: 20 7d 20 65 6c 73 65 20 7b 0a 09 66 6f 72 20 28   } else {..for (
4b60: 20 3b 20 3b 20 70 72 65 76 50 74 72 20 3d 20 70   ; ; prevPtr = p
4b70: 72 65 76 50 74 72 2d 3e 6e 65 78 74 53 65 71 50  revPtr->nextSeqP
4b80: 74 72 29 20 7b 0a 09 20 20 20 20 69 66 20 28 70  tr) {..    if (p
4b90: 72 65 76 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  revPtr == NULL) 
4ba0: 7b 0a 09 09 70 61 6e 69 63 28 22 54 6b 5f 44 65  {...panic("Tk_De
4bb0: 6c 65 74 65 42 69 6e 64 69 6e 67 20 63 6f 75 6c  leteBinding coul
4bc0: 64 6e 27 74 20 66 69 6e 64 20 6f 6e 20 68 61 73  dn't find on has
4bd0: 68 20 63 68 61 69 6e 22 29 3b 0a 09 20 20 20 20  h chain");..    
4be0: 7d 0a 09 20 20 20 20 69 66 20 28 70 72 65 76 50  }..    if (prevP
4bf0: 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72 20 3d  tr->nextSeqPtr =
4c00: 3d 20 70 73 50 74 72 29 20 7b 0a 09 09 70 72 65  = psPtr) {...pre
4c10: 76 50 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72  vPtr->nextSeqPtr
4c20: 20 3d 20 70 73 50 74 72 2d 3e 6e 65 78 74 53 65   = psPtr->nextSe
4c30: 71 50 74 72 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  qPtr;...break;..
4c40: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20      }..}.    }. 
4c50: 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20     ckfree((char 
4c60: 2a 29 20 70 73 50 74 72 2d 3e 63 6f 6d 6d 61 6e  *) psPtr->comman
4c70: 64 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 28  d);.    ckfree((
4c80: 63 68 61 72 20 2a 29 20 70 73 50 74 72 29 3b 0a  char *) psPtr);.
4c90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
4ca0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4cf0: 20 54 6b 5f 47 65 74 42 69 6e 64 69 6e 67 20 2d   Tk_GetBinding -
4d00: 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 74  -. *. *.Return t
4d10: 68 65 20 63 6f 6d 6d 61 6e 64 20 61 73 73 6f 63  he command assoc
4d20: 69 61 74 65 64 20 77 69 74 68 20 61 20 67 69 76  iated with a giv
4d30: 65 6e 20 65 76 65 6e 74 20 73 74 72 69 6e 67 2e  en event string.
4d40: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
4d50: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61   *.The return va
4d60: 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
4d70: 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   to the command 
4d80: 73 74 72 69 6e 67 0a 20 2a 09 61 73 73 6f 63 69  string. *.associ
4d90: 61 74 65 64 20 77 69 74 68 20 65 76 65 6e 74 53  ated with eventS
4da0: 74 72 69 6e 67 20 66 6f 72 20 6f 62 6a 65 63 74  tring for object
4db0: 20 69 6e 20 74 68 65 20 64 6f 6d 61 69 6e 0a 20   in the domain. 
4dc0: 2a 09 67 69 76 65 6e 20 62 79 20 62 69 6e 64 69  *.given by bindi
4dd0: 6e 67 54 61 62 6c 65 2e 20 20 49 66 20 74 68 65  ngTable.  If the
4de0: 72 65 20 69 73 20 6e 6f 20 62 69 6e 64 69 6e 67  re is no binding
4df0: 20 66 6f 72 0a 20 2a 09 65 76 65 6e 74 53 74 72   for. *.eventStr
4e00: 69 6e 67 2c 20 6f 72 20 69 66 20 65 76 65 6e 74  ing, or if event
4e10: 53 74 72 69 6e 67 20 69 73 20 69 6d 70 72 6f 70  String is improp
4e20: 65 72 6c 79 20 66 6f 72 6d 65 64 2c 0a 20 2a 09  erly formed,. *.
4e30: 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 72 65 74  then NULL is ret
4e40: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
4e50: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
4e60: 66 74 20 69 6e 0a 20 2a 09 69 6e 74 65 72 70 2d  ft in. *.interp-
4e70: 3e 72 65 73 75 6c 74 2e 20 20 54 68 65 20 72 65  >result.  The re
4e80: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 73 65  turn value is se
4e90: 6d 69 2d 73 74 61 74 69 63 3a 20 20 69 74 0a 20  mi-static:  it. 
4ea0: 2a 09 77 69 6c 6c 20 70 65 72 73 69 73 74 20 75  *.will persist u
4eb0: 6e 74 69 6c 20 74 68 65 20 62 69 6e 64 69 6e 67  ntil the binding
4ec0: 20 69 73 20 63 68 61 6e 67 65 64 20 6f 72 20 64   is changed or d
4ed0: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 53 69  eleted.. *. * Si
4ee0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
4ef0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 63 68  --------. */..ch
4f40: 61 72 20 2a 0a 54 6b 5f 47 65 74 42 69 6e 64 69  ar *.Tk_GetBindi
4f50: 6e 67 28 69 6e 74 65 72 70 2c 20 62 69 6e 64 69  ng(interp, bindi
4f60: 6e 67 54 61 62 6c 65 2c 20 6f 62 6a 65 63 74 2c  ngTable, object,
4f70: 20 65 76 65 6e 74 53 74 72 69 6e 67 29 0a 20 20   eventString).  
4f80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4f90: 74 65 72 70 3b 09 09 09 2f 2a 20 49 6e 74 65 72  terp;.../* Inter
4fa0: 70 72 65 74 65 72 20 66 6f 72 20 65 72 72 6f 72  preter for error
4fb0: 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20   reporting. */. 
4fc0: 20 20 20 54 6b 5f 42 69 6e 64 69 6e 67 54 61 62     Tk_BindingTab
4fd0: 6c 65 20 62 69 6e 64 69 6e 67 54 61 62 6c 65 3b  le bindingTable;
4fe0: 09 2f 2a 20 54 61 62 6c 65 20 69 6e 20 77 68 69  ./* Table in whi
4ff0: 63 68 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 0a 09  ch to look for..
5000: 09 09 09 09 20 2a 20 62 69 6e 64 69 6e 67 2e 20  .... * binding. 
5010: 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  */.    ClientDat
5020: 61 20 6f 62 6a 65 63 74 3b 09 09 09 2f 2a 20 54  a object;.../* T
5030: 6f 6b 65 6e 20 66 6f 72 20 6f 62 6a 65 63 74 20  oken for object 
5040: 77 69 74 68 20 77 68 69 63 68 20 62 69 6e 64 69  with which bindi
5050: 6e 67 0a 09 09 09 09 09 20 2a 20 69 73 20 61 73  ng...... * is as
5060: 73 6f 63 69 61 74 65 64 2e 20 2a 2f 0a 20 20 20  sociated. */.   
5070: 20 63 68 61 72 20 2a 65 76 65 6e 74 53 74 72 69   char *eventStri
5080: 6e 67 3b 09 09 09 2f 2a 20 53 74 72 69 6e 67 20  ng;.../* String 
5090: 64 65 73 63 72 69 62 69 6e 67 20 65 76 65 6e 74  describing event
50a0: 20 73 65 71 75 65 6e 63 65 0a 09 09 09 09 09 20   sequence...... 
50b0: 2a 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20  * that triggers 
50c0: 62 69 6e 64 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20  binding. */.{.  
50d0: 20 20 42 69 6e 64 69 6e 67 54 61 62 6c 65 20 2a    BindingTable *
50e0: 62 69 6e 64 50 74 72 20 3d 20 28 42 69 6e 64 69  bindPtr = (Bindi
50f0: 6e 67 54 61 62 6c 65 20 2a 29 20 62 69 6e 64 69  ngTable *) bindi
5100: 6e 67 54 61 62 6c 65 3b 0a 20 20 20 20 72 65 67  ngTable;.    reg
5110: 69 73 74 65 72 20 50 61 74 53 65 71 20 2a 70 73  ister PatSeq *ps
5120: 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Ptr;.    unsigne
5130: 64 20 6c 6f 6e 67 20 65 76 65 6e 74 4d 61 73 6b  d long eventMask
5140: 3b 0a 0a 20 20 20 20 70 73 50 74 72 20 3d 20 46  ;..    psPtr = F
5150: 69 6e 64 53 65 71 75 65 6e 63 65 28 69 6e 74 65  indSequence(inte
5160: 72 70 2c 20 62 69 6e 64 50 74 72 2c 20 6f 62 6a  rp, bindPtr, obj
5170: 65 63 74 2c 20 65 76 65 6e 74 53 74 72 69 6e 67  ect, eventString
5180: 2c 20 30 2c 20 26 65 76 65 6e 74 4d 61 73 6b 29  , 0, &eventMask)
5190: 3b 0a 20 20 20 20 69 66 20 28 70 73 50 74 72 20  ;.    if (psPtr 
51a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
51b0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
51c0: 20 20 20 72 65 74 75 72 6e 20 70 73 50 74 72 2d     return psPtr-
51d0: 3e 63 6f 6d 6d 61 6e 64 3b 0a 7d 0a 0c 0a 2f 2a  >command;.}.../*
51e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 0a 20 2a 0a 20 2a 20 54 6b 5f 47 65 74 41 6c  -. *. * Tk_GetAl
5230: 6c 42 69 6e 64 69 6e 67 73 20 2d 2d 0a 20 2a 0a  lBindings --. *.
5240: 20 2a 09 52 65 74 75 72 6e 20 61 20 6c 69 73 74   *.Return a list
5250: 20 6f 66 20 65 76 65 6e 74 20 73 74 72 69 6e 67   of event string
5260: 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 62 69  s for all the bi
5270: 6e 64 69 6e 67 73 0a 20 2a 09 61 73 73 6f 63 69  ndings. *.associ
5280: 61 74 65 64 20 77 69 74 68 20 61 20 67 69 76 65  ated with a give
5290: 6e 20 6f 62 6a 65 63 74 2e 0a 20 2a 0a 20 2a 20  n object.. *. * 
52a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 72  Results:. *.Ther
52b0: 65 20 69 73 20 6e 6f 20 72 65 74 75 72 6e 20 76  e is no return v
52c0: 61 6c 75 65 2e 20 20 49 6e 74 65 72 70 2d 3e 72  alue.  Interp->r
52d0: 65 73 75 6c 74 20 69 73 20 6d 6f 64 69 66 69 65  esult is modifie
52e0: 64 20 74 6f 0a 20 2a 09 68 6f 6c 64 20 61 20 54  d to. *.hold a T
52f0: 63 6c 20 6c 69 73 74 20 77 69 74 68 20 6f 6e 65  cl list with one
5300: 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
5310: 62 69 6e 64 69 6e 67 20 61 73 73 6f 63 69 61 74  binding associat
5320: 65 64 0a 20 2a 09 77 69 74 68 20 6f 62 6a 65 63  ed. *.with objec
5330: 74 20 69 6e 20 62 69 6e 64 69 6e 67 54 61 62 6c  t in bindingTabl
5340: 65 2e 20 20 45 61 63 68 20 65 6e 74 72 79 20 69  e.  Each entry i
5350: 6e 20 74 68 65 20 6c 69 73 74 0a 20 2a 09 63 6f  n the list. *.co
5360: 6e 74 61 69 6e 73 20 74 68 65 20 65 76 65 6e 74  ntains the event
5370: 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74   string associat
5380: 65 64 20 77 69 74 68 20 6f 6e 65 20 62 69 6e 64  ed with one bind
5390: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
53a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
53b0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a  -----. */..void.
5400: 54 6b 5f 47 65 74 41 6c 6c 42 69 6e 64 69 6e 67  Tk_GetAllBinding
5410: 73 28 69 6e 74 65 72 70 2c 20 62 69 6e 64 69 6e  s(interp, bindin
5420: 67 54 61 62 6c 65 2c 20 6f 62 6a 65 63 74 29 0a  gTable, object).
5430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
5440: 69 6e 74 65 72 70 3b 09 09 09 2f 2a 20 49 6e 74  interp;.../* Int
5450: 65 72 70 72 65 74 65 72 20 72 65 74 75 72 6e 69  erpreter returni
5460: 6e 67 20 72 65 73 75 6c 74 20 6f 72 0a 09 09 09  ng result or....
5470: 09 09 20 2a 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  .. * error. */. 
5480: 20 20 20 54 6b 5f 42 69 6e 64 69 6e 67 54 61 62     Tk_BindingTab
5490: 6c 65 20 62 69 6e 64 69 6e 67 54 61 62 6c 65 3b  le bindingTable;
54a0: 09 2f 2a 20 54 61 62 6c 65 20 69 6e 20 77 68 69  ./* Table in whi
54b0: 63 68 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 0a 09  ch to look for..
54c0: 09 09 09 09 20 2a 20 62 69 6e 64 69 6e 67 73 2e  .... * bindings.
54d0: 20 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61   */.    ClientDa
54e0: 74 61 20 6f 62 6a 65 63 74 3b 09 09 09 2f 2a 20  ta object;.../* 
54f0: 54 6f 6b 65 6e 20 66 6f 72 20 6f 62 6a 65 63 74  Token for object
5500: 2e 20 2a 2f 0a 0a 7b 0a 20 20 20 20 42 69 6e 64  . */..{.    Bind
5510: 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e 64 50 74  ingTable *bindPt
5520: 72 20 3d 20 28 42 69 6e 64 69 6e 67 54 61 62 6c  r = (BindingTabl
5530: 65 20 2a 29 20 62 69 6e 64 69 6e 67 54 61 62 6c  e *) bindingTabl
5540: 65 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  e;.    register 
5550: 50 61 74 53 65 71 20 2a 70 73 50 74 72 3b 0a 20  PatSeq *psPtr;. 
5560: 20 20 20 72 65 67 69 73 74 65 72 20 50 61 74 74     register Patt
5570: 65 72 6e 20 2a 70 61 74 50 74 72 3b 0a 20 20 20  ern *patPtr;.   
5580: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a   Tcl_HashEntry *
5590: 68 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 44 53  hPtr;.    Tcl_DS
55a0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 63 68  tring ds;.    ch
55b0: 61 72 20 63 2c 20 62 75 66 66 65 72 5b 31 30 5d  ar c, buffer[10]
55c0: 3b 0a 20 20 20 20 69 6e 74 20 70 61 74 73 4c 65  ;.    int patsLe
55d0: 66 74 2c 20 6e 65 65 64 4d 6f 64 73 3b 0a 20 20  ft, needMods;.  
55e0: 20 20 72 65 67 69 73 74 65 72 20 4d 6f 64 49 6e    register ModIn
55f0: 66 6f 20 2a 6d 6f 64 50 74 72 3b 0a 20 20 20 20  fo *modPtr;.    
5600: 72 65 67 69 73 74 65 72 20 45 76 65 6e 74 49 6e  register EventIn
5610: 66 6f 20 2a 65 69 50 74 72 3b 0a 0a 20 20 20 20  fo *eiPtr;..    
5620: 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48  hPtr = Tcl_FindH
5630: 61 73 68 45 6e 74 72 79 28 26 62 69 6e 64 50 74  ashEntry(&bindPt
5640: 72 2d 3e 6f 62 6a 65 63 74 54 61 62 6c 65 2c 20  r->objectTable, 
5650: 28 63 68 61 72 20 2a 29 20 6f 62 6a 65 63 74 29  (char *) object)
5660: 3b 0a 20 20 20 20 69 66 20 28 68 50 74 72 20 3d  ;.    if (hPtr =
5670: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
5680: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  n;.    }.    Tcl
5690: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
56a0: 29 3b 0a 20 20 20 20 66 6f 72 20 28 70 73 50 74  );.    for (psPt
56b0: 72 20 3d 20 28 50 61 74 53 65 71 20 2a 29 20 54  r = (PatSeq *) T
56c0: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28  cl_GetHashValue(
56d0: 68 50 74 72 29 3b 20 70 73 50 74 72 20 21 3d 20  hPtr); psPtr != 
56e0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 70 73 50 74 72  NULL;..    psPtr
56f0: 20 3d 20 70 73 50 74 72 2d 3e 6e 65 78 74 4f 62   = psPtr->nextOb
5700: 6a 50 74 72 29 20 7b 0a 09 54 63 6c 5f 44 53 74  jPtr) {..Tcl_DSt
5710: 72 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 64  ringSetLength(&d
5720: 73 2c 20 30 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  s, 0);.../*.. * 
5730: 46 6f 72 20 65 61 63 68 20 62 69 6e 64 69 6e 67  For each binding
5740: 2c 20 6f 75 74 70 75 74 20 69 6e 66 6f 72 6d 61  , output informa
5750: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
5760: 6f 66 20 74 68 65 0a 09 20 2a 20 70 61 74 74 65  of the.. * patte
5770: 72 6e 73 20 69 6e 20 69 74 73 20 73 65 71 75 65  rns in its seque
5780: 6e 63 65 2e 20 20 54 68 65 20 6f 72 64 65 72 20  nce.  The order 
5790: 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e 73 20  of the patterns 
57a0: 69 6e 0a 09 20 2a 20 74 68 65 20 73 65 71 75 65  in.. * the seque
57b0: 6e 63 65 20 69 73 20 62 61 63 6b 77 61 72 64 73  nce is backwards
57c0: 20 66 72 6f 6d 20 74 68 65 20 6f 72 64 65 72 20   from the order 
57d0: 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 09 20  in which they.. 
57e0: 2a 20 6d 75 73 74 20 62 65 20 6f 75 74 70 75 74  * must be output
57f0: 2e 0a 09 20 2a 2f 0a 0a 09 66 6f 72 20 28 70 61  ... */...for (pa
5800: 74 73 4c 65 66 74 20 3d 20 70 73 50 74 72 2d 3e  tsLeft = psPtr->
5810: 6e 75 6d 50 61 74 73 2c 0a 09 09 70 61 74 50 74  numPats,...patPt
5820: 72 20 3d 20 26 70 73 50 74 72 2d 3e 70 61 74 73  r = &psPtr->pats
5830: 5b 70 73 50 74 72 2d 3e 6e 75 6d 50 61 74 73 20  [psPtr->numPats 
5840: 2d 20 31 5d 3b 0a 09 09 70 61 74 73 4c 65 66 74  - 1];...patsLeft
5850: 20 3e 20 30 3b 20 70 61 74 73 4c 65 66 74 2d 2d   > 0; patsLeft--
5860: 2c 20 70 61 74 50 74 72 2d 2d 29 20 7b 0a 0a 09  , patPtr--) {...
5870: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 43      /*..     * C
5880: 68 65 63 6b 20 66 6f 72 20 73 69 6d 70 6c 65 20  heck for simple 
5890: 63 61 73 65 20 6f 66 20 61 6e 20 41 53 43 49 49  case of an ASCII
58a0: 20 63 68 61 72 61 63 74 65 72 2e 0a 09 20 20 20   character...   
58b0: 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 28    */...    if ((
58c0: 70 61 74 50 74 72 2d 3e 65 76 65 6e 74 54 79 70  patPtr->eventTyp
58d0: 65 20 3d 3d 20 43 54 4b 5f 4b 45 59 5f 45 56 45  e == CTK_KEY_EVE
58e0: 4e 54 29 0a 09 09 20 20 20 20 26 26 20 28 70 61  NT)...    && (pa
58f0: 74 50 74 72 2d 3e 6e 65 65 64 4d 6f 64 73 20 3d  tPtr->needMods =
5900: 3d 20 30 29 0a 09 09 20 20 20 20 26 26 20 28 70  = 0)...    && (p
5910: 61 74 50 74 72 2d 3e 64 65 74 61 69 6c 20 3c 20  atPtr->detail < 
5920: 31 32 38 29 0a 09 09 20 20 20 20 26 26 20 69 73  128)...    && is
5930: 70 72 69 6e 74 28 55 43 48 41 52 28 70 61 74 50  print(UCHAR(patP
5940: 74 72 2d 3e 64 65 74 61 69 6c 29 29 0a 09 09 20  tr->detail))... 
5950: 20 20 20 26 26 20 28 70 61 74 50 74 72 2d 3e 64     && (patPtr->d
5960: 65 74 61 69 6c 20 21 3d 20 27 3c 27 29 0a 09 09  etail != '<')...
5970: 20 20 20 20 26 26 20 28 70 61 74 50 74 72 2d 3e      && (patPtr->
5980: 64 65 74 61 69 6c 20 21 3d 20 27 20 27 29 29 20  detail != ' ')) 
5990: 7b 0a 0a 09 09 63 20 3d 20 70 61 74 50 74 72 2d  {....c = patPtr-
59a0: 3e 64 65 74 61 69 6c 3b 0a 09 09 54 63 6c 5f 44  >detail;...Tcl_D
59b0: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73  StringAppend(&ds
59c0: 2c 20 26 63 2c 20 31 29 3b 0a 09 09 63 6f 6e 74  , &c, 1);...cont
59d0: 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  inue;..    }... 
59e0: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 74     /*..     * It
59f0: 27 73 20 61 20 6d 6f 72 65 20 67 65 6e 65 72 61  's a more genera
5a00: 6c 20 65 76 65 6e 74 20 73 70 65 63 69 66 69 63  l event specific
5a10: 61 74 69 6f 6e 2e 20 20 46 69 72 73 74 20 63 68  ation.  First ch
5a20: 65 63 6b 0a 09 20 20 20 20 20 2a 20 66 6f 72 20  eck..     * for 
5a30: 22 44 6f 75 62 6c 65 22 20 6f 72 20 22 54 72 69  "Double" or "Tri
5a40: 70 6c 65 22 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ple", then modif
5a50: 69 65 72 73 2c 20 74 68 65 6e 20 65 76 65 6e 74  iers, then event
5a60: 20 74 79 70 65 2c 0a 09 20 20 20 20 20 2a 20 74   type,..     * t
5a70: 68 65 6e 20 6b 65 79 73 79 6d 20 6f 72 20 62 75  hen keysym or bu
5a80: 74 74 6f 6e 20 64 65 74 61 69 6c 2e 0a 09 20 20  tton detail...  
5a90: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f     */...    Tcl_
5aa0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
5ab0: 73 2c 20 22 3c 22 2c 20 31 29 3b 0a 09 20 20 20  s, "<", 1);..   
5ac0: 20 69 66 20 28 28 70 61 74 73 4c 65 66 74 20 3e   if ((patsLeft >
5ad0: 20 31 29 20 26 26 20 28 6d 65 6d 63 6d 70 28 28   1) && (memcmp((
5ae0: 63 68 61 72 20 2a 29 20 70 61 74 50 74 72 2c 0a  char *) patPtr,.
5af0: 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 28  ..    (char *) (
5b00: 70 61 74 50 74 72 2d 31 29 2c 20 73 69 7a 65 6f  patPtr-1), sizeo
5b10: 66 28 50 61 74 74 65 72 6e 29 29 20 3d 3d 20 30  f(Pattern)) == 0
5b20: 29 29 20 7b 0a 09 09 70 61 74 73 4c 65 66 74 2d  )) {...patsLeft-
5b30: 2d 3b 0a 09 09 70 61 74 50 74 72 2d 2d 3b 0a 09  -;...patPtr--;..
5b40: 09 69 66 20 28 28 70 61 74 73 4c 65 66 74 20 3e  .if ((patsLeft >
5b50: 20 31 29 20 26 26 20 28 6d 65 6d 63 6d 70 28 28   1) && (memcmp((
5b60: 63 68 61 72 20 2a 29 20 70 61 74 50 74 72 2c 0a  char *) patPtr,.
5b70: 09 09 09 28 63 68 61 72 20 2a 29 20 28 70 61 74  ...(char *) (pat
5b80: 50 74 72 2d 31 29 2c 20 73 69 7a 65 6f 66 28 50  Ptr-1), sizeof(P
5b90: 61 74 74 65 72 6e 29 29 20 3d 3d 20 30 29 29 20  attern)) == 0)) 
5ba0: 7b 0a 09 09 20 20 20 20 70 61 74 73 4c 65 66 74  {...    patsLeft
5bb0: 2d 2d 3b 0a 09 09 20 20 20 20 70 61 74 50 74 72  --;...    patPtr
5bc0: 2d 2d 3b 0a 09 09 20 20 20 20 54 63 6c 5f 44 53  --;...    Tcl_DS
5bd0: 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73 2c  tringAppend(&ds,
5be0: 20 22 54 72 69 70 6c 65 2d 22 2c 20 37 29 3b 0a   "Triple-", 7);.
5bf0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
5c00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
5c10: 6e 64 28 26 64 73 2c 20 22 44 6f 75 62 6c 65 2d  nd(&ds, "Double-
5c20: 22 2c 20 37 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 7);...}..    
5c30: 7d 0a 0a 09 20 20 20 20 66 6f 72 20 28 6e 65 65  }...    for (nee
5c40: 64 4d 6f 64 73 20 3d 20 70 61 74 50 74 72 2d 3e  dMods = patPtr->
5c50: 6e 65 65 64 4d 6f 64 73 2c 20 6d 6f 64 50 74 72  needMods, modPtr
5c60: 20 3d 20 6d 6f 64 41 72 72 61 79 3b 0a 09 09 20   = modArray;... 
5c70: 20 20 20 6e 65 65 64 4d 6f 64 73 20 21 3d 20 30     needMods != 0
5c80: 3b 20 6d 6f 64 50 74 72 2b 2b 29 20 7b 0a 09 09  ; modPtr++) {...
5c90: 69 66 20 28 6d 6f 64 50 74 72 2d 3e 6d 61 73 6b  if (modPtr->mask
5ca0: 20 26 20 6e 65 65 64 4d 6f 64 73 29 20 7b 0a 09   & needMods) {..
5cb0: 09 20 20 20 20 6e 65 65 64 4d 6f 64 73 20 26 3d  .    needMods &=
5cc0: 20 7e 6d 6f 64 50 74 72 2d 3e 6d 61 73 6b 3b 0a   ~modPtr->mask;.
5cd0: 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
5ce0: 67 41 70 70 65 6e 64 28 26 64 73 2c 20 6d 6f 64  gAppend(&ds, mod
5cf0: 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 3b 0a  Ptr->name, -1);.
5d00: 09 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
5d10: 67 41 70 70 65 6e 64 28 26 64 73 2c 20 22 2d 22  gAppend(&ds, "-"
5d20: 2c 20 31 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  , 1);...}..    }
5d30: 0a 0a 09 20 20 20 20 66 6f 72 20 28 65 69 50 74  ...    for (eiPt
5d40: 72 20 3d 20 65 76 65 6e 74 41 72 72 61 79 3b 20  r = eventArray; 
5d50: 65 69 50 74 72 2d 3e 6e 61 6d 65 20 21 3d 20 4e  eiPtr->name != N
5d60: 55 4c 4c 3b 20 65 69 50 74 72 2b 2b 29 20 7b 0a  ULL; eiPtr++) {.
5d70: 09 09 69 66 20 28 65 69 50 74 72 2d 3e 74 79 70  ..if (eiPtr->typ
5d80: 65 20 3d 3d 20 70 61 74 50 74 72 2d 3e 65 76 65  e == patPtr->eve
5d90: 6e 74 54 79 70 65 29 20 7b 0a 09 09 20 20 20 20  ntType) {...    
5da0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
5db0: 64 28 26 64 73 2c 20 65 69 50 74 72 2d 3e 6e 61  d(&ds, eiPtr->na
5dc0: 6d 65 2c 20 2d 31 29 3b 0a 09 09 20 20 20 20 69  me, -1);...    i
5dd0: 66 20 28 70 61 74 50 74 72 2d 3e 64 65 74 61 69  f (patPtr->detai
5de0: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 54 63 6c  l != 0) {....Tcl
5df0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
5e00: 64 73 2c 20 22 2d 22 2c 20 31 29 3b 0a 09 09 20  ds, "-", 1);... 
5e10: 20 20 20 7d 0a 09 09 20 20 20 20 62 72 65 61 6b     }...    break
5e20: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 09 20  ;...}..    }... 
5e30: 20 20 20 69 66 20 28 70 61 74 50 74 72 2d 3e 64     if (patPtr->d
5e40: 65 74 61 69 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etail != 0) {...
5e50: 69 66 20 28 70 61 74 50 74 72 2d 3e 65 76 65 6e  if (patPtr->even
5e60: 74 54 79 70 65 20 3d 3d 20 43 54 4b 5f 4b 45 59  tType == CTK_KEY
5e70: 5f 45 56 45 4e 54 29 20 7b 0a 09 09 20 20 20 20  _EVENT) {...    
5e80: 72 65 67 69 73 74 65 72 20 4b 65 79 53 79 6d 49  register KeySymI
5e90: 6e 66 6f 20 2a 6b 50 74 72 3b 0a 0a 09 09 20 20  nfo *kPtr;....  
5ea0: 20 20 66 6f 72 20 28 6b 50 74 72 20 3d 20 6b 65    for (kPtr = ke
5eb0: 79 41 72 72 61 79 3b 20 6b 50 74 72 2d 3e 6e 61  yArray; kPtr->na
5ec0: 6d 65 20 21 3d 20 4e 55 4c 4c 3b 20 6b 50 74 72  me != NULL; kPtr
5ed0: 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 70 61 74  ++) {....if (pat
5ee0: 50 74 72 2d 3e 64 65 74 61 69 6c 20 3d 3d 20 28  Ptr->detail == (
5ef0: 69 6e 74 29 20 6b 50 74 72 2d 3e 76 61 6c 75 65  int) kPtr->value
5f00: 29 20 7b 0a 09 09 09 20 20 20 20 54 63 6c 5f 44  ) {....    Tcl_D
5f10: 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64 73  StringAppend(&ds
5f20: 2c 20 6b 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31  , kPtr->name, -1
5f30: 29 3b 0a 09 09 09 20 20 20 20 62 72 65 61 6b 3b  );....    break;
5f40: 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 09  ....}...    }...
5f50: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 73  } else {...    s
5f60: 70 72 69 6e 74 66 28 62 75 66 66 65 72 2c 20 22  printf(buffer, "
5f70: 25 64 22 2c 20 70 61 74 50 74 72 2d 3e 64 65 74  %d", patPtr->det
5f80: 61 69 6c 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f  ail);...    Tcl_
5f90: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
5fa0: 73 2c 20 62 75 66 66 65 72 2c 20 2d 31 29 3b 0a  s, buffer, -1);.
5fb0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ..}..    }..    
5fc0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
5fd0: 64 28 26 64 73 2c 20 22 3e 22 2c 20 31 29 3b 0a  d(&ds, ">", 1);.
5fe0: 09 7d 0a 09 54 63 6c 5f 41 70 70 65 6e 64 45 6c  .}..Tcl_AppendEl
5ff0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 54 63  ement(interp, Tc
6000: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
6010: 64 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ds));.    }.    
6020: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
6030: 26 64 73 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  &ds);.}.../*. *-
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6080: 0a 20 2a 20 54 6b 5f 44 65 6c 65 74 65 41 6c 6c  . * Tk_DeleteAll
6090: 42 69 6e 64 69 6e 67 73 20 2d 2d 0a 20 2a 0a 20  Bindings --. *. 
60a0: 2a 09 52 65 6d 6f 76 65 20 61 6c 6c 20 62 69 6e  *.Remove all bin
60b0: 64 69 6e 67 73 20 61 73 73 6f 63 69 61 74 65 64  dings associated
60c0: 20 77 69 74 68 20 61 20 67 69 76 65 6e 20 6f 62   with a given ob
60d0: 6a 65 63 74 20 69 6e 20 61 0a 20 2a 09 67 69 76  ject in a. *.giv
60e0: 65 6e 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65  en binding table
60f0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6100: 0a 20 2a 09 41 6c 6c 20 62 69 6e 64 69 6e 67 73  . *.All bindings
6110: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6120: 20 6f 62 6a 65 63 74 20 61 72 65 20 72 65 6d 6f   object are remo
6130: 76 65 64 20 66 72 6f 6d 0a 20 2a 09 62 69 6e 64  ved from. *.bind
6140: 69 6e 67 54 61 62 6c 65 2e 0a 20 2a 0a 20 2a 20  ingTable.. *. * 
6150: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6160: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
61b0: 76 6f 69 64 0a 54 6b 5f 44 65 6c 65 74 65 41 6c  void.Tk_DeleteAl
61c0: 6c 42 69 6e 64 69 6e 67 73 28 62 69 6e 64 69 6e  lBindings(bindin
61d0: 67 54 61 62 6c 65 2c 20 6f 62 6a 65 63 74 29 0a  gTable, object).
61e0: 20 20 20 20 54 6b 5f 42 69 6e 64 69 6e 67 54 61      Tk_BindingTa
61f0: 62 6c 65 20 62 69 6e 64 69 6e 67 54 61 62 6c 65  ble bindingTable
6200: 3b 09 2f 2a 20 54 61 62 6c 65 20 69 6e 20 77 68  ;./* Table in wh
6210: 69 63 68 20 74 6f 20 64 65 6c 65 74 65 0a 09 09  ich to delete...
6220: 09 09 09 20 2a 20 62 69 6e 64 69 6e 67 73 2e 20  ... * bindings. 
6230: 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  */.    ClientDat
6240: 61 20 6f 62 6a 65 63 74 3b 09 09 09 2f 2a 20 54  a object;.../* T
6250: 6f 6b 65 6e 20 66 6f 72 20 6f 62 6a 65 63 74 2e  oken for object.
6260: 20 2a 2f 0a 7b 0a 20 20 20 20 42 69 6e 64 69 6e   */.{.    Bindin
6270: 67 54 61 62 6c 65 20 2a 62 69 6e 64 50 74 72 20  gTable *bindPtr 
6280: 3d 20 28 42 69 6e 64 69 6e 67 54 61 62 6c 65 20  = (BindingTable 
6290: 2a 29 20 62 69 6e 64 69 6e 67 54 61 62 6c 65 3b  *) bindingTable;
62a0: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 50 61  .    register Pa
62b0: 74 53 65 71 20 2a 70 73 50 74 72 2c 20 2a 70 72  tSeq *psPtr, *pr
62c0: 65 76 50 74 72 3b 0a 20 20 20 20 50 61 74 53 65  evPtr;.    PatSe
62d0: 71 20 2a 6e 65 78 74 50 74 72 3b 0a 20 20 20 20  q *nextPtr;.    
62e0: 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68  Tcl_HashEntry *h
62f0: 50 74 72 3b 0a 0a 20 20 20 20 68 50 74 72 20 3d  Ptr;..    hPtr =
6300: 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74   Tcl_FindHashEnt
6310: 72 79 28 26 62 69 6e 64 50 74 72 2d 3e 6f 62 6a  ry(&bindPtr->obj
6320: 65 63 74 54 61 62 6c 65 2c 20 28 63 68 61 72 20  ectTable, (char 
6330: 2a 29 20 6f 62 6a 65 63 74 29 3b 0a 20 20 20 20  *) object);.    
6340: 69 66 20 28 68 50 74 72 20 3d 3d 20 4e 55 4c 4c  if (hPtr == NULL
6350: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ) {..return;.   
6360: 20 7d 0a 20 20 20 20 66 6f 72 20 28 70 73 50 74   }.    for (psPt
6370: 72 20 3d 20 28 50 61 74 53 65 71 20 2a 29 20 54  r = (PatSeq *) T
6380: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28  cl_GetHashValue(
6390: 68 50 74 72 29 3b 20 70 73 50 74 72 20 21 3d 20  hPtr); psPtr != 
63a0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 70 73 50 74 72  NULL;..    psPtr
63b0: 20 3d 20 6e 65 78 74 50 74 72 29 20 7b 0a 09 6e   = nextPtr) {..n
63c0: 65 78 74 50 74 72 20 20 3d 20 70 73 50 74 72 2d  extPtr  = psPtr-
63d0: 3e 6e 65 78 74 4f 62 6a 50 74 72 3b 0a 0a 09 2f  >nextObjPtr;.../
63e0: 2a 0a 09 20 2a 20 42 65 20 73 75 72 65 20 74 6f  *.. * Be sure to
63f0: 20 72 65 6d 6f 76 65 20 65 61 63 68 20 62 69 6e   remove each bin
6400: 64 69 6e 67 20 66 72 6f 6d 20 69 74 73 20 68 61  ding from its ha
6410: 73 68 20 63 68 61 69 6e 20 69 6e 20 74 68 65 0a  sh chain in the.
6420: 09 20 2a 20 70 61 74 74 65 72 6e 20 74 61 62 6c  . * pattern tabl
6430: 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  e.  If this is t
6440: 68 65 20 6c 61 73 74 20 70 61 74 74 65 72 6e 20  he last pattern 
6450: 69 6e 20 74 68 65 20 63 68 61 69 6e 2c 0a 09 20  in the chain,.. 
6460: 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
6470: 65 20 68 61 73 68 20 65 6e 74 72 79 20 74 6f 6f  e hash entry too
6480: 2e 0a 09 20 2a 2f 0a 0a 09 70 72 65 76 50 74 72  ... */...prevPtr
6490: 20 3d 20 28 50 61 74 53 65 71 20 2a 29 20 54 63   = (PatSeq *) Tc
64a0: 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 70  l_GetHashValue(p
64b0: 73 50 74 72 2d 3e 68 50 74 72 29 3b 0a 09 69 66  sPtr->hPtr);..if
64c0: 20 28 70 72 65 76 50 74 72 20 3d 3d 20 70 73 50   (prevPtr == psP
64d0: 74 72 29 20 7b 0a 09 20 20 20 20 69 66 20 28 70  tr) {..    if (p
64e0: 73 50 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72  sPtr->nextSeqPtr
64f0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63   == NULL) {...Tc
6500: 6c 5f 44 65 6c 65 74 65 48 61 73 68 45 6e 74 72  l_DeleteHashEntr
6510: 79 28 70 73 50 74 72 2d 3e 68 50 74 72 29 3b 0a  y(psPtr->hPtr);.
6520: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
6530: 54 63 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65  Tcl_SetHashValue
6540: 28 70 73 50 74 72 2d 3e 68 50 74 72 2c 20 70 73  (psPtr->hPtr, ps
6550: 50 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72 29  Ptr->nextSeqPtr)
6560: 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65  ;..    }..} else
6570: 20 7b 0a 09 20 20 20 20 66 6f 72 20 28 20 3b 20   {..    for ( ; 
6580: 3b 20 70 72 65 76 50 74 72 20 3d 20 70 72 65 76  ; prevPtr = prev
6590: 50 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72 29  Ptr->nextSeqPtr)
65a0: 20 7b 0a 09 09 69 66 20 28 70 72 65 76 50 74 72   {...if (prevPtr
65b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20   == NULL) {...  
65c0: 20 20 70 61 6e 69 63 28 22 54 6b 5f 44 65 6c 65    panic("Tk_Dele
65d0: 74 65 41 6c 6c 42 69 6e 64 69 6e 67 73 20 63 6f  teAllBindings co
65e0: 75 6c 64 6e 27 74 20 66 69 6e 64 20 6f 6e 20 68  uldn't find on h
65f0: 61 73 68 20 63 68 61 69 6e 22 29 3b 0a 09 09 7d  ash chain");...}
6600: 0a 09 09 69 66 20 28 70 72 65 76 50 74 72 2d 3e  ...if (prevPtr->
6610: 6e 65 78 74 53 65 71 50 74 72 20 3d 3d 20 70 73  nextSeqPtr == ps
6620: 50 74 72 29 20 7b 0a 09 09 20 20 20 20 70 72 65  Ptr) {...    pre
6630: 76 50 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72  vPtr->nextSeqPtr
6640: 20 3d 20 70 73 50 74 72 2d 3e 6e 65 78 74 53 65   = psPtr->nextSe
6650: 71 50 74 72 3b 0a 09 09 20 20 20 20 62 72 65 61  qPtr;...    brea
6660: 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d  k;...}..    }..}
6670: 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a  ..ckfree((char *
6680: 29 20 70 73 50 74 72 2d 3e 63 6f 6d 6d 61 6e 64  ) psPtr->command
6690: 29 3b 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72  );..ckfree((char
66a0: 20 2a 29 20 70 73 50 74 72 29 3b 0a 20 20 20 20   *) psPtr);.    
66b0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65  }.    Tcl_Delete
66c0: 48 61 73 68 45 6e 74 72 79 28 68 50 74 72 29 3b  HashEntry(hPtr);
66d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6710: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
6720: 6b 5f 42 69 6e 64 45 76 65 6e 74 20 2d 2d 0a 20  k_BindEvent --. 
6730: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
6740: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
6750: 6f 20 70 72 6f 63 65 73 73 20 61 6e 20 58 20 65  o process an X e
6760: 76 65 6e 74 2e 20 20 54 68 65 0a 20 2a 09 65 76  vent.  The. *.ev
6770: 65 6e 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  ent is added to 
6780: 74 68 6f 73 65 20 72 65 63 6f 72 64 65 64 20 66  those recorded f
6790: 6f 72 20 74 68 65 20 62 69 6e 64 69 6e 67 20 74  or the binding t
67a0: 61 62 6c 65 2e 0a 20 2a 09 54 68 65 6e 20 65 61  able.. *.Then ea
67b0: 63 68 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  ch of the object
67c0: 73 20 61 74 20 2a 6f 62 6a 65 63 74 50 74 72 20  s at *objectPtr 
67d0: 69 73 20 63 68 65 63 6b 65 64 20 69 6e 0a 20 2a  is checked in. *
67e0: 09 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66  .order to see if
67f0: 20 69 74 20 68 61 73 20 61 20 62 69 6e 64 69 6e   it has a bindin
6800: 67 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  g that matches t
6810: 68 65 20 72 65 63 65 6e 74 0a 20 2a 09 65 76 65  he recent. *.eve
6820: 6e 74 73 2e 20 20 49 66 20 73 6f 2c 20 74 68 61  nts.  If so, tha
6830: 74 20 62 69 6e 64 69 6e 67 20 69 73 20 69 6e 76  t binding is inv
6840: 6f 6b 65 64 20 61 6e 64 20 74 68 65 20 72 65 73  oked and the res
6850: 74 20 6f 66 0a 20 2a 09 6f 62 6a 65 63 74 73 20  t of. *.objects 
6860: 61 72 65 20 73 6b 69 70 70 65 64 2e 0a 20 2a 0a  are skipped.. *.
6870: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6880: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
6890: 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 70 65  effects:. *.Depe
68a0: 6e 64 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  nds on the comma
68b0: 6e 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nd associated wi
68c0: 74 68 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a  th the matching.
68d0: 20 2a 09 62 69 6e 64 69 6e 67 2e 0a 20 2a 0a 20   *.binding.. *. 
68e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6920: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 5f 42 69 6e   */..void.Tk_Bin
6930: 64 45 76 65 6e 74 28 62 69 6e 64 69 6e 67 54 61  dEvent(bindingTa
6940: 62 6c 65 2c 20 65 76 65 6e 74 50 74 72 2c 20 74  ble, eventPtr, t
6950: 6b 77 69 6e 2c 20 6e 75 6d 4f 62 6a 65 63 74 73  kwin, numObjects
6960: 2c 20 6f 62 6a 65 63 74 50 74 72 29 0a 20 20 20  , objectPtr).   
6970: 20 54 6b 5f 42 69 6e 64 69 6e 67 54 61 62 6c 65   Tk_BindingTable
6980: 20 62 69 6e 64 69 6e 67 54 61 62 6c 65 3b 09 2f   bindingTable;./
6990: 2a 20 54 61 62 6c 65 20 69 6e 20 77 68 69 63 68  * Table in which
69a0: 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 0a 09 09 09   to look for....
69b0: 09 09 20 2a 20 62 69 6e 64 69 6e 67 73 2e 20 2a  .. * bindings. *
69c0: 2f 0a 20 20 20 20 58 45 76 65 6e 74 20 2a 65 76  /.    XEvent *ev
69d0: 65 6e 74 50 74 72 3b 09 09 09 2f 2a 20 57 68 61  entPtr;.../* Wha
69e0: 74 20 61 63 74 75 61 6c 6c 79 20 68 61 70 70 65  t actually happe
69f0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 6b 5f 57  ned. */.    Tk_W
6a00: 69 6e 64 6f 77 20 74 6b 77 69 6e 3b 09 09 09 2f  indow tkwin;.../
6a10: 2a 20 57 69 6e 64 6f 77 20 6f 6e 20 64 69 73 70  * Window on disp
6a20: 6c 61 79 20 77 68 65 72 65 20 65 76 65 6e 74 0a  lay where event.
6a30: 09 09 09 09 09 20 2a 20 6f 63 63 75 72 72 65 64  ..... * occurred
6a40: 20 28 6e 65 65 64 65 64 20 69 6e 20 6f 72 64 65   (needed in orde
6a50: 72 20 74 6f 0a 09 09 09 09 09 20 2a 20 6c 6f 63  r to...... * loc
6a60: 61 74 65 20 64 69 73 70 6c 61 79 20 69 6e 66 6f  ate display info
6a70: 72 6d 61 74 69 6f 6e 29 2e 20 2a 2f 0a 20 20 20  rmation). */.   
6a80: 20 69 6e 74 20 6e 75 6d 4f 62 6a 65 63 74 73 3b   int numObjects;
6a90: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  .../* Number of 
6aa0: 6f 62 6a 65 63 74 73 20 61 74 20 2a 6f 62 6a 65  objects at *obje
6ab0: 63 74 50 74 72 2e 20 2a 2f 0a 20 20 20 20 43 6c  ctPtr. */.    Cl
6ac0: 69 65 6e 74 44 61 74 61 20 2a 6f 62 6a 65 63 74  ientData *object
6ad0: 50 74 72 3b 09 09 2f 2a 20 41 72 72 61 79 20 6f  Ptr;../* Array o
6ae0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 62  f one or more ob
6af0: 6a 65 63 74 73 0a 09 09 09 09 09 20 2a 20 74 6f  jects...... * to
6b00: 20 63 68 65 63 6b 20 66 6f 72 20 61 20 6d 61 74   check for a mat
6b10: 63 68 69 6e 67 20 62 69 6e 64 69 6e 67 2e 20 2a  ching binding. *
6b20: 2f 0a 7b 0a 20 20 20 20 42 69 6e 64 69 6e 67 54  /.{.    BindingT
6b30: 61 62 6c 65 20 2a 62 69 6e 64 50 74 72 20 3d 20  able *bindPtr = 
6b40: 28 42 69 6e 64 69 6e 67 54 61 62 6c 65 20 2a 29  (BindingTable *)
6b50: 20 62 69 6e 64 69 6e 67 54 61 62 6c 65 3b 0a 20   bindingTable;. 
6b60: 20 20 20 54 6b 44 69 73 70 6c 61 79 20 2a 64 69     TkDisplay *di
6b70: 73 70 50 74 72 20 3d 20 28 28 54 6b 57 69 6e 64  spPtr = ((TkWind
6b80: 6f 77 20 2a 29 20 74 6b 77 69 6e 29 2d 3e 64 69  ow *) tkwin)->di
6b90: 73 70 50 74 72 3b 0a 20 20 20 20 54 6b 4d 61 69  spPtr;.    TkMai
6ba0: 6e 49 6e 66 6f 20 2a 6d 61 69 6e 50 74 72 3b 0a  nInfo *mainPtr;.
6bb0: 20 20 20 20 54 6b 44 69 73 70 6c 61 79 20 2a 6f      TkDisplay *o
6bc0: 6c 64 44 69 73 70 50 74 72 3b 0a 20 20 20 20 58  ldDispPtr;.    X
6bd0: 45 76 65 6e 74 20 2a 72 69 6e 67 50 74 72 3b 0a  Event *ringPtr;.
6be0: 20 20 20 20 50 61 74 53 65 71 20 2a 6d 61 74 63      PatSeq *matc
6bf0: 68 50 74 72 3b 0a 20 20 20 20 50 61 74 74 65 72  hPtr;.    Patter
6c00: 6e 54 61 62 6c 65 4b 65 79 20 6b 65 79 3b 0a 20  nTableKey key;. 
6c10: 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79     Tcl_HashEntry
6c20: 20 2a 68 50 74 72 3b 0a 20 20 20 20 69 6e 74 20   *hPtr;.    int 
6c30: 64 65 74 61 69 6c 2c 20 63 6f 64 65 3b 0a 20 20  detail, code;.  
6c40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6c50: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 44 53  terp;.    Tcl_DS
6c60: 74 72 69 6e 67 20 73 63 72 69 70 74 73 2c 20 73  tring scripts, s
6c70: 61 76 65 64 52 65 73 75 6c 74 3b 0a 20 20 20 20  avedResult;.    
6c80: 63 68 61 72 20 2a 70 2c 20 2a 65 6e 64 3b 0a 0a  char *p, *end;..
6c90: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 64      /*.     * Ad
6ca0: 64 20 74 68 65 20 6e 65 77 20 65 76 65 6e 74 20  d the new event 
6cb0: 74 6f 20 74 68 65 20 72 69 6e 67 20 6f 66 20 73  to the ring of s
6cc0: 61 76 65 64 20 65 76 65 6e 74 73 20 66 6f 72 20  aved events for 
6cd0: 74 68 65 0a 20 20 20 20 20 2a 20 62 69 6e 64 69  the.     * bindi
6ce0: 6e 67 20 74 61 62 6c 65 2e 20 20 54 77 6f 20 74  ng table.  Two t
6cf0: 72 69 63 6b 79 20 70 6f 69 6e 74 73 3a 0a 20 20  ricky points:.  
6d00: 20 20 20 2a 2f 0a 0a 20 20 20 20 62 69 6e 64 50     */..    bindP
6d10: 74 72 2d 3e 63 75 72 45 76 65 6e 74 2b 2b 3b 0a  tr->curEvent++;.
6d20: 20 20 20 20 69 66 20 28 62 69 6e 64 50 74 72 2d      if (bindPtr-
6d30: 3e 63 75 72 45 76 65 6e 74 20 3e 3d 20 45 56 45  >curEvent >= EVE
6d40: 4e 54 5f 42 55 46 46 45 52 5f 53 49 5a 45 29 20  NT_BUFFER_SIZE) 
6d50: 7b 0a 09 62 69 6e 64 50 74 72 2d 3e 63 75 72 45  {..bindPtr->curE
6d60: 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  vent = 0;.    }.
6d70: 20 20 20 20 72 69 6e 67 50 74 72 20 3d 20 26 62      ringPtr = &b
6d80: 69 6e 64 50 74 72 2d 3e 65 76 65 6e 74 52 69 6e  indPtr->eventRin
6d90: 67 5b 62 69 6e 64 50 74 72 2d 3e 63 75 72 45 76  g[bindPtr->curEv
6da0: 65 6e 74 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ent];.    memcpy
6db0: 28 28 56 4f 49 44 20 2a 29 20 72 69 6e 67 50 74  ((VOID *) ringPt
6dc0: 72 2c 20 28 56 4f 49 44 20 2a 29 20 65 76 65 6e  r, (VOID *) even
6dd0: 74 50 74 72 2c 20 73 69 7a 65 6f 66 28 58 45 76  tPtr, sizeof(XEv
6de0: 65 6e 74 29 29 3b 0a 20 20 20 20 64 65 74 61 69  ent));.    detai
6df0: 6c 20 3d 20 30 3b 0a 20 20 20 20 62 69 6e 64 50  l = 0;.    bindP
6e00: 74 72 2d 3e 64 65 74 61 69 6c 52 69 6e 67 5b 62  tr->detailRing[b
6e10: 69 6e 64 50 74 72 2d 3e 63 75 72 45 76 65 6e 74  indPtr->curEvent
6e20: 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 72  ] = 0;.    if (r
6e30: 69 6e 67 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20  ingPtr->type == 
6e40: 43 54 4b 5f 4b 45 59 5f 45 56 45 4e 54 29 20 7b  CTK_KEY_EVENT) {
6e50: 0a 09 64 65 74 61 69 6c 20 3d 20 72 69 6e 67 50  ..detail = ringP
6e60: 74 72 2d 3e 75 2e 6b 65 79 2e 73 79 6d 3b 0a 20  tr->u.key.sym;. 
6e70: 20 20 20 7d 0a 20 20 20 20 62 69 6e 64 50 74 72     }.    bindPtr
6e80: 2d 3e 64 65 74 61 69 6c 52 69 6e 67 5b 62 69 6e  ->detailRing[bin
6e90: 64 50 74 72 2d 3e 63 75 72 45 76 65 6e 74 5d 20  dPtr->curEvent] 
6ea0: 3d 20 64 65 74 61 69 6c 3b 0a 0a 20 20 20 20 2f  = detail;..    /
6eb0: 2a 0a 20 20 20 20 20 2a 20 4c 6f 6f 70 20 6f 76  *.     * Loop ov
6ec0: 65 72 20 61 6c 6c 20 74 68 65 20 6f 62 6a 65 63  er all the objec
6ed0: 74 73 2c 20 66 69 6e 64 69 6e 67 20 74 68 65 20  ts, finding the 
6ee0: 62 69 6e 64 69 6e 67 20 73 63 72 69 70 74 20 66  binding script f
6ef0: 6f 72 20 65 61 63 68 0a 20 20 20 20 20 2a 20 6f  or each.     * o
6f00: 6e 65 2e 20 20 41 70 70 65 6e 64 20 61 6c 6c 20  ne.  Append all 
6f10: 6f 66 20 74 68 65 20 62 69 6e 64 69 6e 67 20 73  of the binding s
6f20: 63 72 69 70 74 73 2c 20 77 69 74 68 20 25 2d 73  cripts, with %-s
6f30: 65 71 75 65 6e 63 65 73 20 65 78 70 61 6e 64 65  equences expande
6f40: 64 2c 0a 20 20 20 20 20 2a 20 74 6f 20 22 73 63  d,.     * to "sc
6f50: 72 69 70 74 73 22 2c 20 77 69 74 68 20 6e 75 6c  ripts", with nul
6f60: 6c 20 63 68 61 72 61 63 74 65 72 73 20 73 65 70  l characters sep
6f70: 61 72 61 74 69 6e 67 20 74 68 65 20 73 63 72 69  arating the scri
6f80: 70 74 73 20 66 6f 72 0a 20 20 20 20 20 2a 20 65  pts for.     * e
6f90: 61 63 68 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  ach object..    
6fa0: 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74   */..    Tcl_DSt
6fb0: 72 69 6e 67 49 6e 69 74 28 26 73 63 72 69 70 74  ringInit(&script
6fc0: 73 29 3b 0a 20 20 20 20 66 6f 72 20 28 20 3b 20  s);.    for ( ; 
6fd0: 6e 75 6d 4f 62 6a 65 63 74 73 20 3e 20 30 3b 20  numObjects > 0; 
6fe0: 6e 75 6d 4f 62 6a 65 63 74 73 2d 2d 2c 20 6f 62  numObjects--, ob
6ff0: 6a 65 63 74 50 74 72 2b 2b 29 20 7b 0a 0a 09 2f  jectPtr++) {.../
7000: 2a 0a 09 20 2a 20 4d 61 74 63 68 20 74 68 65 20  *.. * Match the 
7010: 6e 65 77 20 65 76 65 6e 74 20 61 67 61 69 6e 73  new event agains
7020: 74 20 74 68 6f 73 65 20 72 65 63 6f 72 64 65 64  t those recorded
7030: 20 69 6e 20 74 68 65 0a 09 20 2a 20 70 61 74 74   in the.. * patt
7040: 65 72 6e 20 74 61 62 6c 65 2c 20 73 61 76 69 6e  ern table, savin
7050: 67 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 6d 61  g the longest ma
7060: 74 63 68 69 6e 67 20 70 61 74 74 65 72 6e 2e 0a  tching pattern..
7070: 09 20 2a 20 46 6f 72 20 65 76 65 6e 74 73 20 77  . * For events w
7080: 69 74 68 20 64 65 74 61 69 6c 73 20 28 62 75 74  ith details (but
7090: 74 6f 6e 20 61 6e 64 20 6b 65 79 20 65 76 65 6e  ton and key even
70a0: 74 73 29 20 66 69 72 73 74 0a 09 20 2a 20 6c 6f  ts) first.. * lo
70b0: 6f 6b 20 66 6f 72 20 61 20 62 69 6e 64 69 6e 67  ok for a binding
70c0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
70d0: 63 20 6b 65 79 20 6f 72 20 62 75 74 74 6f 6e 2e  c key or button.
70e0: 0a 09 20 2a 20 49 66 20 6e 6f 6e 65 20 69 73 20  .. * If none is 
70f0: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 6c 6f 6f 6b  found, then look
7100: 20 66 6f 72 20 61 20 62 69 6e 64 69 6e 67 20 66   for a binding f
7110: 6f 72 20 61 6c 6c 0a 09 20 2a 20 6b 65 79 73 20  or all.. * keys 
7120: 6f 72 20 62 75 74 74 6f 6e 73 20 28 64 65 74 61  or buttons (deta
7130: 69 6c 20 6f 66 20 30 29 2e 0a 09 20 2a 2f 0a 20  il of 0)... */. 
7140: 20 20 20 0a 09 6d 61 74 63 68 50 74 72 20 3d 20     ..matchPtr = 
7150: 4e 55 4c 4c 3b 0a 09 6b 65 79 2e 6f 62 6a 65 63  NULL;..key.objec
7160: 74 20 3d 20 2a 6f 62 6a 65 63 74 50 74 72 3b 0a  t = *objectPtr;.
7170: 09 6b 65 79 2e 74 79 70 65 20 3d 20 72 69 6e 67  .key.type = ring
7180: 50 74 72 2d 3e 74 79 70 65 3b 0a 09 6b 65 79 2e  Ptr->type;..key.
7190: 64 65 74 61 69 6c 20 3d 20 64 65 74 61 69 6c 3b  detail = detail;
71a0: 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e  ..hPtr = Tcl_Fin
71b0: 64 48 61 73 68 45 6e 74 72 79 28 26 62 69 6e 64  dHashEntry(&bind
71c0: 50 74 72 2d 3e 70 61 74 74 65 72 6e 54 61 62 6c  Ptr->patternTabl
71d0: 65 2c 20 28 63 68 61 72 20 2a 29 20 26 6b 65 79  e, (char *) &key
71e0: 29 3b 0a 09 69 66 20 28 68 50 74 72 20 21 3d 20  );..if (hPtr != 
71f0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6d 61 74  NULL) {..    mat
7200: 63 68 50 74 72 20 3d 20 4d 61 74 63 68 50 61 74  chPtr = MatchPat
7210: 74 65 72 6e 73 28 64 69 73 70 50 74 72 2c 20 62  terns(dispPtr, b
7220: 69 6e 64 50 74 72 2c 0a 09 09 20 20 20 20 28 50  indPtr,...    (P
7230: 61 74 53 65 71 20 2a 29 20 54 63 6c 5f 47 65 74  atSeq *) Tcl_Get
7240: 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 29  HashValue(hPtr))
7250: 3b 0a 09 7d 0a 09 69 66 20 28 28 64 65 74 61 69  ;..}..if ((detai
7260: 6c 20 21 3d 20 30 29 20 26 26 20 28 6d 61 74 63  l != 0) && (matc
7270: 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 29 20 7b  hPtr == NULL)) {
7280: 0a 09 20 20 20 20 6b 65 79 2e 64 65 74 61 69 6c  ..    key.detail
7290: 20 3d 20 30 3b 0a 09 20 20 20 20 68 50 74 72 20   = 0;..    hPtr 
72a0: 3d 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e  = Tcl_FindHashEn
72b0: 74 72 79 28 26 62 69 6e 64 50 74 72 2d 3e 70 61  try(&bindPtr->pa
72c0: 74 74 65 72 6e 54 61 62 6c 65 2c 20 28 63 68 61  tternTable, (cha
72d0: 72 20 2a 29 20 26 6b 65 79 29 3b 0a 09 20 20 20  r *) &key);..   
72e0: 20 69 66 20 28 68 50 74 72 20 21 3d 20 4e 55 4c   if (hPtr != NUL
72f0: 4c 29 20 7b 0a 09 09 6d 61 74 63 68 50 74 72 20  L) {...matchPtr 
7300: 3d 20 4d 61 74 63 68 50 61 74 74 65 72 6e 73 28  = MatchPatterns(
7310: 64 69 73 70 50 74 72 2c 20 62 69 6e 64 50 74 72  dispPtr, bindPtr
7320: 2c 0a 09 09 09 28 50 61 74 53 65 71 20 2a 29 20  ,....(PatSeq *) 
7330: 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65  Tcl_GetHashValue
7340: 28 68 50 74 72 29 29 3b 0a 09 20 20 20 20 7d 0a  (hPtr));..    }.
7350: 09 7d 0a 20 20 20 20 0a 09 69 66 20 28 6d 61 74  .}.    ..if (mat
7360: 63 68 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  chPtr != NULL) {
7370: 0a 09 20 20 20 20 45 78 70 61 6e 64 50 65 72 63  ..    ExpandPerc
7380: 65 6e 74 73 28 28 54 6b 57 69 6e 64 6f 77 20 2a  ents((TkWindow *
7390: 29 20 74 6b 77 69 6e 2c 20 6d 61 74 63 68 50 74  ) tkwin, matchPt
73a0: 72 2d 3e 63 6f 6d 6d 61 6e 64 2c 20 65 76 65 6e  r->command, even
73b0: 74 50 74 72 2c 0a 09 09 20 20 20 20 28 4b 65 79  tPtr,...    (Key
73c0: 53 79 6d 29 20 64 65 74 61 69 6c 2c 20 26 73 63  Sym) detail, &sc
73d0: 72 69 70 74 73 29 3b 0a 09 20 20 20 20 54 63 6c  ripts);..    Tcl
73e0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
73f0: 73 63 72 69 70 74 73 2c 20 22 22 2c 20 31 29 3b  scripts, "", 1);
7400: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
7410: 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20 67 6f 20  *.     * Now go 
7420: 62 61 63 6b 20 74 68 72 6f 75 67 68 20 61 6e 64  back through and
7430: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   evaluate the sc
7440: 72 69 70 74 20 66 6f 72 20 65 61 63 68 20 6f 62  ript for each ob
7450: 6a 65 63 74 2c 0a 20 20 20 20 20 2a 20 69 6e 20  ject,.     * in 
7460: 6f 72 64 65 72 2c 20 64 65 61 6c 69 6e 67 20 77  order, dealing w
7470: 69 74 68 20 22 62 72 65 61 6b 22 20 61 6e 64 20  ith "break" and 
7480: 22 63 6f 6e 74 69 6e 75 65 22 20 65 78 63 65 70  "continue" excep
7490: 74 69 6f 6e 73 0a 20 20 20 20 20 2a 20 61 70 70  tions.     * app
74a0: 72 6f 70 72 69 61 74 65 6c 79 2e 0a 20 20 20 20  ropriately..    
74b0: 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 72 65 20   *.     * There 
74c0: 61 72 65 20 74 77 6f 20 74 72 69 63 6b 73 20 68  are two tricks h
74d0: 65 72 65 3a 0a 20 20 20 20 20 2a 20 31 2e 20 42  ere:.     * 1. B
74e0: 69 6e 64 69 6e 67 73 20 63 61 6e 20 62 65 20 69  indings can be i
74f0: 6e 76 6f 6b 65 64 20 66 72 6f 6d 20 69 6e 20 74  nvoked from in t
7500: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 54 63 6c  he middle of Tcl
7510: 20 63 6f 6d 6d 61 6e 64 73 2c 0a 20 20 20 20 20   commands,.     
7520: 2a 20 20 20 20 77 68 65 72 65 20 69 6e 74 65 72  *    where inter
7530: 70 2d 3e 72 65 73 75 6c 74 20 69 73 20 73 69 67  p->result is sig
7540: 6e 69 66 69 63 61 6e 74 20 28 66 6f 72 20 65 78  nificant (for ex
7550: 61 6d 70 6c 65 2c 20 61 20 77 69 64 67 65 74 0a  ample, a widget.
7560: 20 20 20 20 20 2a 20 20 20 20 6d 69 67 68 74 20       *    might 
7570: 62 65 20 64 65 6c 65 74 65 64 20 62 65 63 61 75  be deleted becau
7580: 73 65 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 69  se of an error i
7590: 6e 20 63 72 65 61 74 69 6e 67 20 69 74 2c 20 73  n creating it, s
75a0: 6f 20 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20  o the.     *    
75b0: 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20  result contains 
75c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
75d0: 20 74 68 61 74 20 69 73 20 65 76 65 6e 74 75 61   that is eventua
75e0: 6c 6c 79 20 67 6f 69 6e 67 20 74 6f 0a 20 20 20  lly going to.   
75f0: 20 20 2a 20 20 20 20 62 65 20 72 65 74 75 72 6e    *    be return
7600: 65 64 20 62 79 20 74 68 65 20 63 72 65 61 74 69  ed by the creati
7610: 6e 67 20 63 6f 6d 6d 61 6e 64 29 2e 20 20 54 6f  ng command).  To
7620: 20 70 72 65 73 65 72 76 65 20 74 68 65 20 72 65   preserve the re
7630: 73 75 6c 74 2c 0a 20 20 20 20 20 2a 20 20 20 20  sult,.     *    
7640: 77 65 20 73 61 76 65 20 69 74 20 69 6e 20 61 20  we save it in a 
7650: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 2e 0a  dynamic string..
7660: 20 20 20 20 20 2a 20 32 2e 20 54 68 65 20 62 69       * 2. The bi
7670: 6e 64 69 6e 67 27 73 20 61 63 74 69 6f 6e 20 63  nding's action c
7680: 61 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 64  an potentially d
7690: 65 6c 65 74 65 20 74 68 65 20 62 69 6e 64 69 6e  elete the bindin
76a0: 67 2c 0a 20 20 20 20 20 2a 20 20 20 20 73 6f 20  g,.     *    so 
76b0: 62 69 6e 64 50 74 72 20 6d 61 79 20 6e 6f 74 20  bindPtr may not 
76c0: 70 6f 69 6e 74 20 74 6f 20 61 6e 79 74 68 69 6e  point to anythin
76d0: 67 20 76 61 6c 69 64 20 6f 6e 63 65 20 74 68 65  g valid once the
76e0: 20 61 63 74 69 6f 6e 0a 20 20 20 20 20 2a 20 20   action.     *  
76f0: 20 20 63 6f 6d 70 6c 65 74 65 73 2e 20 20 54 68    completes.  Th
7700: 75 73 20 77 65 20 68 61 76 65 20 74 6f 20 73 61  us we have to sa
7710: 76 65 20 62 69 6e 64 50 74 72 2d 3e 69 6e 74 65  ve bindPtr->inte
7720: 72 70 20 69 6e 20 61 0a 20 20 20 20 20 2a 20 20  rp in a.     *  
7730: 20 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65    local variable
7740: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 73   in order to res
7750: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 2e  tore the result.
7760: 0a 20 20 20 20 20 2a 20 33 2e 20 57 68 65 6e 20  .     * 3. When 
7770: 74 68 65 20 73 63 72 65 65 6e 20 63 68 61 6e 67  the screen chang
7780: 65 73 2c 20 6d 75 73 74 20 69 6e 76 6f 6b 65 20  es, must invoke 
7790: 61 20 54 63 6c 20 73 63 72 69 70 74 20 74 6f 20  a Tcl script to 
77a0: 75 70 64 61 74 65 0a 20 20 20 20 20 2a 20 20 20  update.     *   
77b0: 20 54 63 6c 20 6c 65 76 65 6c 20 69 6e 66 6f 72   Tcl level infor
77c0: 6d 61 74 69 6f 6e 20 73 75 63 68 20 61 73 20 74  mation such as t
77d0: 6b 50 72 69 76 2e 0a 20 20 20 20 20 2a 2f 0a 0a  kPriv..     */..
77e0: 20 20 20 20 6d 61 69 6e 50 74 72 20 3d 20 28 28      mainPtr = ((
77f0: 54 6b 57 69 6e 64 6f 77 20 2a 29 20 74 6b 77 69  TkWindow *) tkwi
7800: 6e 29 2d 3e 6d 61 69 6e 50 74 72 3b 0a 20 20 20  n)->mainPtr;.   
7810: 20 6f 6c 64 44 69 73 70 50 74 72 20 3d 20 6d 61   oldDispPtr = ma
7820: 69 6e 50 74 72 2d 3e 63 75 72 44 69 73 70 50 74  inPtr->curDispPt
7830: 72 3b 0a 20 20 20 20 69 6e 74 65 72 70 20 3d 20  r;.    interp = 
7840: 62 69 6e 64 50 74 72 2d 3e 69 6e 74 65 72 70 3b  bindPtr->interp;
7850: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
7860: 49 6e 69 74 28 26 73 61 76 65 64 52 65 73 75 6c  Init(&savedResul
7870: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  t);.    Tcl_DStr
7880: 69 6e 67 47 65 74 52 65 73 75 6c 74 28 69 6e 74  ingGetResult(int
7890: 65 72 70 2c 20 26 73 61 76 65 64 52 65 73 75 6c  erp, &savedResul
78a0: 74 29 3b 0a 20 20 20 20 70 20 3d 20 54 63 6c 5f  t);.    p = Tcl_
78b0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 63  DStringValue(&sc
78c0: 72 69 70 74 73 29 3b 0a 20 20 20 20 65 6e 64 20  ripts);.    end 
78d0: 3d 20 70 20 2b 20 54 63 6c 5f 44 53 74 72 69 6e  = p + Tcl_DStrin
78e0: 67 4c 65 6e 67 74 68 28 26 73 63 72 69 70 74 73  gLength(&scripts
78f0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 20  );.    while (p 
7900: 21 3d 20 65 6e 64 29 20 7b 0a 09 69 66 20 28 64  != end) {..if (d
7910: 69 73 70 50 74 72 20 21 3d 20 6d 61 69 6e 50 74  ispPtr != mainPt
7920: 72 2d 3e 63 75 72 44 69 73 70 50 74 72 29 20 7b  r->curDispPtr) {
7930: 0a 09 20 20 20 20 6d 61 69 6e 50 74 72 2d 3e 63  ..    mainPtr->c
7940: 75 72 44 69 73 70 50 74 72 20 3d 20 64 69 73 70  urDispPtr = disp
7950: 50 74 72 3b 0a 09 20 20 20 20 43 68 61 6e 67 65  Ptr;..    Change
7960: 53 63 72 65 65 6e 28 69 6e 74 65 72 70 2c 20 64  Screen(interp, d
7970: 69 73 70 50 74 72 2d 3e 6e 61 6d 65 29 3b 0a 09  ispPtr->name);..
7980: 7d 0a 09 6d 61 69 6e 50 74 72 2d 3e 62 69 6e 64  }..mainPtr->bind
7990: 69 6e 67 44 65 70 74 68 20 2b 3d 20 31 3b 0a 09  ingDepth += 1;..
79a0: 54 63 6c 5f 41 6c 6c 6f 77 45 78 63 65 70 74 69  Tcl_AllowExcepti
79b0: 6f 6e 73 28 69 6e 74 65 72 70 29 3b 0a 09 63 6f  ons(interp);..co
79c0: 64 65 20 3d 20 54 63 6c 5f 47 6c 6f 62 61 6c 45  de = Tcl_GlobalE
79d0: 76 61 6c 28 69 6e 74 65 72 70 2c 20 70 29 3b 0a  val(interp, p);.
79e0: 09 6d 61 69 6e 50 74 72 2d 3e 62 69 6e 64 69 6e  .mainPtr->bindin
79f0: 67 44 65 70 74 68 20 2d 3d 20 31 3b 0a 09 69 66  gDepth -= 1;..if
7a00: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
7a10: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 63 6f 64  ) {..    if (cod
7a20: 65 20 3d 3d 20 54 43 4c 5f 43 4f 4e 54 49 4e 55  e == TCL_CONTINU
7a30: 45 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 44  E) {.../*... * D
7a40: 6f 20 6e 6f 74 68 69 6e 67 3a 20 20 6a 75 73 74  o nothing:  just
7a50: 20 67 6f 20 6f 6e 20 74 6f 20 74 68 65 20 6e 65   go on to the ne
7a60: 78 74 20 73 63 72 69 70 74 2e 0a 09 09 20 2a 2f  xt script.... */
7a70: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
7a80: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 42 52 45  (code == TCL_BRE
7a90: 41 4b 29 20 7b 0a 09 09 62 72 65 61 6b 3b 0a 09  AK) {...break;..
7aa0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54      } else {...T
7ab0: 63 6c 5f 41 64 64 45 72 72 6f 72 49 6e 66 6f 28  cl_AddErrorInfo(
7ac0: 69 6e 74 65 72 70 2c 20 22 5c 6e 20 20 20 20 28  interp, "\n    (
7ad0: 63 6f 6d 6d 61 6e 64 20 62 6f 75 6e 64 20 74 6f  command bound to
7ae0: 20 65 76 65 6e 74 29 22 29 3b 0a 09 09 54 63 6c   event)");...Tcl
7af0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
7b00: 28 69 6e 74 65 72 70 29 3b 0a 09 09 62 72 65 61  (interp);...brea
7b10: 6b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f  k;..    }..}.../
7b20: 2a 0a 09 20 2a 20 53 6b 69 70 20 6f 76 65 72 20  *.. * Skip over 
7b30: 74 68 65 20 63 75 72 72 65 6e 74 20 73 63 72 69  the current scri
7b40: 70 74 20 61 6e 64 20 69 74 73 20 74 65 72 6d 69  pt and its termi
7b50: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
7b60: 61 63 74 65 72 2e 0a 09 20 2a 2f 0a 0a 09 77 68  acter... */...wh
7b70: 69 6c 65 20 28 2a 70 20 21 3d 20 30 29 20 7b 0a  ile (*p != 0) {.
7b80: 09 20 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09 70 2b  .    p++;..}..p+
7b90: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  +;.    }.    if 
7ba0: 28 6d 61 69 6e 50 74 72 2d 3e 62 69 6e 64 69 6e  (mainPtr->bindin
7bb0: 67 44 65 70 74 68 20 3d 3d 20 30 20 26 26 20 6d  gDepth == 0 && m
7bc0: 61 69 6e 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74  ainPtr->refCount
7bd0: 20 3d 3d 20 30 29 20 7b 0a 09 54 6b 44 65 6c 65   == 0) {..TkDele
7be0: 74 65 4d 61 69 6e 28 6d 61 69 6e 50 74 72 29 3b  teMain(mainPtr);
7bf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
7c00: 28 6d 61 69 6e 50 74 72 2d 3e 62 69 6e 64 69 6e  (mainPtr->bindin
7c10: 67 44 65 70 74 68 20 21 3d 20 30 29 0a 09 20 20  gDepth != 0)..  
7c20: 20 20 26 26 20 28 6f 6c 64 44 69 73 70 50 74 72    && (oldDispPtr
7c30: 20 21 3d 20 6d 61 69 6e 50 74 72 2d 3e 63 75 72   != mainPtr->cur
7c40: 44 69 73 70 50 74 72 29 29 20 7b 0a 09 2f 2a 0a  DispPtr)) {../*.
7c50: 09 20 2a 20 53 6f 6d 65 20 6f 74 68 65 72 20 62  . * Some other b
7c60: 69 6e 64 69 6e 67 20 73 63 72 69 70 74 20 69 73  inding script is
7c70: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65 63 75   currently execu
7c80: 74 69 6e 67 2c 20 62 75 74 20 69 74 73 0a 09 20  ting, but its.. 
7c90: 2a 20 73 63 72 65 65 6e 20 69 73 20 6e 6f 20 6c  * screen is no l
7ca0: 6f 6e 67 65 72 20 63 75 72 72 65 6e 74 2e 20 20  onger current.  
7cb0: 43 68 61 6e 67 65 20 74 68 65 20 63 75 72 72 65  Change the curre
7cc0: 6e 74 20 64 69 73 70 6c 61 79 0a 09 20 2a 20 62  nt display.. * b
7cd0: 61 63 6b 20 61 67 61 69 6e 2e 0a 09 20 2a 2f 0a  ack again... */.
7ce0: 0a 09 6d 61 69 6e 50 74 72 2d 3e 63 75 72 44 69  ..mainPtr->curDi
7cf0: 73 70 50 74 72 20 3d 20 6f 6c 64 44 69 73 70 50  spPtr = oldDispP
7d00: 74 72 3b 0a 09 43 68 61 6e 67 65 53 63 72 65 65  tr;..ChangeScree
7d10: 6e 28 69 6e 74 65 72 70 2c 20 6f 6c 64 44 69 73  n(interp, oldDis
7d20: 70 50 74 72 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  pPtr->name);.   
7d30: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69   }.    Tcl_DStri
7d40: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ngResult(interp,
7d50: 20 26 73 61 76 65 64 52 65 73 75 6c 74 29 3b 0a   &savedResult);.
7d60: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
7d70: 72 65 65 28 26 73 63 72 69 70 74 73 29 3b 0a 7d  ree(&scripts);.}
7d80: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7dd0: 2a 0a 20 2a 20 43 68 61 6e 67 65 53 63 72 65 65  *. * ChangeScree
7de0: 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
7df0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
7e00: 6f 6b 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  oked whenever th
7e10: 65 20 63 75 72 72 65 6e 74 20 73 63 72 65 65 6e  e current screen
7e20: 20 63 68 61 6e 67 65 73 0a 20 2a 09 69 6e 20 61   changes. *.in a
7e30: 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20 20  n application.  
7e40: 49 74 20 69 6e 76 6f 6b 65 73 20 61 20 54 63 6c  It invokes a Tcl
7e50: 20 70 72 6f 63 65 64 75 72 65 20 6e 61 6d 65 64   procedure named
7e60: 0a 20 2a 09 22 74 6b 53 63 72 65 65 6e 43 68 61  . *."tkScreenCha
7e70: 6e 67 65 64 22 2c 20 70 61 73 73 69 6e 67 20 69  nged", passing i
7e80: 74 20 74 68 65 20 73 63 72 65 65 6e 20 6e 61 6d  t the screen nam
7e90: 65 20 61 73 20 61 72 67 75 6d 65 6e 74 2e 0a 20  e as argument.. 
7ea0: 2a 09 74 6b 53 63 72 65 65 6e 43 68 61 6e 67 65  *.tkScreenChange
7eb0: 64 20 64 6f 65 73 20 74 68 69 6e 67 73 20 6c 69  d does things li
7ec0: 6b 65 20 6d 61 6b 69 6e 67 20 74 68 65 20 74 6b  ke making the tk
7ed0: 50 72 69 76 20 76 61 72 69 61 62 6c 65 0a 20 2a  Priv variable. *
7ee0: 09 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72 72  .point to an arr
7ef0: 61 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ay for the curre
7f00: 6e 74 20 64 69 73 70 6c 61 79 2e 0a 20 2a 0a 20  nt display.. *. 
7f10: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
7f20: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
7f30: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 70 65 6e  ffects:. *.Depen
7f40: 64 73 20 6f 6e 20 77 68 61 74 20 74 6b 53 63 72  ds on what tkScr
7f50: 65 65 6e 43 68 61 6e 67 65 64 20 64 6f 65 73 2e  eenChanged does.
7f60: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7f70: 63 75 72 73 0a 20 2a 09 74 68 65 6d 20 74 6b 45  curs. *.them tkE
7f80: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 69 6e 76  rror will be inv
7f90: 6f 6b 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  oked.. *. *-----
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
7ff0: 69 64 0a 43 68 61 6e 67 65 53 63 72 65 65 6e 28  id.ChangeScreen(
8000: 69 6e 74 65 72 70 2c 20 64 69 73 70 4e 61 6d 65  interp, dispName
8010: 29 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ).    Tcl_Interp
8020: 20 2a 69 6e 74 65 72 70 3b 09 09 09 2f 2a 20 49   *interp;.../* I
8030: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68  nterpreter in wh
8040: 69 63 68 20 74 6f 20 69 6e 76 6f 6b 65 0a 09 09  ich to invoke...
8050: 09 09 09 20 2a 20 63 6f 6d 6d 61 6e 64 2e 20 2a  ... * command. *
8060: 2f 0a 20 20 20 20 63 68 61 72 20 2a 64 69 73 70  /.    char *disp
8070: 4e 61 6d 65 3b 09 09 09 2f 2a 20 4e 61 6d 65 20  Name;.../* Name 
8080: 6f 66 20 6e 65 77 20 64 69 73 70 6c 61 79 2e 20  of new display. 
8090: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74  */.{.    Tcl_DSt
80a0: 72 69 6e 67 20 63 6d 64 3b 0a 20 20 20 20 69 6e  ring cmd;.    in
80b0: 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20 54 63 6c  t code;..    Tcl
80c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 63 6d  _DStringInit(&cm
80d0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  d);.    Tcl_DStr
80e0: 69 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20  ingAppend(&cmd, 
80f0: 22 74 6b 53 63 72 65 65 6e 43 68 61 6e 67 65 64  "tkScreenChanged
8100: 20 22 2c 20 31 36 29 3b 0a 20 20 20 20 54 63 6c   ", 16);.    Tcl
8110: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
8120: 63 6d 64 2c 20 64 69 73 70 4e 61 6d 65 2c 20 2d  cmd, dispName, -
8130: 31 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54  1);.    code = T
8140: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
8150: 74 65 72 70 2c 20 54 63 6c 5f 44 53 74 72 69 6e  terp, Tcl_DStrin
8160: 67 56 61 6c 75 65 28 26 63 6d 64 29 29 3b 0a 20  gValue(&cmd));. 
8170: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54     if (code != T
8180: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 64  CL_OK) {..Tcl_Ad
8190: 64 45 72 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72  dErrorInfo(inter
81a0: 70 2c 0a 09 09 22 5c 6e 20 20 20 20 28 63 68 61  p,..."\n    (cha
81b0: 6e 67 69 6e 67 20 73 63 72 65 65 6e 20 69 6e 20  nging screen in 
81c0: 65 76 65 6e 74 20 62 69 6e 64 69 6e 67 29 22 29  event binding)")
81d0: 3b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  ;..Tcl_Backgroun
81e0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
81f0: 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 69 6e 64  -----. *. * Find
8250: 53 65 71 75 65 6e 63 65 20 2d 2d 0a 20 2a 0a 20  Sequence --. *. 
8260: 2a 09 46 69 6e 64 20 74 68 65 20 65 6e 74 72 79  *.Find the entry
8270: 20 69 6e 20 61 20 62 69 6e 64 69 6e 67 20 74 61   in a binding ta
8280: 62 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ble that corresp
8290: 6f 6e 64 73 20 74 6f 20 61 0a 20 2a 09 70 61 72  onds to a. *.par
82a0: 74 69 63 75 6c 61 72 20 70 61 74 74 65 72 6e 20  ticular pattern 
82b0: 73 74 72 69 6e 67 2c 20 61 6e 64 20 72 65 74 75  string, and retu
82c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
82d0: 74 68 61 74 0a 20 2a 09 65 6e 74 72 79 2e 0a 20  that. *.entry.. 
82e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
82f0: 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75  .The return valu
8300: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  e is normally a 
8310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
8320: 61 74 53 65 71 0a 20 2a 09 69 6e 20 70 61 74 74  atSeq. *.in patt
8330: 65 72 6e 54 61 62 6c 65 20 74 68 61 74 20 63 6f  ernTable that co
8340: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 65 76 65  rresponds to eve
8350: 6e 74 53 74 72 69 6e 67 2e 20 20 49 66 20 61 6e  ntString.  If an
8360: 20 65 72 72 6f 72 0a 20 2a 09 77 61 73 20 66 6f   error. *.was fo
8370: 75 6e 64 20 77 68 69 6c 65 20 70 61 72 73 69 6e  und while parsin
8380: 67 20 65 76 65 6e 74 53 74 72 69 6e 67 2c 20 6f  g eventString, o
8390: 72 20 69 66 20 22 63 72 65 61 74 65 22 20 69 73  r if "create" is
83a0: 20 30 20 61 6e 64 0a 20 2a 09 6e 6f 20 70 61 74   0 and. *.no pat
83b0: 74 65 72 6e 20 73 65 71 75 65 6e 63 65 20 70 72  tern sequence pr
83c0: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
83d0: 2c 20 6f 72 20 69 66 20 74 68 65 20 70 61 74 74  , or if the patt
83e0: 65 72 6e 0a 20 2a 09 69 6e 63 6c 75 64 65 73 20  ern. *.includes 
83f0: 65 76 65 6e 74 73 20 6e 6f 74 20 73 75 70 70 6f  events not suppo
8400: 72 74 65 64 20 62 79 20 43 54 6b 20 28 6c 69 6b  rted by CTk (lik
8410: 65 20 62 75 74 74 6f 6e 20 70 72 65 73 73 65 73  e button presses
8420: 29 0a 20 2a 09 74 68 65 6e 20 4e 55 4c 4c 20 69  ). *.then NULL i
8430: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 69  s returned and i
8440: 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 20 63 6f  nterp->result co
8450: 6e 74 61 69 6e 73 20 61 20 6d 65 73 73 61 67 65  ntains a message
8460: 0a 20 2a 09 64 65 73 63 72 69 62 69 6e 67 20 74  . *.describing t
8470: 68 65 20 70 72 6f 62 6c 65 6d 2e 20 20 49 66 20  he problem.  If 
8480: 6e 6f 20 70 61 74 74 65 72 6e 20 73 65 71 75 65  no pattern seque
8490: 6e 63 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  nce previously. 
84a0: 2a 09 65 78 69 73 74 65 64 20 66 6f 72 20 65 76  *.existed for ev
84b0: 65 6e 74 53 74 72 69 6e 67 2c 20 74 68 65 6e 20  entString, then 
84c0: 61 20 6e 65 77 20 6f 6e 65 20 69 73 20 63 72 65  a new one is cre
84d0: 61 74 65 64 20 77 69 74 68 20 61 0a 20 2a 09 4e  ated with a. *.N
84e0: 55 4c 4c 20 63 6f 6d 6d 61 6e 64 20 66 69 65 6c  ULL command fiel
84f0: 64 2e 20 20 49 6e 20 61 20 73 75 63 63 65 73 73  d.  In a success
8500: 66 75 6c 20 72 65 74 75 72 6e 2c 20 2a 6d 61 73  ful return, *mas
8510: 6b 50 74 72 20 69 73 0a 20 2a 09 66 69 6c 6c 65  kPtr is. *.fille
8520: 64 20 69 6e 20 77 69 74 68 20 61 20 6d 61 73 6b  d in with a mask
8530: 20 6f 66 20 74 68 65 20 65 76 65 6e 74 20 74 79   of the event ty
8540: 70 65 73 20 6f 6e 20 77 68 69 63 68 20 74 68 65  pes on which the
8550: 20 70 61 74 74 65 72 6e 0a 20 2a 09 73 65 71 75   pattern. *.sequ
8560: 65 6e 63 65 20 64 65 70 65 6e 64 73 2e 20 20 49  ence depends.  I
8570: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8580: 73 2c 20 74 68 65 6e 20 2a 6d 61 73 6b 50 74 72  s, then *maskPtr
8590: 20 69 73 20 73 65 74 0a 20 2a 09 74 6f 20 7a 65   is set. *.to ze
85a0: 72 6f 2c 20 61 6e 64 20 69 66 20 74 68 65 20 70  ro, and if the p
85b0: 61 74 74 65 72 6e 20 63 6f 6e 74 61 69 6e 73 20  attern contains 
85c0: 75 6e 73 75 70 70 6f 72 74 65 64 20 65 76 65 6e  unsupported even
85d0: 74 73 0a 20 2a 09 74 68 65 6e 20 2a 6d 61 73 6b  ts. *.then *mask
85e0: 50 74 72 20 69 73 20 73 65 74 20 74 6f 20 43 54  Ptr is set to CT
85f0: 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45 56  K_UNSUPPORTED_EV
8600: 45 4e 54 5f 4d 41 53 4b 2e 0a 20 2a 0a 20 2a 20  ENT_MASK.. *. * 
8610: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8620: 09 41 20 6e 65 77 20 70 61 74 74 65 72 6e 20 73  .A new pattern s
8630: 65 71 75 65 6e 63 65 20 6d 61 79 20 62 65 20 63  equence may be c
8640: 72 65 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d  reated.. *. *---
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8690: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
86a0: 50 61 74 53 65 71 20 2a 0a 46 69 6e 64 53 65 71  PatSeq *.FindSeq
86b0: 75 65 6e 63 65 28 69 6e 74 65 72 70 2c 20 62 69  uence(interp, bi
86c0: 6e 64 50 74 72 2c 20 6f 62 6a 65 63 74 2c 20 65  ndPtr, object, e
86d0: 76 65 6e 74 53 74 72 69 6e 67 2c 20 63 72 65 61  ventString, crea
86e0: 74 65 2c 20 6d 61 73 6b 50 74 72 29 0a 20 20 20  te, maskPtr).   
86f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8700: 65 72 70 3b 09 09 2f 2a 20 49 6e 74 65 72 70 72  erp;../* Interpr
8710: 65 74 65 72 20 74 6f 20 75 73 65 20 66 6f 72 20  eter to use for 
8720: 65 72 72 6f 72 0a 09 09 09 09 20 2a 20 72 65 70  error..... * rep
8730: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 42  orting. */.    B
8740: 69 6e 64 69 6e 67 54 61 62 6c 65 20 2a 62 69 6e  indingTable *bin
8750: 64 50 74 72 3b 09 2f 2a 20 54 61 62 6c 65 20 74  dPtr;./* Table t
8760: 6f 20 75 73 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  o use for lookup
8770: 2e 20 2a 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44  . */.    ClientD
8780: 61 74 61 20 6f 62 6a 65 63 74 3b 09 09 2f 2a 20  ata object;../* 
8790: 54 6f 6b 65 6e 20 66 6f 72 20 6f 62 6a 65 63 74  Token for object
87a0: 28 73 29 20 77 69 74 68 20 77 68 69 63 68 20 62  (s) with which b
87b0: 69 6e 64 69 6e 67 0a 09 09 09 09 20 2a 20 69 73  inding..... * is
87c0: 20 61 73 73 6f 63 69 61 74 65 64 2e 20 2a 2f 0a   associated. */.
87d0: 20 20 20 20 63 68 61 72 20 2a 65 76 65 6e 74 53      char *eventS
87e0: 74 72 69 6e 67 3b 09 09 2f 2a 20 53 74 72 69 6e  tring;../* Strin
87f0: 67 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  g description of
8800: 20 70 61 74 74 65 72 6e 20 74 6f 0a 09 09 09 09   pattern to.....
8810: 20 2a 20 6d 61 74 63 68 20 6f 6e 2e 20 20 53 65   * match on.  Se
8820: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61  e user documenta
8830: 74 69 6f 6e 0a 09 09 09 09 20 2a 20 66 6f 72 20  tion..... * for 
8840: 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
8850: 69 6e 74 20 63 72 65 61 74 65 3b 09 09 09 2f 2a  int create;.../*
8860: 20 30 20 6d 65 61 6e 73 20 64 6f 6e 27 74 20 63   0 means don't c
8870: 72 65 61 74 65 20 74 68 65 20 65 6e 74 72 79 20  reate the entry 
8880: 69 66 0a 09 09 09 09 20 2a 20 69 74 20 64 6f 65  if..... * it doe
8890: 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69  sn't already exi
88a0: 73 74 2e 20 20 20 4e 6f 6e 2d 7a 65 72 6f 0a 09  st.   Non-zero..
88b0: 09 09 09 20 2a 20 6d 65 61 6e 73 20 63 72 65 61  ... * means crea
88c0: 74 65 2e 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  te. */.    unsig
88d0: 6e 65 64 20 6c 6f 6e 67 20 2a 6d 61 73 6b 50 74  ned long *maskPt
88e0: 72 3b 09 2f 2a 20 2a 6d 61 73 6b 50 74 72 20 69  r;./* *maskPtr i
88f0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
8900: 20 74 68 65 20 65 76 65 6e 74 0a 09 09 09 09 20   the event..... 
8910: 2a 20 74 79 70 65 73 20 6f 6e 20 77 68 69 63 68  * types on which
8920: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 73 65   this pattern se
8930: 71 75 65 6e 63 65 0a 09 09 09 09 20 2a 20 64 65  quence..... * de
8940: 70 65 6e 64 73 2e 20 2a 2f 0a 0a 7b 0a 20 20 20  pends. */..{.   
8950: 20 50 61 74 74 65 72 6e 20 70 61 74 73 5b 45 56   Pattern pats[EV
8960: 45 4e 54 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d  ENT_BUFFER_SIZE]
8970: 3b 0a 20 20 20 20 69 6e 74 20 6e 75 6d 50 61 74  ;.    int numPat
8980: 73 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  s;.    register 
8990: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 72 65 67  char *p;.    reg
89a0: 69 73 74 65 72 20 50 61 74 74 65 72 6e 20 2a 70  ister Pattern *p
89b0: 61 74 50 74 72 3b 0a 20 20 20 20 72 65 67 69 73  atPtr;.    regis
89c0: 74 65 72 20 50 61 74 53 65 71 20 2a 70 73 50 74  ter PatSeq *psPt
89d0: 72 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  r;.    register 
89e0: 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68  Tcl_HashEntry *h
89f0: 50 74 72 3b 0a 23 64 65 66 69 6e 65 20 46 49 45  Ptr;.#define FIE
8a00: 4c 44 5f 53 49 5a 45 20 34 38 0a 20 20 20 20 63  LD_SIZE 48.    c
8a10: 68 61 72 20 66 69 65 6c 64 5b 46 49 45 4c 44 5f  har field[FIELD_
8a20: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 66  SIZE];.    int f
8a30: 6c 61 67 73 2c 20 63 6f 75 6e 74 2c 20 6e 65 77  lags, count, new
8a40: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 73 65 71  ;.    size_t seq
8a50: 75 65 6e 63 65 53 69 7a 65 3b 0a 20 20 20 20 75  uenceSize;.    u
8a60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 76 65  nsigned long eve
8a70: 6e 74 4d 61 73 6b 3b 0a 20 20 20 20 50 61 74 74  ntMask;.    Patt
8a80: 65 72 6e 54 61 62 6c 65 4b 65 79 20 6b 65 79 3b  ernTableKey key;
8a90: 0a 20 20 20 20 63 68 61 72 20 65 72 72 6f 72 5f  .    char error_
8aa0: 62 75 66 66 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  buffer[100];..  
8ab0: 20 20 2f 2a 0a 20 20 20 20 20 2a 2d 2d 2d 2d 2d    /*.     *-----
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 20 2a 20  --------.     * 
8b00: 53 74 65 70 20 31 3a 20 70 61 72 73 65 20 74 68  Step 1: parse th
8b10: 65 20 70 61 74 74 65 72 6e 20 73 74 72 69 6e 67  e pattern string
8b20: 20 74 6f 20 70 72 6f 64 75 63 65 20 61 6e 20 61   to produce an a
8b30: 72 72 61 79 0a 20 20 20 20 20 2a 20 6f 66 20 50  rray.     * of P
8b40: 61 74 74 65 72 6e 73 2e 20 20 54 68 65 20 61 72  atterns.  The ar
8b50: 72 61 79 20 69 73 20 67 65 6e 65 72 61 74 65 64  ray is generated
8b60: 20 62 61 63 6b 77 61 72 64 73 2c 20 73 6f 0a 20   backwards, so. 
8b70: 20 20 20 20 2a 20 74 68 61 74 20 74 68 65 20 6c      * that the l
8b80: 6f 77 65 73 74 2d 69 6e 64 65 78 65 64 20 70 61  owest-indexed pa
8b90: 74 74 65 72 6e 20 63 6f 72 72 65 73 70 6f 6e 64  ttern correspond
8ba0: 73 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20  s to the last.  
8bb0: 20 20 20 2a 20 65 76 65 6e 74 20 74 68 61 74 20     * event that 
8bc0: 6d 75 73 74 20 6f 63 63 75 72 2e 0a 20 20 20 20  must occur..    
8bd0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8c10: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 70 20 3d       */..    p =
8c20: 20 65 76 65 6e 74 53 74 72 69 6e 67 3b 0a 20 20   eventString;.  
8c30: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20    flags = 0;.   
8c40: 20 65 76 65 6e 74 4d 61 73 6b 20 3d 20 30 3b 0a   eventMask = 0;.
8c50: 20 20 20 20 66 6f 72 20 28 6e 75 6d 50 61 74 73      for (numPats
8c60: 20 3d 20 30 2c 20 70 61 74 50 74 72 20 3d 20 26   = 0, patPtr = &
8c70: 70 61 74 73 5b 45 56 45 4e 54 5f 42 55 46 46 45  pats[EVENT_BUFFE
8c80: 52 5f 53 49 5a 45 2d 31 5d 3b 0a 09 20 20 20 20  R_SIZE-1];..    
8c90: 6e 75 6d 50 61 74 73 20 3c 20 45 56 45 4e 54 5f  numPats < EVENT_
8ca0: 42 55 46 46 45 52 5f 53 49 5a 45 3b 0a 09 20 20  BUFFER_SIZE;..  
8cb0: 20 20 6e 75 6d 50 61 74 73 2b 2b 2c 20 70 61 74    numPats++, pat
8cc0: 50 74 72 2d 2d 29 20 7b 0a 09 70 61 74 50 74 72  Ptr--) {..patPtr
8cd0: 2d 3e 65 76 65 6e 74 54 79 70 65 20 3d 20 2d 31  ->eventType = -1
8ce0: 3b 0a 09 70 61 74 50 74 72 2d 3e 6e 65 65 64 4d  ;..patPtr->needM
8cf0: 6f 64 73 20 3d 20 30 3b 0a 09 70 61 74 50 74 72  ods = 0;..patPtr
8d00: 2d 3e 64 65 74 61 69 6c 20 3d 20 30 3b 0a 09 77  ->detail = 0;..w
8d10: 68 69 6c 65 20 28 69 73 73 70 61 63 65 28 55 43  hile (isspace(UC
8d20: 48 41 52 28 2a 70 29 29 29 20 7b 0a 09 20 20 20  HAR(*p))) {..   
8d30: 20 70 2b 2b 3b 0a 09 7d 0a 09 69 66 20 28 2a 70   p++;..}..if (*p
8d40: 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 20 20 20   == '\0') {..   
8d50: 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a   break;..}.../*.
8d60: 09 20 2a 20 48 61 6e 64 6c 65 20 73 69 6d 70 6c  . * Handle simpl
8d70: 65 20 41 53 43 49 49 20 63 68 61 72 61 63 74 65  e ASCII characte
8d80: 72 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 2a  rs... */...if (*
8d90: 70 20 21 3d 20 27 3c 27 29 20 7b 0a 09 20 20 20  p != '<') {..   
8da0: 20 63 68 61 72 20 73 74 72 69 6e 67 5b 32 5d 3b   char string[2];
8db0: 0a 0a 09 20 20 20 20 70 61 74 50 74 72 2d 3e 65  ...    patPtr->e
8dc0: 76 65 6e 74 54 79 70 65 20 3d 20 43 54 4b 5f 4b  ventType = CTK_K
8dd0: 45 59 5f 45 56 45 4e 54 3b 0a 09 20 20 20 20 65  EY_EVENT;..    e
8de0: 76 65 6e 74 4d 61 73 6b 20 7c 3d 20 43 54 4b 5f  ventMask |= CTK_
8df0: 4b 45 59 5f 45 56 45 4e 54 5f 4d 41 53 4b 3b 0a  KEY_EVENT_MASK;.
8e00: 09 20 20 20 20 73 74 72 69 6e 67 5b 30 5d 20 3d  .    string[0] =
8e10: 20 2a 70 3b 0a 09 20 20 20 20 73 74 72 69 6e 67   *p;..    string
8e20: 5b 31 5d 20 3d 20 30 3b 0a 09 20 20 20 20 68 50  [1] = 0;..    hP
8e30: 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61 73  tr = Tcl_FindHas
8e40: 68 45 6e 74 72 79 28 26 6b 65 79 53 79 6d 54 61  hEntry(&keySymTa
8e50: 62 6c 65 2c 20 73 74 72 69 6e 67 29 3b 0a 09 20  ble, string);.. 
8e60: 20 20 20 69 66 20 28 68 50 74 72 20 21 3d 20 4e     if (hPtr != N
8e70: 55 4c 4c 29 20 7b 0a 09 09 70 61 74 50 74 72 2d  ULL) {...patPtr-
8e80: 3e 64 65 74 61 69 6c 20 3d 20 28 69 6e 74 29 20  >detail = (int) 
8e90: 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65  Tcl_GetHashValue
8ea0: 28 68 50 74 72 29 3b 0a 09 20 20 20 20 7d 20 65  (hPtr);..    } e
8eb0: 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 70 72  lse {...if (ispr
8ec0: 69 6e 74 28 55 43 48 41 52 28 2a 70 29 29 29 20  int(UCHAR(*p))) 
8ed0: 7b 0a 09 09 20 20 20 20 70 61 74 50 74 72 2d 3e  {...    patPtr->
8ee0: 64 65 74 61 69 6c 20 3d 20 2a 70 3b 0a 09 09 7d  detail = *p;...}
8ef0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
8f00: 20 0a 09 09 20 20 20 20 73 70 72 69 6e 74 66 28   ...    sprintf(
8f10: 65 72 72 6f 72 5f 62 75 66 66 65 72 2c 0a 09 09  error_buffer,...
8f20: 09 20 20 20 20 22 62 61 64 20 41 53 43 49 49 20  .    "bad ASCII 
8f30: 63 68 61 72 61 63 74 65 72 20 30 78 25 78 22 2c  character 0x%x",
8f40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
8f50: 20 2a 70 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f   *p);...    Tcl_
8f60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
8f70: 2c 20 65 72 72 6f 72 5f 62 75 66 66 65 72 2c 20  , error_buffer, 
8f80: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09  TCL_VOLATILE);..
8f90: 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b  .    goto error;
8fa0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20  ...}..    }..   
8fb0: 20 70 2b 2b 3b 0a 09 20 20 20 20 63 6f 6e 74 69   p++;..    conti
8fc0: 6e 75 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  nue;..}.../*.. *
8fd0: 20 41 20 66 61 6e 63 69 65 72 20 65 76 65 6e 74   A fancier event
8fe0: 20 64 65 73 63 72 69 70 74 69 6f 6e 2e 20 20 4d   description.  M
8ff0: 75 73 74 20 63 6f 6e 73 69 73 74 20 6f 66 0a 09  ust consist of..
9000: 20 2a 20 31 2e 20 6f 70 65 6e 20 61 6e 67 6c 65   * 1. open angle
9010: 20 62 72 61 63 6b 65 74 2e 0a 09 20 2a 20 32 2e   bracket... * 2.
9020: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 6d   any number of m
9030: 6f 64 69 66 69 65 72 73 2c 20 65 61 63 68 20 66  odifiers, each f
9040: 6f 6c 6c 6f 77 65 64 20 62 79 20 73 70 61 63 65  ollowed by space
9050: 73 0a 09 20 2a 20 20 20 20 6f 72 20 64 61 73 68  s.. *    or dash
9060: 65 73 2e 0a 09 20 2a 20 33 2e 20 61 6e 20 6f 70  es... * 3. an op
9070: 74 69 6f 6e 61 6c 20 65 76 65 6e 74 20 6e 61 6d  tional event nam
9080: 65 2e 0a 09 20 2a 20 34 2e 20 61 6e 20 6f 70 74  e... * 4. an opt
9090: 69 6f 6e 20 62 75 74 74 6f 6e 20 6f 72 20 6b 65  ion button or ke
90a0: 79 73 79 6d 20 6e 61 6d 65 2e 20 20 45 69 74 68  ysym name.  Eith
90b0: 65 72 20 74 68 69 73 20 6f 72 0a 09 20 2a 20 20  er this or.. *  
90c0: 20 20 69 74 65 6d 20 33 20 2a 6d 75 73 74 2a 20    item 3 *must* 
90d0: 62 65 20 70 72 65 73 65 6e 74 3b 20 20 69 66 20  be present;  if 
90e0: 62 6f 74 68 20 61 72 65 20 70 72 65 73 65 6e 74  both are present
90f0: 0a 09 20 2a 20 20 20 20 74 68 65 6e 20 74 68 65  .. *    then the
9100: 79 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  y are separated 
9110: 62 79 20 73 70 61 63 65 73 20 6f 72 20 64 61 73  by spaces or das
9120: 68 65 73 2e 0a 09 20 2a 20 35 2e 20 61 20 63 6c  hes... * 5. a cl
9130: 6f 73 65 20 61 6e 67 6c 65 20 62 72 61 63 6b 65  ose angle bracke
9140: 74 2e 0a 09 20 2a 2f 0a 0a 09 63 6f 75 6e 74 20  t... */...count 
9150: 3d 20 31 3b 0a 09 70 2b 2b 3b 0a 09 77 68 69 6c  = 1;..p++;..whil
9160: 65 20 28 31 29 20 7b 0a 09 20 20 20 20 72 65 67  e (1) {..    reg
9170: 69 73 74 65 72 20 4d 6f 64 49 6e 66 6f 20 2a 6d  ister ModInfo *m
9180: 6f 64 50 74 72 3b 0a 09 20 20 20 20 70 20 3d 20  odPtr;..    p = 
9190: 47 65 74 46 69 65 6c 64 28 70 2c 20 66 69 65 6c  GetField(p, fiel
91a0: 64 2c 20 46 49 45 4c 44 5f 53 49 5a 45 29 3b 0a  d, FIELD_SIZE);.
91b0: 09 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f  .    hPtr = Tcl_
91c0: 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 6d  FindHashEntry(&m
91d0: 6f 64 54 61 62 6c 65 2c 20 66 69 65 6c 64 29 3b  odTable, field);
91e0: 0a 09 20 20 20 20 69 66 20 28 68 50 74 72 20 3d  ..    if (hPtr =
91f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 62 72 65 61  = NULL) {...brea
9200: 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6d  k;..    }..    m
9210: 6f 64 50 74 72 20 3d 20 28 4d 6f 64 49 6e 66 6f  odPtr = (ModInfo
9220: 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56   *) Tcl_GetHashV
9230: 61 6c 75 65 28 68 50 74 72 29 3b 0a 09 20 20 20  alue(hPtr);..   
9240: 20 70 61 74 50 74 72 2d 3e 6e 65 65 64 4d 6f 64   patPtr->needMod
9250: 73 20 7c 3d 20 6d 6f 64 50 74 72 2d 3e 6d 61 73  s |= modPtr->mas
9260: 6b 3b 0a 09 20 20 20 20 69 66 20 28 6d 6f 64 50  k;..    if (modP
9270: 74 72 2d 3e 66 6c 61 67 73 20 26 20 28 44 4f 55  tr->flags & (DOU
9280: 42 4c 45 7c 54 52 49 50 4c 45 29 29 20 7b 0a 09  BLE|TRIPLE)) {..
9290: 09 66 6c 61 67 73 20 7c 3d 20 50 41 54 5f 4e 45  .flags |= PAT_NE
92a0: 41 52 42 59 3b 0a 09 09 69 66 20 28 6d 6f 64 50  ARBY;...if (modP
92b0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 44 4f 55 42  tr->flags & DOUB
92c0: 4c 45 29 20 7b 0a 09 09 20 20 20 20 63 6f 75 6e  LE) {...    coun
92d0: 74 20 3d 20 32 3b 0a 09 09 7d 20 65 6c 73 65 20  t = 2;...} else 
92e0: 7b 0a 09 09 20 20 20 20 63 6f 75 6e 74 20 3d 20  {...    count = 
92f0: 33 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20  3;...}..    }.. 
9300: 20 20 20 77 68 69 6c 65 20 28 28 2a 70 20 3d 3d     while ((*p ==
9310: 20 27 2d 27 29 20 7c 7c 20 69 73 73 70 61 63 65   '-') || isspace
9320: 28 55 43 48 41 52 28 2a 70 29 29 29 20 7b 0a 09  (UCHAR(*p))) {..
9330: 09 70 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  .p++;..    }..}.
9340: 09 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64  .hPtr = Tcl_Find
9350: 48 61 73 68 45 6e 74 72 79 28 26 65 76 65 6e 74  HashEntry(&event
9360: 54 61 62 6c 65 2c 20 66 69 65 6c 64 29 3b 0a 09  Table, field);..
9370: 69 66 20 28 68 50 74 72 20 21 3d 20 4e 55 4c 4c  if (hPtr != NULL
9380: 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74 65  ) {..    registe
9390: 72 20 45 76 65 6e 74 49 6e 66 6f 20 2a 65 69 50  r EventInfo *eiP
93a0: 74 72 3b 0a 09 20 20 20 20 65 69 50 74 72 20 3d  tr;..    eiPtr =
93b0: 20 28 45 76 65 6e 74 49 6e 66 6f 20 2a 29 20 54   (EventInfo *) T
93c0: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28  cl_GetHashValue(
93d0: 68 50 74 72 29 3b 0a 09 20 20 20 20 69 66 20 28  hPtr);..    if (
93e0: 65 69 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43  eiPtr->type == C
93f0: 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45  TK_UNSUPPORTED_E
9400: 56 45 4e 54 29 20 7b 0a 09 09 67 6f 74 6f 20 75  VENT) {...goto u
9410: 6e 73 75 70 70 6f 72 74 65 64 3b 0a 09 20 20 20  nsupported;..   
9420: 20 7d 0a 09 20 20 20 20 70 61 74 50 74 72 2d 3e   }..    patPtr->
9430: 65 76 65 6e 74 54 79 70 65 20 3d 20 65 69 50 74  eventType = eiPt
9440: 72 2d 3e 74 79 70 65 3b 0a 09 20 20 20 20 65 76  r->type;..    ev
9450: 65 6e 74 4d 61 73 6b 20 7c 3d 20 65 69 50 74 72  entMask |= eiPtr
9460: 2d 3e 65 76 65 6e 74 4d 61 73 6b 3b 0a 09 20 20  ->eventMask;..  
9470: 20 20 77 68 69 6c 65 20 28 28 2a 70 20 3d 3d 20    while ((*p == 
9480: 27 2d 27 29 20 7c 7c 20 69 73 73 70 61 63 65 28  '-') || isspace(
9490: 55 43 48 41 52 28 2a 70 29 29 29 20 7b 0a 09 09  UCHAR(*p))) {...
94a0: 70 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  p++;..    }..   
94b0: 20 70 20 3d 20 47 65 74 46 69 65 6c 64 28 70 2c   p = GetField(p,
94c0: 20 66 69 65 6c 64 2c 20 46 49 45 4c 44 5f 53 49   field, FIELD_SI
94d0: 5a 45 29 3b 0a 09 7d 0a 09 69 66 20 28 2a 66 69  ZE);..}..if (*fi
94e0: 65 6c 64 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09  eld != '\0') {..
94f0: 20 20 20 20 69 66 20 28 28 2a 66 69 65 6c 64 20      if ((*field 
9500: 3e 3d 20 27 31 27 29 20 26 26 20 28 2a 66 69 65  >= '1') && (*fie
9510: 6c 64 20 3c 3d 20 27 35 27 29 20 26 26 20 28 66  ld <= '5') && (f
9520: 69 65 6c 64 5b 31 5d 20 3d 3d 20 27 5c 30 27 29  ield[1] == '\0')
9530: 29 20 7b 0a 09 09 69 66 20 28 70 61 74 50 74 72  ) {...if (patPtr
9540: 2d 3e 65 76 65 6e 74 54 79 70 65 20 3d 3d 20 2d  ->eventType == -
9550: 31 29 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09 09  1) {...    /*...
9560: 20 20 20 20 20 2a 20 42 75 74 74 6f 6e 20 70 72       * Button pr
9570: 65 73 73 20 70 61 74 74 65 72 6e 2e 0a 09 09 20  ess pattern.... 
9580: 20 20 20 20 2a 2f 0a 09 09 20 20 20 20 67 6f 74      */...    got
9590: 6f 20 75 6e 73 75 70 70 6f 72 74 65 64 3b 0a 09  o unsupported;..
95a0: 09 7d 20 65 6c 73 65 20 69 66 20 28 70 61 74 50  .} else if (patP
95b0: 74 72 2d 3e 65 76 65 6e 74 54 79 70 65 20 3d 3d  tr->eventType ==
95c0: 20 43 54 4b 5f 4b 45 59 5f 45 56 45 4e 54 29 20   CTK_KEY_EVENT) 
95d0: 7b 0a 09 09 20 20 20 20 67 6f 74 6f 20 67 65 74  {...    goto get
95e0: 4b 65 79 73 79 6d 3b 0a 09 09 7d 20 65 6c 73 65  Keysym;...} else
95f0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
9600: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9610: 2c 20 22 73 70 65 63 69 66 69 65 64 20 62 75 74  , "specified but
9620: 74 6f 6e 20 5c 22 22 2c 20 66 69 65 6c 64 2c 0a  ton \"", field,.
9630: 09 09 09 20 20 20 20 22 5c 22 20 66 6f 72 20 6e  ...    "\" for n
9640: 6f 6e 2d 62 75 74 74 6f 6e 20 65 76 65 6e 74 22  on-button event"
9650: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9660: 3b 0a 09 09 20 20 20 20 67 6f 74 6f 20 65 72 72  ;...    goto err
9670: 6f 72 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65  or;...}..    } e
9680: 6c 73 65 20 7b 0a 09 09 67 65 74 4b 65 79 73 79  lse {...getKeysy
9690: 6d 3a 0a 09 09 68 50 74 72 20 3d 20 54 63 6c 5f  m:...hPtr = Tcl_
96a0: 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 6b  FindHashEntry(&k
96b0: 65 79 53 79 6d 54 61 62 6c 65 2c 20 28 63 68 61  eySymTable, (cha
96c0: 72 20 2a 29 20 66 69 65 6c 64 29 3b 0a 09 09 69  r *) field);...i
96d0: 66 20 28 68 50 74 72 20 3d 3d 20 4e 55 4c 4c 29  f (hPtr == NULL)
96e0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
96f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9700: 2c 20 22 62 61 64 20 65 76 65 6e 74 20 74 79 70  , "bad event typ
9710: 65 20 6f 72 20 6b 65 79 73 79 6d 20 5c 22 22 2c  e or keysym \"",
9720: 0a 09 09 09 20 20 20 20 66 69 65 6c 64 2c 20 22  ....    field, "
9730: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
9740: 4c 4c 29 3b 0a 09 09 20 20 20 20 67 6f 74 6f 20  LL);...    goto 
9750: 65 72 72 6f 72 3b 0a 09 09 7d 0a 09 09 70 61 74  error;...}...pat
9760: 50 74 72 2d 3e 64 65 74 61 69 6c 20 3d 20 28 69  Ptr->detail = (i
9770: 6e 74 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56  nt) Tcl_GetHashV
9780: 61 6c 75 65 28 68 50 74 72 29 3b 0a 09 09 69 66  alue(hPtr);...if
9790: 20 28 70 61 74 50 74 72 2d 3e 65 76 65 6e 74 54   (patPtr->eventT
97a0: 79 70 65 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 20  ype == -1) {... 
97b0: 20 20 20 70 61 74 50 74 72 2d 3e 65 76 65 6e 74     patPtr->event
97c0: 54 79 70 65 20 3d 20 43 54 4b 5f 4b 45 59 5f 45  Type = CTK_KEY_E
97d0: 56 45 4e 54 3b 0a 09 09 20 20 20 20 65 76 65 6e  VENT;...    even
97e0: 74 4d 61 73 6b 20 7c 3d 20 43 54 4b 5f 4b 45 59  tMask |= CTK_KEY
97f0: 5f 45 56 45 4e 54 5f 4d 41 53 4b 3b 0a 09 09 7d  _EVENT_MASK;...}
9800: 20 65 6c 73 65 20 69 66 20 28 70 61 74 50 74 72   else if (patPtr
9810: 2d 3e 65 76 65 6e 74 54 79 70 65 20 21 3d 20 43  ->eventType != C
9820: 54 4b 5f 4b 45 59 5f 45 56 45 4e 54 29 20 7b 0a  TK_KEY_EVENT) {.
9830: 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
9840: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9850: 73 70 65 63 69 66 69 65 64 20 6b 65 79 73 79 6d  specified keysym
9860: 20 5c 22 22 2c 20 66 69 65 6c 64 2c 0a 09 09 09   \"", field,....
9870: 20 20 20 20 22 5c 22 20 66 6f 72 20 6e 6f 6e 2d      "\" for non-
9880: 6b 65 79 20 65 76 65 6e 74 22 2c 20 28 63 68 61  key event", (cha
9890: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 20 20  r *) NULL);...  
98a0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 09    goto error;...
98b0: 7d 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65  }..    }..} else
98c0: 20 69 66 20 28 70 61 74 50 74 72 2d 3e 65 76 65   if (patPtr->eve
98d0: 6e 74 54 79 70 65 20 3d 3d 20 2d 31 29 20 7b 0a  ntType == -1) {.
98e0: 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
98f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 65  lt(interp, "no e
9900: 76 65 6e 74 20 74 79 70 65 20 6f 72 20 62 75 74  vent type or but
9910: 74 6f 6e 20 23 20 6f 72 20 6b 65 79 73 79 6d 22  ton # or keysym"
9920: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
9930: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
9940: 09 7d 0a 09 77 68 69 6c 65 20 28 28 2a 70 20 3d  .}..while ((*p =
9950: 3d 20 27 2d 27 29 20 7c 7c 20 69 73 73 70 61 63  = '-') || isspac
9960: 65 28 55 43 48 41 52 28 2a 70 29 29 29 20 7b 0a  e(UCHAR(*p))) {.
9970: 09 20 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09 69 66  .    p++;..}..if
9980: 20 28 2a 70 20 21 3d 20 27 3e 27 29 20 7b 0a 09   (*p != '>') {..
9990: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
99a0: 74 28 69 6e 74 65 72 70 2c 20 22 6d 69 73 73 69  t(interp, "missi
99b0: 6e 67 20 5c 22 3e 5c 22 20 69 6e 20 62 69 6e 64  ng \">\" in bind
99c0: 69 6e 67 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  ing", TCL_STATIC
99d0: 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 65 72 72  );..    goto err
99e0: 6f 72 3b 0a 09 7d 0a 09 70 2b 2b 3b 0a 0a 09 2f  or;..}..p++;.../
99f0: 2a 0a 09 20 2a 20 52 65 70 6c 69 63 61 74 65 20  *.. * Replicate 
9a00: 65 76 65 6e 74 73 20 66 6f 72 20 44 4f 55 42 4c  events for DOUBL
9a10: 45 20 61 6e 64 20 54 52 49 50 4c 45 2e 0a 09 20  E and TRIPLE... 
9a20: 2a 2f 0a 0a 09 69 66 20 28 28 63 6f 75 6e 74 20  */...if ((count 
9a30: 3e 20 31 29 20 26 26 20 28 6e 75 6d 50 61 74 73  > 1) && (numPats
9a40: 20 3c 20 45 56 45 4e 54 5f 42 55 46 46 45 52 5f   < EVENT_BUFFER_
9a50: 53 49 5a 45 2d 31 29 29 20 7b 0a 09 20 20 20 20  SIZE-1)) {..    
9a60: 70 61 74 50 74 72 5b 2d 31 5d 20 3d 20 70 61 74  patPtr[-1] = pat
9a70: 50 74 72 5b 30 5d 3b 0a 09 20 20 20 20 70 61 74  Ptr[0];..    pat
9a80: 50 74 72 2d 2d 3b 0a 09 20 20 20 20 6e 75 6d 50  Ptr--;..    numP
9a90: 61 74 73 2b 2b 3b 0a 09 20 20 20 20 69 66 20 28  ats++;..    if (
9aa0: 28 63 6f 75 6e 74 20 3d 3d 20 33 29 20 26 26 20  (count == 3) && 
9ab0: 28 6e 75 6d 50 61 74 73 20 3c 20 45 56 45 4e 54  (numPats < EVENT
9ac0: 5f 42 55 46 46 45 52 5f 53 49 5a 45 2d 31 29 29  _BUFFER_SIZE-1))
9ad0: 20 7b 0a 09 09 70 61 74 50 74 72 5b 2d 31 5d 20   {...patPtr[-1] 
9ae0: 3d 20 70 61 74 50 74 72 5b 30 5d 3b 0a 09 09 70  = patPtr[0];...p
9af0: 61 74 50 74 72 2d 2d 3b 0a 09 09 6e 75 6d 50 61  atPtr--;...numPa
9b00: 74 73 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  ts++;..    }..}.
9b10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
9b20: 20 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     *------------
9b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9b60: 2d 0a 20 20 20 20 20 2a 20 53 74 65 70 20 32 3a  -.     * Step 2:
9b70: 20 66 69 6e 64 20 74 68 65 20 73 65 71 75 65 6e   find the sequen
9b80: 63 65 20 69 6e 20 74 68 65 20 62 69 6e 64 69 6e  ce in the bindin
9b90: 67 20 74 61 62 6c 65 20 69 66 20 69 74 20 65 78  g table if it ex
9ba0: 69 73 74 73 2c 0a 20 20 20 20 20 2a 20 61 6e 64  ists,.     * and
9bb0: 20 61 64 64 20 61 20 6e 65 77 20 73 65 71 75 65   add a new seque
9bc0: 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nce to the table
9bd0: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 2e 0a   if it doesn't..
9be0: 20 20 20 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       *----------
9bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c20: 2d 2d 2d 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ---.     */..   
9c30: 20 69 66 20 28 6e 75 6d 50 61 74 73 20 3d 3d 20   if (numPats == 
9c40: 30 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65 73  0) {..Tcl_SetRes
9c50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
9c60: 65 76 65 6e 74 73 20 73 70 65 63 69 66 69 65 64  events specified
9c70: 20 69 6e 20 62 69 6e 64 69 6e 67 22 2c 20 54 43   in binding", TC
9c80: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 67 6f 74 6f  L_STATIC);..goto
9c90: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
9ca0: 20 20 70 61 74 50 74 72 20 3d 20 26 70 61 74 73    patPtr = &pats
9cb0: 5b 45 56 45 4e 54 5f 42 55 46 46 45 52 5f 53 49  [EVENT_BUFFER_SI
9cc0: 5a 45 2d 6e 75 6d 50 61 74 73 5d 3b 0a 20 20 20  ZE-numPats];.   
9cd0: 20 6b 65 79 2e 6f 62 6a 65 63 74 20 3d 20 6f 62   key.object = ob
9ce0: 6a 65 63 74 3b 0a 20 20 20 20 6b 65 79 2e 74 79  ject;.    key.ty
9cf0: 70 65 20 3d 20 70 61 74 50 74 72 2d 3e 65 76 65  pe = patPtr->eve
9d00: 6e 74 54 79 70 65 3b 0a 20 20 20 20 6b 65 79 2e  ntType;.    key.
9d10: 64 65 74 61 69 6c 20 3d 20 70 61 74 50 74 72 2d  detail = patPtr-
9d20: 3e 64 65 74 61 69 6c 3b 0a 20 20 20 20 68 50 74  >detail;.    hPt
9d30: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61  r = Tcl_CreateHa
9d40: 73 68 45 6e 74 72 79 28 26 62 69 6e 64 50 74 72  shEntry(&bindPtr
9d50: 2d 3e 70 61 74 74 65 72 6e 54 61 62 6c 65 2c 20  ->patternTable, 
9d60: 28 63 68 61 72 20 2a 29 20 26 6b 65 79 2c 20 26  (char *) &key, &
9d70: 6e 65 77 29 3b 0a 20 20 20 20 73 65 71 75 65 6e  new);.    sequen
9d80: 63 65 53 69 7a 65 20 3d 20 6e 75 6d 50 61 74 73  ceSize = numPats
9d90: 2a 73 69 7a 65 6f 66 28 50 61 74 74 65 72 6e 29  *sizeof(Pattern)
9da0: 3b 0a 20 20 20 20 69 66 20 28 21 6e 65 77 29 20  ;.    if (!new) 
9db0: 7b 0a 09 66 6f 72 20 28 70 73 50 74 72 20 3d 20  {..for (psPtr = 
9dc0: 28 50 61 74 53 65 71 20 2a 29 20 54 63 6c 5f 47  (PatSeq *) Tcl_G
9dd0: 65 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 72  etHashValue(hPtr
9de0: 29 3b 20 70 73 50 74 72 20 21 3d 20 4e 55 4c 4c  ); psPtr != NULL
9df0: 3b 0a 09 09 70 73 50 74 72 20 3d 20 70 73 50 74  ;...psPtr = psPt
9e00: 72 2d 3e 6e 65 78 74 53 65 71 50 74 72 29 20 7b  r->nextSeqPtr) {
9e10: 0a 09 20 20 20 20 69 66 20 28 28 6e 75 6d 50 61  ..    if ((numPa
9e20: 74 73 20 3d 3d 20 70 73 50 74 72 2d 3e 6e 75 6d  ts == psPtr->num
9e30: 50 61 74 73 29 0a 09 09 20 20 20 20 26 26 20 28  Pats)...    && (
9e40: 28 66 6c 61 67 73 20 26 20 50 41 54 5f 4e 45 41  (flags & PAT_NEA
9e50: 52 42 59 29 20 3d 3d 20 28 70 73 50 74 72 2d 3e  RBY) == (psPtr->
9e60: 66 6c 61 67 73 20 26 20 50 41 54 5f 4e 45 41 52  flags & PAT_NEAR
9e70: 42 59 29 29 0a 09 09 20 20 20 20 26 26 20 28 6d  BY))...    && (m
9e80: 65 6d 63 6d 70 28 28 63 68 61 72 20 2a 29 20 70  emcmp((char *) p
9e90: 61 74 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20  atPtr, (char *) 
9ea0: 70 73 50 74 72 2d 3e 70 61 74 73 2c 0a 09 09 20  psPtr->pats,... 
9eb0: 20 20 20 73 65 71 75 65 6e 63 65 53 69 7a 65 29     sequenceSize)
9ec0: 20 3d 3d 20 30 29 29 20 7b 0a 09 09 67 6f 74 6f   == 0)) {...goto
9ed0: 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d   done;..    }..}
9ee0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
9ef0: 63 72 65 61 74 65 29 20 7b 0a 09 69 66 20 28 6e  create) {..if (n
9f00: 65 77 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44  ew) {..    Tcl_D
9f10: 65 6c 65 74 65 48 61 73 68 45 6e 74 72 79 28 68  eleteHashEntry(h
9f20: 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 41 70  Ptr);..}..Tcl_Ap
9f30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9f40: 70 2c 20 22 6e 6f 20 62 69 6e 64 69 6e 67 20 65  p, "no binding e
9f50: 78 69 73 74 73 20 66 6f 72 20 5c 22 22 2c 0a 09  xists for \"",..
9f60: 09 65 76 65 6e 74 53 74 72 69 6e 67 2c 20 22 5c  .eventString, "\
9f70: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
9f80: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  L);..goto error;
9f90: 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 50 74 72  .    }.    psPtr
9fa0: 20 3d 20 28 50 61 74 53 65 71 20 2a 29 20 63 6b   = (PatSeq *) ck
9fb0: 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29  alloc((unsigned)
9fc0: 20 28 73 69 7a 65 6f 66 28 50 61 74 53 65 71 29   (sizeof(PatSeq)
9fd0: 0a 09 20 20 20 20 2b 20 28 6e 75 6d 50 61 74 73  ..    + (numPats
9fe0: 2d 31 29 2a 73 69 7a 65 6f 66 28 50 61 74 74 65  -1)*sizeof(Patte
9ff0: 72 6e 29 29 29 3b 0a 20 20 20 20 70 73 50 74 72  rn)));.    psPtr
a000: 2d 3e 6e 75 6d 50 61 74 73 20 3d 20 6e 75 6d 50  ->numPats = numP
a010: 61 74 73 3b 0a 20 20 20 20 70 73 50 74 72 2d 3e  ats;.    psPtr->
a020: 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a  command = NULL;.
a030: 20 20 20 20 70 73 50 74 72 2d 3e 66 6c 61 67 73      psPtr->flags
a040: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 73   = flags;.    ps
a050: 50 74 72 2d 3e 6e 65 78 74 53 65 71 50 74 72 20  Ptr->nextSeqPtr 
a060: 3d 20 28 50 61 74 53 65 71 20 2a 29 20 54 63 6c  = (PatSeq *) Tcl
a070: 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 50  _GetHashValue(hP
a080: 74 72 29 3b 0a 20 20 20 20 70 73 50 74 72 2d 3e  tr);.    psPtr->
a090: 68 50 74 72 20 3d 20 68 50 74 72 3b 0a 20 20 20  hPtr = hPtr;.   
a0a0: 20 54 63 6c 5f 53 65 74 48 61 73 68 56 61 6c 75   Tcl_SetHashValu
a0b0: 65 28 68 50 74 72 2c 20 70 73 50 74 72 29 3b 0a  e(hPtr, psPtr);.
a0c0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c  .    /*.     * L
a0d0: 69 6e 6b 20 74 68 65 20 70 61 74 74 65 72 6e 20  ink the pattern 
a0e0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 61 73  into the list as
a0f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
a100: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 20 2a  e object..     *
a110: 2f 0a 0a 20 20 20 20 70 73 50 74 72 2d 3e 6f 62  /..    psPtr->ob
a120: 6a 65 63 74 20 3d 20 6f 62 6a 65 63 74 3b 0a 20  ject = object;. 
a130: 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 43 72     hPtr = Tcl_Cr
a140: 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 26 62  eateHashEntry(&b
a150: 69 6e 64 50 74 72 2d 3e 6f 62 6a 65 63 74 54 61  indPtr->objectTa
a160: 62 6c 65 2c 20 28 63 68 61 72 20 2a 29 20 6f 62  ble, (char *) ob
a170: 6a 65 63 74 2c 20 26 6e 65 77 29 3b 0a 20 20 20  ject, &new);.   
a180: 20 69 66 20 28 6e 65 77 29 20 7b 0a 09 70 73 50   if (new) {..psP
a190: 74 72 2d 3e 6e 65 78 74 4f 62 6a 50 74 72 20 3d  tr->nextObjPtr =
a1a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 65 6c 73   NULL;.    } els
a1b0: 65 20 7b 0a 09 70 73 50 74 72 2d 3e 6e 65 78 74  e {..psPtr->next
a1c0: 4f 62 6a 50 74 72 20 3d 20 28 50 61 74 53 65 71  ObjPtr = (PatSeq
a1d0: 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56   *) Tcl_GetHashV
a1e0: 61 6c 75 65 28 68 50 74 72 29 3b 0a 20 20 20 20  alue(hPtr);.    
a1f0: 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73  }.    Tcl_SetHas
a200: 68 56 61 6c 75 65 28 68 50 74 72 2c 20 70 73 50  hValue(hPtr, psP
a210: 74 72 29 3b 0a 0a 20 20 20 20 6d 65 6d 63 70 79  tr);..    memcpy
a220: 28 28 56 4f 49 44 20 2a 29 20 70 73 50 74 72 2d  ((VOID *) psPtr-
a230: 3e 70 61 74 73 2c 20 28 56 4f 49 44 20 2a 29 20  >pats, (VOID *) 
a240: 70 61 74 50 74 72 2c 20 73 65 71 75 65 6e 63 65  patPtr, sequence
a250: 53 69 7a 65 29 3b 0a 0a 20 20 20 20 64 6f 6e 65  Size);..    done
a260: 3a 0a 20 20 20 20 2a 6d 61 73 6b 50 74 72 20 3d  :.    *maskPtr =
a270: 20 65 76 65 6e 74 4d 61 73 6b 3b 0a 20 20 20 20   eventMask;.    
a280: 72 65 74 75 72 6e 20 70 73 50 74 72 3b 0a 0a 20  return psPtr;.. 
a290: 20 20 20 65 72 72 6f 72 3a 0a 20 20 20 20 2a 6d     error:.    *m
a2a0: 61 73 6b 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  askPtr = 0;.    
a2b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20  return NULL;..  
a2c0: 20 20 75 6e 73 75 70 70 6f 72 74 65 64 3a 0a 20    unsupported:. 
a2d0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
a2e0: 28 69 6e 74 65 72 70 2c 20 22 55 6e 73 75 70 70  (interp, "Unsupp
a2f0: 6f 72 74 65 64 20 65 76 65 6e 74 20 74 79 70 65  orted event type
a300: 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ", TCL_STATIC);.
a310: 20 20 20 20 2a 6d 61 73 6b 50 74 72 20 3d 20 43      *maskPtr = C
a320: 54 4b 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 45  TK_UNSUPPORTED_E
a330: 56 45 4e 54 5f 4d 41 53 4b 3b 0a 20 20 20 20 72  VENT_MASK;.    r
a340: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0c 0a  eturn NULL;.}...
a350: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
a3a0: 2a 20 47 65 74 46 69 65 6c 64 20 2d 2d 0a 20 2a  * GetField --. *
a3b0: 0a 20 2a 09 55 73 65 64 20 74 6f 20 70 61 72 73  . *.Used to pars
a3c0: 65 20 70 61 74 74 65 72 6e 20 64 65 73 63 72 69  e pattern descri
a3d0: 70 74 69 6f 6e 73 2e 20 20 43 6f 70 69 65 73 20  ptions.  Copies 
a3e0: 75 70 20 74 6f 0a 20 2a 09 73 69 7a 65 20 63 68  up to. *.size ch
a3f0: 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 70 20  aracters from p 
a400: 74 6f 20 63 6f 70 79 2c 20 73 74 6f 70 70 69 6e  to copy, stoppin
a410: 67 20 61 74 20 65 6e 64 20 6f 66 0a 20 2a 09 73  g at end of. *.s
a420: 74 72 69 6e 67 2c 20 73 70 61 63 65 2c 20 22 2d  tring, space, "-
a430: 22 2c 20 22 3e 22 2c 20 6f 72 20 77 68 65 6e 65  ", ">", or whene
a440: 76 65 72 20 73 69 7a 65 20 69 73 0a 20 2a 09 65  ver size is. *.e
a450: 78 63 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 52  xceeded.. *. * R
a460: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72  esults:. *.The r
a470: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
a480: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a490: 63 68 61 72 61 63 74 65 72 20 6a 75 73 74 0a 20  character just. 
a4a0: 2a 09 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  *.after the last
a4b0: 20 6f 6e 65 20 63 6f 70 69 65 64 20 28 75 73 75   one copied (usu
a4c0: 61 6c 6c 79 20 22 2d 22 20 6f 72 20 73 70 61 63  ally "-" or spac
a4d0: 65 20 6f 72 0a 20 2a 09 22 3e 22 2c 20 62 75 74  e or. *.">", but
a4e0: 20 63 6f 75 6c 64 20 62 65 20 61 6e 79 74 68 69   could be anythi
a4f0: 6e 67 20 69 66 20 73 69 7a 65 20 77 61 73 20 65  ng if size was e
a500: 78 63 65 65 64 65 64 29 2e 0a 20 2a 09 41 6c 73  xceeded).. *.Als
a510: 6f 20 70 6c 61 63 65 73 20 4e 55 4c 4c 2d 74 65  o places NULL-te
a520: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
a530: 28 75 70 20 74 6f 20 73 69 7a 65 0a 20 2a 09 63  (up to size. *.c
a540: 68 61 72 61 63 74 65 72 2c 20 69 6e 63 6c 75 64  haracter, includ
a550: 69 6e 67 20 4e 55 4c 4c 29 2c 20 61 74 20 63 6f  ing NULL), at co
a560: 70 79 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  py.. *. * Side e
a570: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
a580: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
a5d0: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 0a  ..static char *.
a5e0: 47 65 74 46 69 65 6c 64 28 70 2c 20 63 6f 70 79  GetField(p, copy
a5f0: 2c 20 73 69 7a 65 29 0a 20 20 20 20 72 65 67 69  , size).    regi
a600: 73 74 65 72 20 63 68 61 72 20 2a 70 3b 09 09 2f  ster char *p;../
a610: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 72  * Pointer to par
a620: 74 20 6f 66 20 70 61 74 74 65 72 6e 2e 20 2a 2f  t of pattern. */
a630: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 63 68  .    register ch
a640: 61 72 20 2a 63 6f 70 79 3b 09 2f 2a 20 50 6c 61  ar *copy;./* Pla
a650: 63 65 20 74 6f 20 63 6f 70 79 20 66 69 65 6c 64  ce to copy field
a660: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a  . */.    int siz
a670: 65 3b 09 09 09 2f 2a 20 4d 61 78 69 6d 75 6d 20  e;.../* Maximum 
a680: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
a690: 74 65 72 73 20 74 6f 0a 09 09 09 09 20 2a 20 63  ters to..... * c
a6a0: 6f 70 79 2e 20 2a 2f 0a 7b 0a 20 20 20 20 77 68  opy. */.{.    wh
a6b0: 69 6c 65 20 28 28 2a 70 20 21 3d 20 27 5c 30 27  ile ((*p != '\0'
a6c0: 29 20 26 26 20 21 69 73 73 70 61 63 65 28 55 43  ) && !isspace(UC
a6d0: 48 41 52 28 2a 70 29 29 20 26 26 20 28 2a 70 20  HAR(*p)) && (*p 
a6e0: 21 3d 20 27 3e 27 29 0a 09 20 20 20 20 26 26 20  != '>')..    && 
a6f0: 28 2a 70 20 21 3d 20 27 2d 27 29 20 26 26 20 28  (*p != '-') && (
a700: 73 69 7a 65 20 3e 20 31 29 29 20 7b 0a 09 2a 63  size > 1)) {..*c
a710: 6f 70 79 20 3d 20 2a 70 3b 0a 09 70 2b 2b 3b 0a  opy = *p;..p++;.
a720: 09 63 6f 70 79 2b 2b 3b 0a 09 73 69 7a 65 2d 2d  .copy++;..size--
a730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 63 6f 70  ;.    }.    *cop
a740: 79 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 65  y = '\0';.    re
a750: 74 75 72 6e 20 70 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  turn p;.}.../*. 
a760: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a7a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 61  -------. *. * Ma
a7b0: 74 63 68 50 61 74 74 65 72 6e 73 20 2d 2d 0a 20  tchPatterns --. 
a7c0: 2a 0a 20 2a 09 47 69 76 65 6e 20 61 20 6c 69 73  *. *.Given a lis
a7d0: 74 20 6f 66 20 70 61 74 74 65 72 6e 20 73 65 71  t of pattern seq
a7e0: 75 65 6e 63 65 73 20 61 6e 64 20 61 20 6c 69 73  uences and a lis
a7f0: 74 20 6f 66 0a 20 2a 09 72 65 63 65 6e 74 20 65  t of. *.recent e
a800: 76 65 6e 74 73 2c 20 72 65 74 75 72 6e 20 61 20  vents, return a 
a810: 70 61 74 74 65 72 6e 20 73 65 71 75 65 6e 63 65  pattern sequence
a820: 20 74 68 61 74 20 6d 61 74 63 68 65 73 0a 20 2a   that matches. *
a830: 09 74 68 65 20 65 76 65 6e 74 20 6c 69 73 74 2e  .the event list.
a840: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
a850: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61   *.The return va
a860: 6c 75 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 6e  lue is NULL if n
a870: 6f 20 70 61 74 74 65 72 6e 20 6d 61 74 63 68 65  o pattern matche
a880: 73 20 74 68 65 0a 20 2a 09 72 65 63 65 6e 74 20  s the. *.recent 
a890: 65 76 65 6e 74 73 20 66 72 6f 6d 20 62 69 6e 64  events from bind
a8a0: 50 74 72 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20  Ptr.  If one or 
a8b0: 6d 6f 72 65 20 70 61 74 74 65 72 6e 73 0a 20 2a  more patterns. *
a8c0: 09 6d 61 74 63 68 65 73 2c 20 74 68 65 6e 20 74  .matches, then t
a8d0: 68 65 20 6c 6f 6e 67 65 73 74 20 28 6f 72 20 6d  he longest (or m
a8e0: 6f 73 74 20 73 70 65 63 69 66 69 63 29 20 6d 61  ost specific) ma
a8f0: 74 63 68 69 6e 67 0a 20 2a 09 70 61 74 74 65 72  tching. *.patter
a900: 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 20  n is returned.. 
a910: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
a920: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
a930: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a970: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
a980: 74 69 63 20 50 61 74 53 65 71 20 2a 0a 4d 61 74  tic PatSeq *.Mat
a990: 63 68 50 61 74 74 65 72 6e 73 28 64 69 73 70 50  chPatterns(dispP
a9a0: 74 72 2c 20 62 69 6e 64 50 74 72 2c 20 70 73 50  tr, bindPtr, psP
a9b0: 74 72 29 0a 20 20 20 20 54 6b 44 69 73 70 6c 61  tr).    TkDispla
a9c0: 79 20 2a 64 69 73 70 50 74 72 3b 09 09 2f 2a 20  y *dispPtr;../* 
a9d0: 44 69 73 70 6c 61 79 20 66 72 6f 6d 20 77 68 69  Display from whi
a9e0: 63 68 20 74 68 65 20 65 76 65 6e 74 20 63 61 6d  ch the event cam
a9f0: 65 2e 20 2a 2f 0a 20 20 20 20 42 69 6e 64 69 6e  e. */.    Bindin
aa00: 67 54 61 62 6c 65 20 2a 62 69 6e 64 50 74 72 3b  gTable *bindPtr;
aa10: 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ./* Information 
aa20: 61 62 6f 75 74 20 62 69 6e 64 69 6e 67 20 74 61  about binding ta
aa30: 62 6c 65 2c 20 73 75 63 68 0a 09 09 09 09 20 2a  ble, such..... *
aa40: 20 61 73 20 72 69 6e 67 20 6f 66 20 72 65 63 65   as ring of rece
aa50: 6e 74 20 65 76 65 6e 74 73 2e 20 2a 2f 0a 20 20  nt events. */.  
aa60: 20 20 72 65 67 69 73 74 65 72 20 50 61 74 53 65    register PatSe
aa70: 71 20 2a 70 73 50 74 72 3b 09 2f 2a 20 4c 69 73  q *psPtr;./* Lis
aa80: 74 20 6f 66 20 70 61 74 74 65 72 6e 20 73 65 71  t of pattern seq
aa90: 75 65 6e 63 65 73 2e 20 2a 2f 0a 7b 0a 20 20 20  uences. */.{.   
aaa0: 20 72 65 67 69 73 74 65 72 20 50 61 74 53 65 71   register PatSeq
aab0: 20 2a 62 65 73 74 50 74 72 20 3d 20 4e 55 4c 4c   *bestPtr = NULL
aac0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
aad0: 20 49 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c   Iterate over al
aae0: 6c 20 74 68 65 20 70 61 74 74 65 72 6e 20 73 65  l the pattern se
aaf0: 71 75 65 6e 63 65 73 2e 0a 20 20 20 20 20 2a 2f  quences..     */
ab00: 0a 0a 20 20 20 20 66 6f 72 20 28 20 3b 20 70 73  ..    for ( ; ps
ab10: 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20 70 73 50  Ptr != NULL; psP
ab20: 74 72 20 3d 20 70 73 50 74 72 2d 3e 6e 65 78 74  tr = psPtr->next
ab30: 53 65 71 50 74 72 29 20 7b 0a 09 72 65 67 69 73  SeqPtr) {..regis
ab40: 74 65 72 20 58 45 76 65 6e 74 20 2a 65 76 65 6e  ter XEvent *even
ab50: 74 50 74 72 3b 0a 09 72 65 67 69 73 74 65 72 20  tPtr;..register 
ab60: 50 61 74 74 65 72 6e 20 2a 70 61 74 50 74 72 3b  Pattern *patPtr;
ab70: 0a 09 54 6b 5f 57 69 6e 64 6f 77 20 77 69 6e 64  ..Tk_Window wind
ab80: 6f 77 3b 0a 09 69 6e 74 20 2a 64 65 74 61 69 6c  ow;..int *detail
ab90: 50 74 72 3b 0a 09 69 6e 74 20 70 61 74 43 6f 75  Ptr;..int patCou
aba0: 6e 74 2c 20 72 69 6e 67 43 6f 75 6e 74 2c 20 73  nt, ringCount, s
abb0: 74 61 74 65 3b 0a 09 69 6e 74 20 6d 6f 64 4d 61  tate;..int modMa
abc0: 73 6b 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 49 74 65  sk;.../*.. * Ite
abd0: 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 74 68  rate over all th
abe0: 65 20 70 61 74 74 65 72 6e 73 20 69 6e 20 61 20  e patterns in a 
abf0: 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 0a 09  sequence to be..
ac00: 20 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65   * sure that the
ac10: 79 20 61 6c 6c 20 6d 61 74 63 68 2e 0a 09 20 2a  y all match... *
ac20: 2f 0a 0a 09 65 76 65 6e 74 50 74 72 20 3d 20 26  /...eventPtr = &
ac30: 62 69 6e 64 50 74 72 2d 3e 65 76 65 6e 74 52 69  bindPtr->eventRi
ac40: 6e 67 5b 62 69 6e 64 50 74 72 2d 3e 63 75 72 45  ng[bindPtr->curE
ac50: 76 65 6e 74 5d 3b 0a 09 64 65 74 61 69 6c 50 74  vent];..detailPt
ac60: 72 20 3d 20 26 62 69 6e 64 50 74 72 2d 3e 64 65  r = &bindPtr->de
ac70: 74 61 69 6c 52 69 6e 67 5b 62 69 6e 64 50 74 72  tailRing[bindPtr
ac80: 2d 3e 63 75 72 45 76 65 6e 74 5d 3b 0a 09 77 69  ->curEvent];..wi
ac90: 6e 64 6f 77 20 3d 20 65 76 65 6e 74 50 74 72 2d  ndow = eventPtr-
aca0: 3e 77 69 6e 64 6f 77 3b 0a 09 70 61 74 50 74 72  >window;..patPtr
acb0: 20 3d 20 70 73 50 74 72 2d 3e 70 61 74 73 3b 0a   = psPtr->pats;.
acc0: 09 70 61 74 43 6f 75 6e 74 20 3d 20 70 73 50 74  .patCount = psPt
acd0: 72 2d 3e 6e 75 6d 50 61 74 73 3b 0a 09 72 69 6e  r->numPats;..rin
ace0: 67 43 6f 75 6e 74 20 3d 20 45 56 45 4e 54 5f 42  gCount = EVENT_B
acf0: 55 46 46 45 52 5f 53 49 5a 45 3b 0a 09 77 68 69  UFFER_SIZE;..whi
ad00: 6c 65 20 28 70 61 74 43 6f 75 6e 74 20 3e 20 30  le (patCount > 0
ad10: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 72 69 6e  ) {..    if (rin
ad20: 67 43 6f 75 6e 74 20 3c 3d 20 30 29 20 7b 0a 09  gCount <= 0) {..
ad30: 09 67 6f 74 6f 20 6e 65 78 74 53 65 71 75 65 6e  .goto nextSequen
ad40: 63 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ce;..    }..    
ad50: 69 66 20 28 65 76 65 6e 74 50 74 72 2d 3e 74 79  if (eventPtr->ty
ad60: 70 65 20 21 3d 20 70 61 74 50 74 72 2d 3e 65 76  pe != patPtr->ev
ad70: 65 6e 74 54 79 70 65 29 20 7b 0a 09 09 67 6f 74  entType) {...got
ad80: 6f 20 6e 65 78 74 45 76 65 6e 74 3b 0a 09 20 20  o nextEvent;..  
ad90: 20 20 7d 0a 09 20 20 20 20 69 66 20 28 65 76 65    }..    if (eve
ada0: 6e 74 50 74 72 2d 3e 77 69 6e 64 6f 77 20 21 3d  ntPtr->window !=
adb0: 20 77 69 6e 64 6f 77 29 20 7b 0a 09 09 67 6f 74   window) {...got
adc0: 6f 20 6e 65 78 74 53 65 71 75 65 6e 63 65 3b 0a  o nextSequence;.
add0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
ade0: 28 65 76 65 6e 74 50 74 72 2d 3e 74 79 70 65 20  (eventPtr->type 
adf0: 3d 3d 20 43 54 4b 5f 4b 45 59 5f 45 56 45 4e 54  == CTK_KEY_EVENT
ae00: 29 20 7b 0a 09 09 73 74 61 74 65 20 3d 20 65 76  ) {...state = ev
ae10: 65 6e 74 50 74 72 2d 3e 75 2e 6b 65 79 2e 73 74  entPtr->u.key.st
ae20: 61 74 65 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ate;..    } else
ae30: 20 7b 0a 09 09 73 74 61 74 65 20 3d 20 30 3b 0a   {...state = 0;.
ae40: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28  .    }..    if (
ae50: 70 61 74 50 74 72 2d 3e 6e 65 65 64 4d 6f 64 73  patPtr->needMods
ae60: 20 21 3d 20 30 29 20 7b 0a 09 09 6d 6f 64 4d 61   != 0) {...modMa
ae70: 73 6b 20 3d 20 70 61 74 50 74 72 2d 3e 6e 65 65  sk = patPtr->nee
ae80: 64 4d 6f 64 73 3b 0a 09 09 69 66 20 28 28 73 74  dMods;...if ((st
ae90: 61 74 65 20 26 20 6d 6f 64 4d 61 73 6b 29 20 21  ate & modMask) !
aea0: 3d 20 6d 6f 64 4d 61 73 6b 29 20 7b 0a 09 09 20  = modMask) {... 
aeb0: 20 20 20 67 6f 74 6f 20 6e 65 78 74 53 65 71 75     goto nextSequ
aec0: 65 6e 63 65 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  ence;...}..    }
aed0: 0a 09 20 20 20 20 69 66 20 28 28 70 61 74 50 74  ..    if ((patPt
aee0: 72 2d 3e 64 65 74 61 69 6c 20 21 3d 20 30 29 20  r->detail != 0) 
aef0: 26 26 20 28 70 61 74 50 74 72 2d 3e 64 65 74 61  && (patPtr->deta
af00: 69 6c 20 21 3d 20 2a 64 65 74 61 69 6c 50 74 72  il != *detailPtr
af10: 29 29 20 7b 0a 09 09 67 6f 74 6f 20 6e 65 78 74  )) {...goto next
af20: 53 65 71 75 65 6e 63 65 3b 0a 09 20 20 20 20 7d  Sequence;..    }
af30: 0a 09 20 20 20 20 69 66 20 28 70 73 50 74 72 2d  ..    if (psPtr-
af40: 3e 66 6c 61 67 73 20 26 20 50 41 54 5f 4e 45 41  >flags & PAT_NEA
af50: 52 42 59 29 20 7b 0a 09 09 72 65 67 69 73 74 65  RBY) {...registe
af60: 72 20 58 45 76 65 6e 74 20 2a 66 69 72 73 74 50  r XEvent *firstP
af70: 74 72 3b 0a 09 09 69 6e 74 20 74 69 6d 65 44 69  tr;...int timeDi
af80: 66 66 3b 0a 0a 09 09 66 69 72 73 74 50 74 72 20  ff;....firstPtr 
af90: 3d 20 26 62 69 6e 64 50 74 72 2d 3e 65 76 65 6e  = &bindPtr->even
afa0: 74 52 69 6e 67 5b 62 69 6e 64 50 74 72 2d 3e 63  tRing[bindPtr->c
afb0: 75 72 45 76 65 6e 74 5d 3b 0a 09 09 74 69 6d 65  urEvent];...time
afc0: 44 69 66 66 20 3d 20 28 54 69 6d 65 29 20 66 69  Diff = (Time) fi
afd0: 72 73 74 50 74 72 2d 3e 75 2e 6b 65 79 2e 74 69  rstPtr->u.key.ti
afe0: 6d 65 20 2d 20 65 76 65 6e 74 50 74 72 2d 3e 75  me - eventPtr->u
aff0: 2e 6b 65 79 2e 74 69 6d 65 3b 0a 09 09 69 66 20  .key.time;...if 
b000: 28 74 69 6d 65 44 69 66 66 20 3e 20 4e 45 41 52  (timeDiff > NEAR
b010: 42 59 5f 4d 53 29 20 7b 0a 09 09 20 20 20 20 67  BY_MS) {...    g
b020: 6f 74 6f 20 6e 65 78 74 53 65 71 75 65 6e 63 65  oto nextSequence
b030: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20  ;...}..    }..  
b040: 20 20 70 61 74 50 74 72 2b 2b 3b 0a 09 20 20 20    patPtr++;..   
b050: 20 70 61 74 43 6f 75 6e 74 2d 2d 3b 0a 09 20 20   patCount--;..  
b060: 20 20 6e 65 78 74 45 76 65 6e 74 3a 0a 09 20 20    nextEvent:..  
b070: 20 20 69 66 20 28 65 76 65 6e 74 50 74 72 20 3d    if (eventPtr =
b080: 3d 20 62 69 6e 64 50 74 72 2d 3e 65 76 65 6e 74  = bindPtr->event
b090: 52 69 6e 67 29 20 7b 0a 09 09 65 76 65 6e 74 50  Ring) {...eventP
b0a0: 74 72 20 3d 20 26 62 69 6e 64 50 74 72 2d 3e 65  tr = &bindPtr->e
b0b0: 76 65 6e 74 52 69 6e 67 5b 45 56 45 4e 54 5f 42  ventRing[EVENT_B
b0c0: 55 46 46 45 52 5f 53 49 5a 45 2d 31 5d 3b 0a 09  UFFER_SIZE-1];..
b0d0: 09 64 65 74 61 69 6c 50 74 72 20 3d 20 26 62 69  .detailPtr = &bi
b0e0: 6e 64 50 74 72 2d 3e 64 65 74 61 69 6c 52 69 6e  ndPtr->detailRin
b0f0: 67 5b 45 56 45 4e 54 5f 42 55 46 46 45 52 5f 53  g[EVENT_BUFFER_S
b100: 49 5a 45 2d 31 5d 3b 0a 09 20 20 20 20 7d 20 65  IZE-1];..    } e
b110: 6c 73 65 20 7b 0a 09 09 65 76 65 6e 74 50 74 72  lse {...eventPtr
b120: 2d 2d 3b 0a 09 09 64 65 74 61 69 6c 50 74 72 2d  --;...detailPtr-
b130: 2d 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72  -;..    }..    r
b140: 69 6e 67 43 6f 75 6e 74 2d 2d 3b 0a 09 7d 0a 0a  ingCount--;..}..
b150: 09 2f 2a 0a 09 20 2a 20 54 68 69 73 20 73 65 71  ./*.. * This seq
b160: 75 65 6e 63 65 20 6d 61 74 63 68 65 73 2e 20 20  uence matches.  
b170: 49 66 20 77 65 27 76 65 20 61 6c 72 65 61 64 79  If we've already
b180: 20 67 6f 74 20 61 6e 6f 74 68 65 72 20 6d 61 74   got another mat
b190: 63 68 2c 0a 09 20 2a 20 70 69 63 6b 20 77 68 69  ch,.. * pick whi
b1a0: 63 68 65 76 65 72 20 69 73 20 6d 6f 73 74 20 73  chever is most s
b1b0: 70 65 63 69 66 69 63 2e 20 20 44 65 74 61 69 6c  pecific.  Detail
b1c0: 20 69 73 20 6d 6f 73 74 20 69 6d 70 6f 72 74 61   is most importa
b1d0: 6e 74 2c 0a 09 20 2a 20 74 68 65 6e 20 6e 65 65  nt,.. * then nee
b1e0: 64 4d 6f 64 73 2e 0a 09 20 2a 2f 0a 0a 09 69 66  dMods... */...if
b1f0: 20 28 62 65 73 74 50 74 72 20 21 3d 20 4e 55 4c   (bestPtr != NUL
b200: 4c 29 20 7b 0a 09 20 20 20 20 72 65 67 69 73 74  L) {..    regist
b210: 65 72 20 50 61 74 74 65 72 6e 20 2a 70 61 74 50  er Pattern *patP
b220: 74 72 32 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b  tr2;..    int i;
b230: 0a 0a 09 20 20 20 20 69 66 20 28 70 73 50 74 72  ...    if (psPtr
b240: 2d 3e 6e 75 6d 50 61 74 73 20 21 3d 20 62 65 73  ->numPats != bes
b250: 74 50 74 72 2d 3e 6e 75 6d 50 61 74 73 29 20 7b  tPtr->numPats) {
b260: 0a 09 09 69 66 20 28 62 65 73 74 50 74 72 2d 3e  ...if (bestPtr->
b270: 6e 75 6d 50 61 74 73 20 3e 20 70 73 50 74 72 2d  numPats > psPtr-
b280: 3e 6e 75 6d 50 61 74 73 29 20 7b 0a 09 09 20 20  >numPats) {...  
b290: 20 20 67 6f 74 6f 20 6e 65 78 74 53 65 71 75 65    goto nextSeque
b2a0: 6e 63 65 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  nce;...} else {.
b2b0: 09 09 20 20 20 20 67 6f 74 6f 20 6e 65 77 42 65  ..    goto newBe
b2c0: 73 74 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  st;...}..    }..
b2d0: 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 2c 20      for (i = 0, 
b2e0: 70 61 74 50 74 72 20 3d 20 70 73 50 74 72 2d 3e  patPtr = psPtr->
b2f0: 70 61 74 73 2c 20 70 61 74 50 74 72 32 20 3d 20  pats, patPtr2 = 
b300: 62 65 73 74 50 74 72 2d 3e 70 61 74 73 3b 0a 09  bestPtr->pats;..
b310: 09 20 20 20 20 69 20 3c 20 70 73 50 74 72 2d 3e  .    i < psPtr->
b320: 6e 75 6d 50 61 74 73 3b 20 69 2b 2b 2c 20 70 61  numPats; i++, pa
b330: 74 50 74 72 2b 2b 2c 20 70 61 74 50 74 72 32 2b  tPtr++, patPtr2+
b340: 2b 29 20 7b 0a 09 09 69 66 20 28 70 61 74 50 74  +) {...if (patPt
b350: 72 2d 3e 64 65 74 61 69 6c 20 21 3d 20 70 61 74  r->detail != pat
b360: 50 74 72 32 2d 3e 64 65 74 61 69 6c 29 20 7b 0a  Ptr2->detail) {.
b370: 09 09 20 20 20 20 69 66 20 28 70 61 74 50 74 72  ..    if (patPtr
b380: 2d 3e 64 65 74 61 69 6c 20 3d 3d 20 30 29 20 7b  ->detail == 0) {
b390: 0a 09 09 09 67 6f 74 6f 20 6e 65 78 74 53 65 71  ....goto nextSeq
b3a0: 75 65 6e 63 65 3b 0a 09 09 20 20 20 20 7d 20 65  uence;...    } e
b3b0: 6c 73 65 20 7b 0a 09 09 09 67 6f 74 6f 20 6e 65  lse {....goto ne
b3c0: 77 42 65 73 74 3b 0a 09 09 20 20 20 20 7d 0a 09  wBest;...    }..
b3d0: 09 7d 0a 09 09 69 66 20 28 70 61 74 50 74 72 2d  .}...if (patPtr-
b3e0: 3e 6e 65 65 64 4d 6f 64 73 20 21 3d 20 70 61 74  >needMods != pat
b3f0: 50 74 72 32 2d 3e 6e 65 65 64 4d 6f 64 73 29 20  Ptr2->needMods) 
b400: 7b 0a 09 09 20 20 20 20 69 66 20 28 28 70 61 74  {...    if ((pat
b410: 50 74 72 2d 3e 6e 65 65 64 4d 6f 64 73 20 26 20  Ptr->needMods & 
b420: 70 61 74 50 74 72 32 2d 3e 6e 65 65 64 4d 6f 64  patPtr2->needMod
b430: 73 29 0a 09 09 09 20 20 20 20 3d 3d 20 70 61 74  s)....    == pat
b440: 50 74 72 2d 3e 6e 65 65 64 4d 6f 64 73 29 20 7b  Ptr->needMods) {
b450: 0a 09 09 09 67 6f 74 6f 20 6e 65 78 74 53 65 71  ....goto nextSeq
b460: 75 65 6e 63 65 3b 0a 09 09 20 20 20 20 7d 20 65  uence;...    } e
b470: 6c 73 65 20 69 66 20 28 28 70 61 74 50 74 72 2d  lse if ((patPtr-
b480: 3e 6e 65 65 64 4d 6f 64 73 20 26 20 70 61 74 50  >needMods & patP
b490: 74 72 32 2d 3e 6e 65 65 64 4d 6f 64 73 29 0a 09  tr2->needMods)..
b4a0: 09 09 20 20 20 20 3d 3d 20 70 61 74 50 74 72 32  ..    == patPtr2
b4b0: 2d 3e 6e 65 65 64 4d 6f 64 73 29 20 7b 0a 09 09  ->needMods) {...
b4c0: 09 67 6f 74 6f 20 6e 65 77 42 65 73 74 3b 0a 09  .goto newBest;..
b4d0: 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
b4e0: 7d 0a 09 20 20 20 20 67 6f 74 6f 20 6e 65 78 74  }..    goto next
b4f0: 53 65 71 75 65 6e 63 65 3b 09 2f 2a 20 54 69 65  Sequence;./* Tie
b500: 20 67 6f 65 73 20 74 6f 20 6e 65 77 65 73 74 20   goes to newest 
b510: 70 61 74 74 65 72 6e 2e 20 2a 2f 0a 09 7d 0a 09  pattern. */..}..
b520: 6e 65 77 42 65 73 74 3a 0a 09 62 65 73 74 50 74  newBest:..bestPt
b530: 72 20 3d 20 70 73 50 74 72 3b 0a 0a 09 6e 65 78  r = psPtr;...nex
b540: 74 53 65 71 75 65 6e 63 65 3a 20 63 6f 6e 74 69  tSequence: conti
b550: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  nue;.    }.    r
b560: 65 74 75 72 6e 20 62 65 73 74 50 74 72 3b 0a 7d  eturn bestPtr;.}
b570: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b5b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 78 70  ------. *. * Exp
b5c0: 61 6e 64 50 65 72 63 65 6e 74 73 20 2d 2d 0a 20  andPercents --. 
b5d0: 2a 0a 20 2a 09 47 69 76 65 6e 20 61 20 63 6f 6d  *. *.Given a com
b5e0: 6d 61 6e 64 20 61 6e 64 20 61 6e 20 65 76 65 6e  mand and an even
b5f0: 74 2c 20 70 72 6f 64 75 63 65 20 61 20 6e 65 77  t, produce a new
b600: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 62 79 20 72   command. *.by r
b610: 65 70 6c 61 63 69 6e 67 20 25 20 63 6f 6e 73 74  eplacing % const
b620: 72 75 63 74 73 20 69 6e 20 74 68 65 20 6f 72 69  ructs in the ori
b630: 67 69 6e 61 6c 20 63 6f 6d 6d 61 6e 64 0a 20 2a  ginal command. *
b640: 09 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f  .with informatio
b650: 6e 20 66 72 6f 6d 20 74 68 65 20 58 20 65 76 65  n from the X eve
b660: 6e 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nt.. *. * Result
b670: 73 3a 0a 20 2a 09 54 68 65 20 6e 65 77 20 65 78  s:. *.The new ex
b680: 70 61 6e 64 65 64 20 63 6f 6d 6d 61 6e 64 20 69  panded command i
b690: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
b6a0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
b6b0: 0a 20 2a 09 67 69 76 65 6e 20 62 79 20 64 73 50  . *.given by dsP
b6c0: 74 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  tr.. *. * Side e
b6d0: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
b6e0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
b6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b720: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
b730: 20 76 6f 69 64 0a 45 78 70 61 6e 64 50 65 72 63   void.ExpandPerc
b740: 65 6e 74 73 28 77 69 6e 50 74 72 2c 20 62 65 66  ents(winPtr, bef
b750: 6f 72 65 2c 20 65 76 65 6e 74 50 74 72 2c 20 6b  ore, eventPtr, k
b760: 65 79 53 79 6d 2c 20 64 73 50 74 72 29 0a 20 20  eySym, dsPtr).  
b770: 20 20 54 6b 57 69 6e 64 6f 77 20 2a 77 69 6e 50    TkWindow *winP
b780: 74 72 3b 09 09 2f 2a 20 57 69 6e 64 6f 77 20 77  tr;../* Window w
b790: 68 65 72 65 20 65 76 65 6e 74 20 6f 63 63 75 72  here event occur
b7a0: 72 65 64 3a 20 20 6e 65 65 64 65 64 20 74 6f 0a  red:  needed to.
b7b0: 09 09 09 09 20 2a 20 67 65 74 20 69 6e 70 75 74  .... * get input
b7c0: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 20   context. */.   
b7d0: 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a   register char *
b7e0: 62 65 66 6f 72 65 3b 09 2f 2a 20 43 6f 6d 6d 61  before;./* Comma
b7f0: 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 65  nd containing pe
b800: 72 63 65 6e 74 0a 09 09 09 09 20 2a 20 65 78 70  rcent..... * exp
b810: 72 65 73 73 69 6f 6e 73 20 74 6f 20 62 65 20 72  ressions to be r
b820: 65 70 6c 61 63 65 64 2e 20 2a 2f 0a 20 20 20 20  eplaced. */.    
b830: 72 65 67 69 73 74 65 72 20 58 45 76 65 6e 74 20  register XEvent 
b840: 2a 65 76 65 6e 74 50 74 72 3b 09 2f 2a 20 58 20  *eventPtr;./* X 
b850: 65 76 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  event containing
b860: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 09 09 09   information....
b870: 09 20 2a 20 74 6f 20 62 65 20 75 73 65 64 20 69  . * to be used i
b880: 6e 20 25 20 72 65 70 6c 61 63 65 6d 65 6e 74 73  n % replacements
b890: 2e 20 2a 2f 0a 20 20 20 20 4b 65 79 53 79 6d 20  . */.    KeySym 
b8a0: 6b 65 79 53 79 6d 3b 09 09 2f 2a 20 4b 65 79 53  keySym;../* KeyS
b8b0: 79 6d 3a 20 6f 6e 6c 79 20 72 65 6c 65 76 61 6e  ym: only relevan
b8c0: 74 20 66 6f 72 0a 09 09 09 09 20 2a 20 4b 65 79  t for..... * Key
b8d0: 50 72 65 73 73 20 61 6e 64 20 4b 65 79 52 65 6c  Press and KeyRel
b8e0: 65 61 73 65 20 65 76 65 6e 74 73 29 2e 20 2a 2f  ease events). */
b8f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
b900: 20 2a 64 73 50 74 72 3b 09 09 2f 2a 20 44 79 6e   *dsPtr;../* Dyn
b910: 61 6d 69 63 20 73 74 72 69 6e 67 20 69 6e 20 77  amic string in w
b920: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 0a 09  hich to append..
b930: 09 09 09 20 2a 20 6e 65 77 20 63 6f 6d 6d 61 6e  ... * new comman
b940: 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20  d. */.{.    int 
b950: 73 70 61 63 65 4e 65 65 64 65 64 2c 20 63 76 74  spaceNeeded, cvt
b960: 46 6c 61 67 73 3b 09 2f 2a 20 55 73 65 64 20 74  Flags;./* Used t
b970: 6f 20 73 75 62 73 74 69 74 75 74 65 20 73 74 72  o substitute str
b980: 69 6e 67 20 61 73 20 70 72 6f 70 65 72 20 54 63  ing as proper Tc
b990: 6c 0a 09 09 09 09 20 2a 20 6c 69 73 74 20 65 6c  l..... * list el
b9a0: 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  ement. */.    in
b9b0: 74 20 6e 75 6d 62 65 72 2c 20 6c 65 6e 67 74 68  t number, length
b9c0: 3b 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 53 49  ;.#define NUM_SI
b9d0: 5a 45 20 34 30 0a 20 20 20 20 72 65 67 69 73 74  ZE 40.    regist
b9e0: 65 72 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b  er char *string;
b9f0: 0a 20 20 20 20 63 68 61 72 20 6e 75 6d 53 74 6f  .    char numSto
ba00: 72 61 67 65 5b 4e 55 4d 5f 53 49 5a 45 2b 31 5d  rage[NUM_SIZE+1]
ba10: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 29  ;..    while (1)
ba20: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 46 69 6e 64 20   {../*.. * Find 
ba30: 65 76 65 72 79 74 68 69 6e 67 20 75 70 20 74 6f  everything up to
ba40: 20 74 68 65 20 6e 65 78 74 20 25 20 63 68 61 72   the next % char
ba50: 61 63 74 65 72 20 61 6e 64 20 61 70 70 65 6e 64  acter and append
ba60: 20 69 74 0a 09 20 2a 20 74 6f 20 74 68 65 20 72   it.. * to the r
ba70: 65 73 75 6c 74 20 73 74 72 69 6e 67 2e 0a 09 20  esult string... 
ba80: 2a 2f 0a 0a 09 66 6f 72 20 28 73 74 72 69 6e 67  */...for (string
ba90: 20 3d 20 62 65 66 6f 72 65 3b 20 28 2a 73 74 72   = before; (*str
baa0: 69 6e 67 20 21 3d 20 30 29 20 26 26 20 28 2a 73  ing != 0) && (*s
bab0: 74 72 69 6e 67 20 21 3d 20 27 25 27 29 3b 20 73  tring != '%'); s
bac0: 74 72 69 6e 67 2b 2b 29 20 7b 0a 09 20 20 20 20  tring++) {..    
bad0: 2f 2a 20 45 6d 70 74 79 20 6c 6f 6f 70 20 62 6f  /* Empty loop bo
bae0: 64 79 2e 20 2a 2f 0a 09 7d 0a 09 69 66 20 28 73  dy. */..}..if (s
baf0: 74 72 69 6e 67 20 21 3d 20 62 65 66 6f 72 65 29  tring != before)
bb00: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
bb10: 69 6e 67 41 70 70 65 6e 64 28 64 73 50 74 72 2c  ingAppend(dsPtr,
bb20: 20 62 65 66 6f 72 65 2c 20 73 74 72 69 6e 67 2d   before, string-
bb30: 62 65 66 6f 72 65 29 3b 0a 09 20 20 20 20 62 65  before);..    be
bb40: 66 6f 72 65 20 3d 20 73 74 72 69 6e 67 3b 0a 09  fore = string;..
bb50: 7d 0a 09 69 66 20 28 2a 62 65 66 6f 72 65 20 3d  }..if (*before =
bb60: 3d 20 30 29 20 7b 0a 09 20 20 20 20 62 72 65 61  = 0) {..    brea
bb70: 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54  k;..}.../*.. * T
bb80: 68 65 72 65 27 73 20 61 20 70 65 72 63 65 6e 74  here's a percent
bb90: 20 73 65 71 75 65 6e 63 65 20 68 65 72 65 2e 20   sequence here. 
bba0: 20 50 72 6f 63 65 73 73 20 69 74 2e 0a 09 20 2a   Process it... *
bbb0: 2f 0a 0a 09 6e 75 6d 62 65 72 20 3d 20 30 3b 0a  /...number = 0;.
bbc0: 09 73 74 72 69 6e 67 20 3d 20 22 3f 3f 22 3b 0a  .string = "??";.
bbd0: 09 73 77 69 74 63 68 20 28 62 65 66 6f 72 65 5b  .switch (before[
bbe0: 31 5d 29 20 7b 0a 09 20 20 20 20 63 61 73 65 20  1]) {..    case 
bbf0: 27 23 27 3a 0a 09 09 6e 75 6d 62 65 72 20 3d 20  '#':...number = 
bc00: 65 76 65 6e 74 50 74 72 2d 3e 73 65 72 69 61 6c  eventPtr->serial
bc10: 3b 0a 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65  ;...goto doNumbe
bc20: 72 3b 0a 09 20 20 20 20 63 61 73 65 20 27 63 27  r;..    case 'c'
bc30: 3a 0a 09 09 6e 75 6d 62 65 72 20 3d 20 30 3b 0a  :...number = 0;.
bc40: 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65 72 3b  ..goto doNumber;
bc50: 0a 09 20 20 20 20 63 61 73 65 20 27 68 27 3a 0a  ..    case 'h':.
bc60: 09 09 69 66 20 28 65 76 65 6e 74 50 74 72 2d 3e  ..if (eventPtr->
bc70: 74 79 70 65 20 3d 3d 20 43 54 4b 5f 45 58 50 4f  type == CTK_EXPO
bc80: 53 45 5f 45 56 45 4e 54 29 20 7b 0a 09 09 20 20  SE_EVENT) {...  
bc90: 20 20 6e 75 6d 62 65 72 20 3d 20 65 76 65 6e 74    number = event
bca0: 50 74 72 2d 3e 75 2e 65 78 70 6f 73 65 2e 62 6f  Ptr->u.expose.bo
bcb0: 74 74 6f 6d 20 2d 20 65 76 65 6e 74 50 74 72 2d  ttom - eventPtr-
bcc0: 3e 75 2e 65 78 70 6f 73 65 2e 74 6f 70 3b 0a 09  >u.expose.top;..
bcd0: 09 7d 20 65 6c 73 65 20 69 66 20 28 65 76 65 6e  .} else if (even
bce0: 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54  tPtr->type == CT
bcf0: 4b 5f 4d 41 50 5f 45 56 45 4e 54 29 20 7b 0a 09  K_MAP_EVENT) {..
bd00: 09 20 20 20 20 6e 75 6d 62 65 72 20 3d 20 54 6b  .    number = Tk
bd10: 5f 48 65 69 67 68 74 28 65 76 65 6e 74 50 74 72  _Height(eventPtr
bd20: 2d 3e 77 69 6e 64 6f 77 29 3b 0a 09 09 7d 0a 09  ->window);...}..
bd30: 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65 72 3b 0a  .goto doNumber;.
bd40: 09 20 20 20 20 63 61 73 65 20 27 6b 27 3a 0a 09  .    case 'k':..
bd50: 09 69 66 20 28 65 76 65 6e 74 50 74 72 2d 3e 74  .if (eventPtr->t
bd60: 79 70 65 20 3d 3d 20 43 54 4b 5f 4b 45 59 5f 45  ype == CTK_KEY_E
bd70: 56 45 4e 54 29 20 7b 0a 09 09 20 20 20 20 6e 75  VENT) {...    nu
bd80: 6d 62 65 72 20 3d 20 65 76 65 6e 74 50 74 72 2d  mber = eventPtr-
bd90: 3e 75 2e 6b 65 79 2e 73 79 6d 3b 0a 09 09 7d 0a  >u.key.sym;...}.
bda0: 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65 72 3b  ..goto doNumber;
bdb0: 0a 09 20 20 20 20 63 61 73 65 20 27 73 27 3a 0a  ..    case 's':.
bdc0: 09 09 69 66 20 28 65 76 65 6e 74 50 74 72 2d 3e  ..if (eventPtr->
bdd0: 74 79 70 65 20 3d 3d 20 43 54 4b 5f 4b 45 59 5f  type == CTK_KEY_
bde0: 45 56 45 4e 54 29 20 7b 0a 09 09 20 20 20 20 6e  EVENT) {...    n
bdf0: 75 6d 62 65 72 20 3d 20 65 76 65 6e 74 50 74 72  umber = eventPtr
be00: 2d 3e 75 2e 6b 65 79 2e 73 74 61 74 65 3b 0a 09  ->u.key.state;..
be10: 09 7d 0a 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62  .}...goto doNumb
be20: 65 72 3b 0a 09 20 20 20 20 63 61 73 65 20 27 74  er;..    case 't
be30: 27 3a 0a 09 09 69 66 20 28 65 76 65 6e 74 50 74  ':...if (eventPt
be40: 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54 4b 5f 4b  r->type == CTK_K
be50: 45 59 5f 45 56 45 4e 54 29 20 7b 0a 09 09 20 20  EY_EVENT) {...  
be60: 20 20 6e 75 6d 62 65 72 20 3d 20 28 69 6e 74 29    number = (int)
be70: 20 65 76 65 6e 74 50 74 72 2d 3e 75 2e 6b 65 79   eventPtr->u.key
be80: 2e 74 69 6d 65 3b 0a 09 09 7d 0a 09 09 67 6f 74  .time;...}...got
be90: 6f 20 64 6f 4e 75 6d 62 65 72 3b 0a 09 20 20 20  o doNumber;..   
bea0: 20 63 61 73 65 20 27 77 27 3a 0a 09 09 69 66 20   case 'w':...if 
beb0: 28 65 76 65 6e 74 50 74 72 2d 3e 74 79 70 65 20  (eventPtr->type 
bec0: 3d 3d 20 43 54 4b 5f 45 58 50 4f 53 45 5f 45 56  == CTK_EXPOSE_EV
bed0: 45 4e 54 29 20 7b 0a 09 09 20 20 20 20 6e 75 6d  ENT) {...    num
bee0: 62 65 72 20 3d 20 65 76 65 6e 74 50 74 72 2d 3e  ber = eventPtr->
bef0: 75 2e 65 78 70 6f 73 65 2e 72 69 67 68 74 20 2d  u.expose.right -
bf00: 20 65 76 65 6e 74 50 74 72 2d 3e 75 2e 65 78 70   eventPtr->u.exp
bf10: 6f 73 65 2e 6c 65 66 74 3b 0a 09 09 7d 20 65 6c  ose.left;...} el
bf20: 73 65 20 69 66 20 28 65 76 65 6e 74 50 74 72 2d  se if (eventPtr-
bf30: 3e 74 79 70 65 20 3d 3d 20 43 54 4b 5f 4d 41 50  >type == CTK_MAP
bf40: 5f 45 56 45 4e 54 29 20 7b 0a 09 09 20 20 20 20  _EVENT) {...    
bf50: 6e 75 6d 62 65 72 20 3d 20 54 6b 5f 57 69 64 74  number = Tk_Widt
bf60: 68 28 65 76 65 6e 74 50 74 72 2d 3e 77 69 6e 64  h(eventPtr->wind
bf70: 6f 77 29 3b 0a 09 09 7d 0a 09 09 67 6f 74 6f 20  ow);...}...goto 
bf80: 64 6f 4e 75 6d 62 65 72 3b 0a 09 20 20 20 20 63  doNumber;..    c
bf90: 61 73 65 20 27 78 27 3a 0a 09 09 69 66 20 28 65  ase 'x':...if (e
bfa0: 76 65 6e 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d  ventPtr->type ==
bfb0: 20 43 54 4b 5f 45 58 50 4f 53 45 5f 45 56 45 4e   CTK_EXPOSE_EVEN
bfc0: 54 29 20 7b 0a 09 09 20 20 20 20 6e 75 6d 62 65  T) {...    numbe
bfd0: 72 20 3d 20 65 76 65 6e 74 50 74 72 2d 3e 75 2e  r = eventPtr->u.
bfe0: 65 78 70 6f 73 65 2e 6c 65 66 74 3b 0a 09 09 7d  expose.left;...}
bff0: 20 65 6c 73 65 20 69 66 20 28 65 76 65 6e 74 50   else if (eventP
c000: 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54 4b 5f  tr->type == CTK_
c010: 4d 41 50 5f 45 56 45 4e 54 29 20 7b 0a 09 09 20  MAP_EVENT) {... 
c020: 20 20 20 6e 75 6d 62 65 72 20 3d 20 54 6b 5f 58     number = Tk_X
c030: 28 65 76 65 6e 74 50 74 72 2d 3e 77 69 6e 64 6f  (eventPtr->windo
c040: 77 29 3b 0a 09 09 7d 0a 09 09 67 6f 74 6f 20 64  w);...}...goto d
c050: 6f 4e 75 6d 62 65 72 3b 0a 09 20 20 20 20 63 61  oNumber;..    ca
c060: 73 65 20 27 79 27 3a 0a 09 09 69 66 20 28 65 76  se 'y':...if (ev
c070: 65 6e 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20  entPtr->type == 
c080: 43 54 4b 5f 45 58 50 4f 53 45 5f 45 56 45 4e 54  CTK_EXPOSE_EVENT
c090: 29 20 7b 0a 09 09 20 20 20 20 6e 75 6d 62 65 72  ) {...    number
c0a0: 20 3d 20 65 76 65 6e 74 50 74 72 2d 3e 75 2e 65   = eventPtr->u.e
c0b0: 78 70 6f 73 65 2e 74 6f 70 3b 0a 09 09 7d 20 65  xpose.top;...} e
c0c0: 6c 73 65 20 69 66 20 28 65 76 65 6e 74 50 74 72  lse if (eventPtr
c0d0: 2d 3e 74 79 70 65 20 3d 3d 20 43 54 4b 5f 4d 41  ->type == CTK_MA
c0e0: 50 5f 45 56 45 4e 54 29 20 7b 0a 09 09 20 20 20  P_EVENT) {...   
c0f0: 20 6e 75 6d 62 65 72 20 3d 20 54 6b 5f 59 28 65   number = Tk_Y(e
c100: 76 65 6e 74 50 74 72 2d 3e 77 69 6e 64 6f 77 29  ventPtr->window)
c110: 3b 0a 09 09 7d 0a 09 09 67 6f 74 6f 20 64 6f 4e  ;...}...goto doN
c120: 75 6d 62 65 72 3b 0a 09 20 20 20 20 63 61 73 65  umber;..    case
c130: 20 27 41 27 3a 0a 09 09 69 66 20 28 65 76 65 6e   'A':...if (even
c140: 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54  tPtr->type == CT
c150: 4b 5f 4b 45 59 5f 45 56 45 4e 54 29 20 7b 0a 09  K_KEY_EVENT) {..
c160: 09 20 20 20 20 4b 65 79 53 79 6d 20 6b 65 79 20  .    KeySym key 
c170: 3d 20 65 76 65 6e 74 50 74 72 2d 3e 75 2e 6b 65  = eventPtr->u.ke
c180: 79 2e 73 79 6d 3b 0a 09 09 20 20 20 20 69 66 20  y.sym;...    if 
c190: 28 6b 65 79 20 3e 3d 20 30 20 26 26 20 6b 65 79  (key >= 0 && key
c1a0: 20 3c 3d 20 55 43 48 41 52 5f 4d 41 58 29 20 7b   <= UCHAR_MAX) {
c1b0: 0a 09 09 09 6e 75 6d 53 74 6f 72 61 67 65 5b 30  ....numStorage[0
c1c0: 5d 20 3d 20 6b 65 79 3b 0a 09 09 09 6e 75 6d 53  ] = key;....numS
c1d0: 74 6f 72 61 67 65 5b 31 5d 20 3d 20 27 5c 30 27  torage[1] = '\0'
c1e0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;...    } else {
c1f0: 0a 09 09 09 6e 75 6d 53 74 6f 72 61 67 65 5b 30  ....numStorage[0
c200: 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 20 20 20 20  ] = '\0';...    
c210: 7d 0a 09 09 7d 0a 09 09 73 74 72 69 6e 67 20 3d  }...}...string =
c220: 20 6e 75 6d 53 74 6f 72 61 67 65 3b 0a 09 09 67   numStorage;...g
c230: 6f 74 6f 20 64 6f 53 74 72 69 6e 67 3b 0a 09 20  oto doString;.. 
c240: 20 20 20 63 61 73 65 20 27 4b 27 3a 0a 09 09 69     case 'K':...i
c250: 66 20 28 65 76 65 6e 74 50 74 72 2d 3e 74 79 70  f (eventPtr->typ
c260: 65 20 3d 3d 20 43 54 4b 5f 4b 45 59 5f 45 56 45  e == CTK_KEY_EVE
c270: 4e 54 29 20 7b 0a 09 09 20 20 20 20 72 65 67 69  NT) {...    regi
c280: 73 74 65 72 20 4b 65 79 53 79 6d 49 6e 66 6f 20  ster KeySymInfo 
c290: 2a 6b 50 74 72 3b 0a 0a 09 09 20 20 20 20 66 6f  *kPtr;....    fo
c2a0: 72 20 28 6b 50 74 72 20 3d 20 6b 65 79 41 72 72  r (kPtr = keyArr
c2b0: 61 79 3b 20 6b 50 74 72 2d 3e 6e 61 6d 65 20 21  ay; kPtr->name !
c2c0: 3d 20 4e 55 4c 4c 3b 20 6b 50 74 72 2b 2b 29 20  = NULL; kPtr++) 
c2d0: 7b 0a 09 09 09 69 66 20 28 6b 50 74 72 2d 3e 76  {....if (kPtr->v
c2e0: 61 6c 75 65 20 3d 3d 20 6b 65 79 53 79 6d 29 20  alue == keySym) 
c2f0: 7b 0a 09 09 09 20 20 20 20 73 74 72 69 6e 67 20  {....    string 
c300: 3d 20 6b 50 74 72 2d 3e 6e 61 6d 65 3b 0a 09 09  = kPtr->name;...
c310: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 09 7d  .    break;....}
c320: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 67  ...    }...}...g
c330: 6f 74 6f 20 64 6f 53 74 72 69 6e 67 3b 0a 09 20  oto doString;.. 
c340: 20 20 20 63 61 73 65 20 27 4e 27 3a 0a 09 09 6e     case 'N':...n
c350: 75 6d 62 65 72 20 3d 20 28 69 6e 74 29 20 6b 65  umber = (int) ke
c360: 79 53 79 6d 3b 0a 09 09 67 6f 74 6f 20 64 6f 4e  ySym;...goto doN
c370: 75 6d 62 65 72 3b 0a 09 20 20 20 20 63 61 73 65  umber;..    case
c380: 20 27 54 27 3a 0a 09 09 6e 75 6d 62 65 72 20 3d   'T':...number =
c390: 20 65 76 65 6e 74 50 74 72 2d 3e 74 79 70 65 3b   eventPtr->type;
c3a0: 0a 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65 72  ...goto doNumber
c3b0: 3b 0a 09 20 20 20 20 63 61 73 65 20 27 57 27 3a  ;..    case 'W':
c3c0: 20 7b 0a 09 09 73 74 72 69 6e 67 20 3d 20 54 6b   {...string = Tk
c3d0: 5f 50 61 74 68 4e 61 6d 65 28 65 76 65 6e 74 50  _PathName(eventP
c3e0: 74 72 2d 3e 77 69 6e 64 6f 77 29 3b 0a 09 09 67  tr->window);...g
c3f0: 6f 74 6f 20 64 6f 53 74 72 69 6e 67 3b 0a 09 20  oto doString;.. 
c400: 20 20 20 7d 0a 09 20 20 20 20 63 61 73 65 20 27     }..    case '
c410: 58 27 3a 20 7b 0a 09 09 6e 75 6d 62 65 72 20 3d  X': {...number =
c420: 20 43 74 6b 5f 41 62 73 4c 65 66 74 28 65 76 65   Ctk_AbsLeft(eve
c430: 6e 74 50 74 72 2d 3e 77 69 6e 64 6f 77 29 3b 0a  ntPtr->window);.
c440: 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65 72 3b  ..goto doNumber;
c450: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63 61 73  ..    }..    cas
c460: 65 20 27 59 27 3a 20 7b 0a 09 09 6e 75 6d 62 65  e 'Y': {...numbe
c470: 72 20 3d 20 43 74 6b 5f 41 62 73 54 6f 70 28 65  r = Ctk_AbsTop(e
c480: 76 65 6e 74 50 74 72 2d 3e 77 69 6e 64 6f 77 29  ventPtr->window)
c490: 3b 0a 09 09 67 6f 74 6f 20 64 6f 4e 75 6d 62 65  ;...goto doNumbe
c4a0: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 64  r;..    }..    d
c4b0: 65 66 61 75 6c 74 3a 0a 09 09 6e 75 6d 53 74 6f  efault:...numSto
c4c0: 72 61 67 65 5b 30 5d 20 3d 20 62 65 66 6f 72 65  rage[0] = before
c4d0: 5b 31 5d 3b 0a 09 09 6e 75 6d 53 74 6f 72 61 67  [1];...numStorag
c4e0: 65 5b 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 73  e[1] = '\0';...s
c4f0: 74 72 69 6e 67 20 3d 20 6e 75 6d 53 74 6f 72 61  tring = numStora
c500: 67 65 3b 0a 09 09 67 6f 74 6f 20 64 6f 53 74 72  ge;...goto doStr
c510: 69 6e 67 3b 0a 09 7d 0a 0a 09 64 6f 4e 75 6d 62  ing;..}...doNumb
c520: 65 72 3a 0a 09 73 70 72 69 6e 74 66 28 6e 75 6d  er:..sprintf(num
c530: 53 74 6f 72 61 67 65 2c 20 22 25 64 22 2c 20 6e  Storage, "%d", n
c540: 75 6d 62 65 72 29 3b 0a 09 73 74 72 69 6e 67 20  umber);..string 
c550: 3d 20 6e 75 6d 53 74 6f 72 61 67 65 3b 0a 0a 09  = numStorage;...
c560: 64 6f 53 74 72 69 6e 67 3a 0a 09 73 70 61 63 65  doString:..space
c570: 4e 65 65 64 65 64 20 3d 20 54 63 6c 5f 53 63 61  Needed = Tcl_Sca
c580: 6e 45 6c 65 6d 65 6e 74 28 73 74 72 69 6e 67 2c  nElement(string,
c590: 20 26 63 76 74 46 6c 61 67 73 29 3b 0a 09 6c 65   &cvtFlags);..le
c5a0: 6e 67 74 68 20 3d 20 54 63 6c 5f 44 53 74 72 69  ngth = Tcl_DStri
c5b0: 6e 67 4c 65 6e 67 74 68 28 64 73 50 74 72 29 3b  ngLength(dsPtr);
c5c0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 53 65 74  ..Tcl_DStringSet
c5d0: 4c 65 6e 67 74 68 28 64 73 50 74 72 2c 20 6c 65  Length(dsPtr, le
c5e0: 6e 67 74 68 20 2b 20 73 70 61 63 65 4e 65 65 64  ngth + spaceNeed
c5f0: 65 64 29 3b 0a 09 73 70 61 63 65 4e 65 65 64 65  ed);..spaceNeede
c600: 64 20 3d 20 54 63 6c 5f 43 6f 6e 76 65 72 74 45  d = Tcl_ConvertE
c610: 6c 65 6d 65 6e 74 28 73 74 72 69 6e 67 2c 0a 09  lement(string,..
c620: 09 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75  .Tcl_DStringValu
c630: 65 28 64 73 50 74 72 29 20 2b 20 6c 65 6e 67 74  e(dsPtr) + lengt
c640: 68 2c 0a 09 09 63 76 74 46 6c 61 67 73 20 7c 20  h,...cvtFlags | 
c650: 54 43 4c 5f 44 4f 4e 54 5f 55 53 45 5f 42 52 41  TCL_DONT_USE_BRA
c660: 43 45 53 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  CES);..Tcl_DStri
c670: 6e 67 53 65 74 4c 65 6e 67 74 68 28 64 73 50 74  ngSetLength(dsPt
c680: 72 2c 20 6c 65 6e 67 74 68 20 2b 20 73 70 61 63  r, length + spac
c690: 65 4e 65 65 64 65 64 29 3b 0a 09 62 65 66 6f 72  eNeeded);..befor
c6a0: 65 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 7d 0a  e += 2;.    }.}.
c6b0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
c6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
c700: 0a 20 2a 20 54 6b 43 6f 70 79 41 6e 64 47 6c 6f  . * TkCopyAndGlo
c710: 62 61 6c 45 76 61 6c 20 2d 2d 0a 20 2a 0a 20 2a  balEval --. *. *
c720: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
c730: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
c740: 61 20 73 63 72 69 70 74 20 74 68 65 6e 20 63 61  a script then ca
c750: 6c 6c 73 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76  lls Tcl_GlobalEv
c760: 61 6c 0a 20 2a 09 74 6f 20 65 76 61 6c 75 61 74  al. *.to evaluat
c770: 65 20 69 74 2e 20 20 49 74 27 73 20 75 73 65 64  e it.  It's used
c780: 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
c790: 68 65 72 65 20 74 68 65 20 65 78 65 63 75 74 69  here the executi
c7a0: 6f 6e 20 6f 66 0a 20 2a 09 61 20 63 6f 6d 6d 61  on of. *.a comma
c7b0: 6e 64 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  nd may cause the
c7c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6d 6d 61 6e   original comman
c7d0: 64 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 72  d string to be r
c7e0: 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 2a 0a 20  eallocated.. *. 
c7f0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65  * Results:. *.Re
c800: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
c810: 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 73   of evaluating s
c820: 63 72 69 70 74 2c 20 69 6e 63 6c 75 64 69 6e 67  cript, including
c830: 20 62 6f 74 68 20 61 20 73 74 61 6e 64 61 72 64   both a standard
c840: 0a 20 2a 09 54 63 6c 20 63 6f 6d 70 6c 65 74 69  . *.Tcl completi
c850: 6f 6e 20 63 6f 64 65 20 61 6e 64 20 61 20 73 74  on code and a st
c860: 72 69 6e 67 20 69 6e 20 69 6e 74 65 72 70 2d 3e  ring in interp->
c870: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
c880: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
c890: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8e0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 43 6f 70 79  . */..int.TkCopy
c8f0: 41 6e 64 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  AndGlobalEval(in
c900: 74 65 72 70 2c 20 73 63 72 69 70 74 29 0a 20 20  terp, script).  
c910: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
c920: 74 65 72 70 3b 09 09 09 2f 2a 20 49 6e 74 65 72  terp;.../* Inter
c930: 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20  preter in which 
c940: 74 6f 20 65 76 61 6c 75 61 74 65 0a 09 09 09 09  to evaluate.....
c950: 09 20 2a 20 73 63 72 69 70 74 2e 20 2a 2f 0a 20  . * script. */. 
c960: 20 20 20 63 68 61 72 20 2a 73 63 72 69 70 74 3b     char *script;
c970: 09 09 09 2f 2a 20 53 63 72 69 70 74 20 74 6f 20  .../* Script to 
c980: 65 76 61 6c 75 61 74 65 2e 20 2a 2f 0a 7b 0a 20  evaluate. */.{. 
c990: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 62     Tcl_DString b
c9a0: 75 66 66 65 72 3b 0a 20 20 20 20 69 6e 74 20 63  uffer;.    int c
c9b0: 6f 64 65 3b 0a 0a 20 20 20 20 54 63 6c 5f 44 53  ode;..    Tcl_DS
c9c0: 74 72 69 6e 67 49 6e 69 74 28 26 62 75 66 66 65  tringInit(&buffe
c9d0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
c9e0: 69 6e 67 41 70 70 65 6e 64 28 26 62 75 66 66 65  ingAppend(&buffe
c9f0: 72 2c 20 73 63 72 69 70 74 2c 20 2d 31 29 3b 0a  r, script, -1);.
ca00: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 47      code = Tcl_G
ca10: 6c 6f 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70  lobalEval(interp
ca20: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
ca30: 75 65 28 26 62 75 66 66 65 72 29 29 3b 0a 20 20  ue(&buffer));.  
ca40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
ca50: 65 28 26 62 75 66 66 65 72 29 3b 0a 20 20 20 20  e(&buffer);.    
ca60: 72 65 74 75 72 6e 20 63 6f 64 65 3b 0a 7d 0a 0c  return code;.}..
ca70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
ca80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
cac0: 20 2a 20 43 74 6b 5f 43 74 6b 45 76 65 6e 74 43   * Ctk_CtkEventC
cad0: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
cae0: 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
caf0: 6d 65 6e 74 73 20 74 68 65 20 22 63 74 6b 5f 65  ments the "ctk_e
cb00: 76 65 6e 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 20  vent" command.  
cb10: 49 74 20 61 6c 6c 6f 77 73 0a 20 2a 09 65 76 65  It allows. *.eve
cb20: 6e 74 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61  nts to be genera
cb30: 74 65 64 20 6f 6e 20 74 68 65 20 66 6c 79 2e 20  ted on the fly. 
cb40: 20 48 61 6e 64 79 20 66 6f 72 20 72 65 6d 61 70   Handy for remap
cb50: 70 69 6e 67 20 6b 65 79 73 2e 0a 20 2a 0a 20 2a  ping keys.. *. *
cb60: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
cb70: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
cb80: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
cb90: 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74  ffects:. *.Creat
cba0: 65 73 20 61 6e 64 20 68 61 6e 64 6c 65 73 20 65  es and handles e
cbb0: 76 65 6e 74 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  vents.. *. *----
cbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 43 74 6b 5f  --. */..int.Ctk_
cc10: 43 74 6b 45 76 65 6e 74 43 6d 64 28 63 6c 69 65  CtkEventCmd(clie
cc20: 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
cc30: 61 72 67 63 2c 20 61 72 67 76 29 0a 20 20 20 20  argc, argv).    
cc40: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
cc50: 74 44 61 74 61 3b 09 09 2f 2a 20 4d 61 69 6e 20  tData;../* Main 
cc60: 77 69 6e 64 6f 77 20 66 6f 72 20 61 70 70 6c 69  window for appli
cc70: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 54  cation. */.    T
cc80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cc90: 70 3b 09 09 09 2f 2a 20 43 75 72 72 65 6e 74 20  p;.../* Current 
cca0: 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a  interpreter. */.
ccb0: 20 20 20 20 69 6e 74 20 61 72 67 63 3b 09 09 09      int argc;...
ccc0: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72  ./* Number of ar
ccd0: 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  guments. */.    
cce0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 09 09 09 2f  char **argv;.../
ccf0: 2a 20 41 72 67 75 6d 65 6e 74 20 73 74 72 69 6e  * Argument strin
cd00: 67 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b 5f  gs. */.{.    Tk_
cd10: 57 69 6e 64 6f 77 20 6d 61 69 6e 20 3d 20 28 54  Window main = (T
cd20: 6b 5f 57 69 6e 64 6f 77 29 20 63 6c 69 65 6e 74  k_Window) client
cd30: 44 61 74 61 3b 0a 20 20 20 20 54 6b 5f 57 69 6e  Data;.    Tk_Win
cd40: 64 6f 77 20 74 6b 77 69 6e 3b 0a 20 20 20 20 58  dow tkwin;.    X
cd50: 45 76 65 6e 74 20 65 76 65 6e 74 3b 0a 20 20 20  Event event;.   
cd60: 20 45 76 65 6e 74 49 6e 66 6f 20 2a 65 69 50 74   EventInfo *eiPt
cd70: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 66 69 65  r;.    char *fie
cd80: 6c 64 2c 20 2a 76 61 6c 75 65 3b 0a 20 20 20 20  ld, *value;.    
cd90: 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 48  int i;.    Tcl_H
cda0: 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0a  ashEntry *hPtr;.
cdb0: 0a 20 20 20 20 69 66 20 28 28 61 72 67 63 20 3c  .    if ((argc <
cdc0: 20 33 29 20 7c 7c 20 21 28 61 72 67 63 20 26 20   3) || !(argc & 
cdd0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
cde0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cdf0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
ce00: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
ce10: 67 76 5b 30 5d 2c 0a 09 09 22 20 77 69 6e 64 6f  gv[0],..." windo
ce20: 77 20 74 79 70 65 20 3f 66 69 65 6c 64 20 76 61  w type ?field va
ce30: 6c 75 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20  lue field value 
ce40: 2e 2e 2e 3f 5c 22 22 2c 0a 09 09 28 63 68 61 72  ...?\"",...(char
ce50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
ce60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ce70: 20 20 7d 0a 20 20 20 20 74 6b 77 69 6e 20 3d 20    }.    tkwin = 
ce80: 54 6b 5f 4e 61 6d 65 54 6f 57 69 6e 64 6f 77 28  Tk_NameToWindow(
ce90: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
cea0: 20 6d 61 69 6e 29 3b 0a 20 20 20 20 69 66 20 28   main);.    if (
ceb0: 74 6b 77 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tkwin == NULL) {
cec0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ced0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  OR;.    }.    me
cee0: 6d 73 65 74 28 28 56 4f 49 44 20 2a 29 20 26 65  mset((VOID *) &e
cef0: 76 65 6e 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  vent, 0, sizeof(
cf00: 65 76 65 6e 74 29 29 3b 0a 20 20 20 20 65 76 65  event));.    eve
cf10: 6e 74 2e 77 69 6e 64 6f 77 20 3d 20 74 6b 77 69  nt.window = tkwi
cf20: 6e 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  n;..    /*.     
cf30: 2a 20 47 65 74 20 74 68 65 20 74 79 70 65 20 6f  * Get the type o
cf40: 66 20 74 68 65 20 65 76 65 6e 74 2e 0a 20 20 20  f the event..   
cf50: 20 20 2a 2f 0a 0a 20 20 20 20 68 50 74 72 20 3d    */..    hPtr =
cf60: 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74   Tcl_FindHashEnt
cf70: 72 79 28 26 65 76 65 6e 74 54 61 62 6c 65 2c 20  ry(&eventTable, 
cf80: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66  argv[2]);.    if
cf90: 20 28 21 68 50 74 72 29 20 7b 0a 09 54 63 6c 5f   (!hPtr) {..Tcl_
cfa0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cfb0: 65 72 70 2c 20 22 62 61 64 20 65 76 65 6e 74 20  erp, "bad event 
cfc0: 74 79 70 65 20 5c 22 22 2c 20 61 72 67 76 5b 32  type \"", argv[2
cfd0: 5d 2c 0a 09 09 22 5c 22 22 2c 20 28 63 68 61 72  ],..."\"", (char
cfe0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
cff0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d000: 20 20 7d 0a 20 20 20 20 65 69 50 74 72 20 3d 20    }.    eiPtr = 
d010: 28 45 76 65 6e 74 49 6e 66 6f 20 2a 29 20 54 63  (EventInfo *) Tc
d020: 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 68  l_GetHashValue(h
d030: 50 74 72 29 3b 0a 20 20 20 20 65 76 65 6e 74 2e  Ptr);.    event.
d040: 74 79 70 65 20 3d 20 65 69 50 74 72 2d 3e 74 79  type = eiPtr->ty
d050: 70 65 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  pe;..    /*.    
d060: 20 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 72   * Process the r
d070: 65 6d 61 69 6e 69 6e 67 20 61 72 67 75 6d 65 6e  emaining argumen
d080: 74 73 20 74 6f 20 66 69 6c 6c 20 69 6e 20 61 64  ts to fill in ad
d090: 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 0a  ditional fields.
d0a0: 20 20 20 20 20 2a 20 6f 66 20 74 68 65 20 65 76       * of the ev
d0b0: 65 6e 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ent..     */..  
d0c0: 20 20 66 6f 72 20 28 69 20 3d 20 33 3b 20 69 20    for (i = 3; i 
d0d0: 3c 20 61 72 67 63 3b 20 69 20 2b 3d 20 32 29 20  < argc; i += 2) 
d0e0: 7b 0a 09 66 69 65 6c 64 20 3d 20 61 72 67 76 5b  {..field = argv[
d0f0: 69 5d 3b 0a 09 76 61 6c 75 65 20 3d 20 61 72 67  i];..value = arg
d100: 76 5b 69 2b 31 5d 3b 0a 09 69 66 20 28 65 76 65  v[i+1];..if (eve
d110: 6e 74 2e 74 79 70 65 20 3d 3d 20 4b 65 79 50 72  nt.type == KeyPr
d120: 65 73 73 20 26 26 20 73 74 72 63 6d 70 28 66 69  ess && strcmp(fi
d130: 65 6c 64 2c 20 22 2d 6b 65 79 22 29 20 3d 3d 20  eld, "-key") == 
d140: 30 29 20 7b 0a 09 20 20 20 20 68 50 74 72 20 3d  0) {..    hPtr =
d150: 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74   Tcl_FindHashEnt
d160: 72 79 28 26 6b 65 79 53 79 6d 54 61 62 6c 65 2c  ry(&keySymTable,
d170: 20 76 61 6c 75 65 29 3b 0a 09 20 20 20 20 69 66   value);..    if
d180: 20 28 68 50 74 72 29 20 7b 0a 09 09 65 76 65 6e   (hPtr) {...even
d190: 74 2e 75 2e 6b 65 79 2e 73 79 6d 20 3d 20 28 69  t.u.key.sym = (i
d1a0: 6e 74 29 20 54 63 6c 5f 47 65 74 48 61 73 68 56  nt) Tcl_GetHashV
d1b0: 61 6c 75 65 28 68 50 74 72 29 3b 0a 09 20 20 20  alue(hPtr);..   
d1c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 63 6c 5f   } else {...Tcl_
d1d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d1e0: 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6b 65  erp, "unknown ke
d1f0: 79 73 79 6d 20 5c 22 22 2c 20 76 61 6c 75 65 2c  ysym \"", value,
d200: 0a 09 09 09 22 5c 22 22 2c 20 28 63 68 61 72 20  ...."\"", (char 
d210: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75  *) NULL);...retu
d220: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
d230: 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 69 66 20     }..} else if 
d240: 28 65 76 65 6e 74 2e 74 79 70 65 20 3d 3d 20 4b  (event.type == K
d250: 65 79 50 72 65 73 73 20 26 26 20 73 74 72 63 6d  eyPress && strcm
d260: 70 28 66 69 65 6c 64 2c 20 22 2d 6d 6f 64 69 66  p(field, "-modif
d270: 69 65 72 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20  ier") == 0) {.. 
d280: 20 20 20 72 65 67 69 73 74 65 72 20 4d 6f 64 49     register ModI
d290: 6e 66 6f 20 2a 6d 6f 64 50 74 72 3b 0a 09 20 20  nfo *modPtr;..  
d2a0: 20 20 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e    hPtr = Tcl_Fin
d2b0: 64 48 61 73 68 45 6e 74 72 79 28 26 6d 6f 64 54  dHashEntry(&modT
d2c0: 61 62 6c 65 2c 20 76 61 6c 75 65 29 3b 0a 09 20  able, value);.. 
d2d0: 20 20 20 69 66 20 28 68 50 74 72 29 20 7b 0a 09     if (hPtr) {..
d2e0: 09 6d 6f 64 50 74 72 20 3d 20 28 4d 6f 64 49 6e  .modPtr = (ModIn
d2f0: 66 6f 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 73  fo *) Tcl_GetHas
d300: 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 09 09  hValue(hPtr);...
d310: 65 76 65 6e 74 2e 75 2e 6b 65 79 2e 73 74 61 74  event.u.key.stat
d320: 65 20 7c 3d 20 6d 6f 64 50 74 72 2d 3e 6d 61 73  e |= modPtr->mas
d330: 6b 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  k;..    } else {
d340: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
d350: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
d360: 6e 6f 77 6e 20 6d 6f 64 69 66 69 65 72 20 5c 22  nown modifier \"
d370: 22 2c 20 76 61 6c 75 65 2c 0a 09 09 09 22 5c 22  ", value,...."\"
d380: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d390: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
d3a0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d  ERROR;..    }..}
d3b0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c   else {..    Tcl
d3c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d3d0: 74 65 72 70 2c 20 22 62 61 64 20 6f 70 74 69 6f  terp, "bad optio
d3e0: 6e 20 5c 22 22 2c 20 66 69 65 6c 64 2c 20 22 5c  n \"", field, "\
d3f0: 22 22 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20  "",...    (char 
d400: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
d410: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d420: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54 6b  ..}.    }.    Tk
d430: 5f 48 61 6e 64 6c 65 45 76 65 6e 74 28 26 65 76  _HandleEvent(&ev
d440: 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ent);.    return
d450: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a                  TCL_OK;.}.