Git init
[framework/uifw/xorg/lib/libxt.git] / specs / appB
1 .\" $Xorg: appB,v 1.3 2000/08/17 19:42:48 cpqbld Exp $
2 .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994
3 .\" X Consortium
4 .\" 
5 .\" Permission is hereby granted, free of charge, to any person obtaining
6 .\" a copy of this software and associated documentation files (the
7 .\" "Software"), to deal in the Software without restriction, including
8 .\" without limitation the rights to use, copy, modify, merge, publish,
9 .\" distribute, sublicense, and/or sell copies of the Software, and to
10 .\" permit persons to whom the Software is furnished to do so, subject to
11 .\" the following conditions:
12 .\" 
13 .\" The above copyright notice and this permission notice shall be included
14 .\" in all copies or substantial portions of the Software.
15 .\" 
16 .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 .\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 .\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 .\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 .\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 .\" OTHER DEALINGS IN THE SOFTWARE.
23 .\" 
24 .\" Except as contained in this notice, the name of the X Consortium shall
25 .\" not be used in advertising or otherwise to promote the sale, use or
26 .\" other dealings in this Software without prior written authorization
27 .\" from the X Consortium.
28 .\" 
29 .\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994
30 .\" Digital Equipment Corporation, Maynard, Massachusetts.
31 .\" 
32 .\" Permission to use, copy, modify and distribute this documentation for any
33 .\" purpose and without fee is hereby granted, provided that the above copyright
34 .\" notice appears in all copies and that both that copyright notice and this
35 .\" permission notice appear in supporting documentation, and that the name of
36 .\" Digital not be used in in advertising or publicity pertaining
37 .\" to distribution of the software without specific, written prior permission.
38 .\" Digital makes no representations about the suitability of the
39 .\" software described herein for any purpose.
40 .\" It is provided ``as is'' without express or implied warranty.
41 .\"
42 .bp
43 \&
44 .sp 1
45 .ce 3
46 \s+1\fBAppendix B\fP\s-1
47
48 \s+1\fBTranslation Table Syntax\fP\s-1
49 .sp 2
50 .LP
51 .XS
52 \fBAppendix B \(em Translation Table Syntax\fP
53 .XE
54 .IN "Translation tables"
55 .SH
56 Notation
57 .LP
58 Syntax is specified in EBNF notation with the following conventions:
59 .TS
60 l l.
61 [ a ]   Means either nothing or ``a''
62 { a }   Means zero or more occurrences of ``a''
63 ( a | b )       Means either ``a'' or ``b''
64 \\\\n   Is the newline character
65 .TE
66 .LP
67 All terminals are enclosed in double quotation marks (`` '').
68 Informal descriptions are enclosed in angle brackets (< >).
69 .SH
70 Syntax
71 .LP
72 The syntax of a translation table is
73 .TS
74 l l .
75 translationTable        = [ directive ] { production }
76 directive       = ( ``#replace'' | ``#override'' | ``#augment'' ) ``\\\\n''
77 production      = lhs ``:'' rhs ``\\\\n''
78 lhs     = ( event | keyseq ) { ``,'' (event | keyseq) }
79 keyseq  = ``"'' keychar {keychar} ``"''
80 keychar = [ ``^'' | ``$'' | ``\\\\'' ] <ISO Latin 1 character>
81 event   = [modifier_list] ``<''event_type``>'' [ ``('' count[``+''] ``)'' ] {detail}
82 modifier_list   = ( [``!''] [``:''] {modifier} ) | ``None''
83 modifier        = [``~''] modifier_name
84 count   = (``1'' | ``2'' | ``3'' | ``4'' | ...)
85 modifier_name   = ``@'' <keysym> | <see ModifierNames table below>
86 event_type      = <see Event Types table below>
87 detail  = <event specific details>
88 rhs     = { name ``('' [params] ``)'' }
89 name    = namechar { namechar }
90 namechar        = { ``a''-``z'' | ``A''-``Z'' | ``0''-``9'' | ``_'' | ``-'' }
91 params  = string {``,'' string}
92 string  = quoted_string | unquoted_string
93 quoted_string   = ``"'' {<Latin 1 character> | escape_char} [``\\\\\\\\'' ] ``"''
94 escape_char     = ``\\\\"''
95 unquoted_string = {<Latin 1 character except space, tab, ``,'', ``\\\\n'', ``)''>}
96 .TE
97
98 .LP
99 The \fIparams\fP field is parsed into a list of
100 .PN String
101 values that will be passed to the named action procedure.  A
102 \fIquoted string\fP may contain an embedded quotation mark if the
103 quotation mark is preceded by a single backslash (\\).  The
104 three-character sequence ``\\\\"'' is interpreted as ``single backslash
105 followed by end-of-string''.
106
107 .SH
108 Modifier Names
109 .LP
110 The modifier field is used to specify standard X keyboard and button
111 modifier mask bits.
112 Modifiers are legal on event types 
113 .PN KeyPress ,
114 .PN KeyRelease , 
115 .PN ButtonPress ,
116 .PN ButtonRelease ,
117 .PN MotionNotify ,
118 .PN EnterNotify ,
119 .PN LeaveNotify ,
120 and their abbreviations.
121 An error is generated when a translation table 
122 that contains modifiers for any other events is parsed.
123 .IP \(bu 5
124 If the modifier list has no entries and is not ``None'',
125 it means ``don't care'' on all modifiers.
126 .IP \(bu 5
127 If an exclamation point (!) is specified at the beginning 
128 of the modifier list,
129 it means that the listed modifiers must be in the correct state
130 and no other modifiers can be asserted.
131 .IP \(bu 5
132 If any modifiers are specified 
133 and an exclamation point (!) is not specified,
134 it means that the listed modifiers must be in the
135 correct state and ``don't care'' about any other modifiers.
136 .IP \(bu 5
137 If a modifier is preceded by a tilde (~),
138 it means that that modifier must not be asserted.
139 .IP \(bu 5
140 If ``None'' is specified, it means no modifiers can be asserted.
141 .IP \(bu 5
142 If a colon (:) is specified at the beginning of the modifier list,
143 it directs the \*(xI to apply any standard modifiers in the
144 event to map the event keycode into a KeySym.
145 The default standard modifiers are Shift and Lock, 
146 with the interpretation as defined in \fI\*(xP\fP, Section 5.
147 The resulting KeySym must exactly match the specified
148 KeySym, and the nonstandard modifiers in the event must match the
149 modifier list.
150 For example, ``:<Key>a'' is distinct from ``:<Key>A'', 
151 and ``:Shift<Key>A'' is distinct from ``:<Key>A''.
152 .IP \(bu 5
153 If both an exclamation point (!) and a colon (:) are specified at
154 the beginning of the modifier list, it means that the listed
155 modifiers must be in the correct state and that no other modifiers
156 except the standard modifiers can be asserted.  Any standard
157 modifiers in the event are applied as for colon (:) above.
158 .IP \(bu 5
159 If a colon (:) is not specified,
160 no standard modifiers are applied.
161 Then, for example, ``<Key>A'' and ``<Key>a'' are equivalent.
162 .LP
163 In key sequences,
164 a circumflex (^) is an abbreviation for the Control modifier,
165 a dollar sign ($) is an abbreviation for Meta, 
166 and a backslash (\\) can be used to quote any
167 character, in particular a double quote ("), a circumflex (^), 
168 a dollar sign ($), and another backslash (\\).
169 Briefly:
170 .LP
171 .Ds 0
172 .TA 2.5i
173 .ta 2.5i
174 No modifiers:   None <event> detail
175 Any modifiers:  <event> detail
176 Only these modifiers:   ! mod1 mod2 <event> detail
177 These modifiers and any others: mod1 mod2 <event> detail
178 .De
179 .LP
180 The use of ``None'' for a modifier list is identical to the use
181 of an exclamation point with no modifers.
182 .LP
183 .TS H
184 lw(1i) lw(1i) lw(3i).
185 _
186 .sp 6p
187 Modifier        Abbreviation    Meaning
188 .sp 6p
189 _
190 .sp 6p
191 .R
192 .TH
193 Ctrl    c       Control modifier bit
194 Shift   s       Shift modifier bit
195 Lock    l       Lock modifier bit
196 Meta    m       Meta key modifier
197 Hyper   h       Hyper key modifier
198 Super   su      Super key modifier
199 Alt     a       Alt key modifier
200 Mod1            Mod1 modifier bit
201 Mod2            Mod2 modifier bit
202 Mod3            Mod3 modifier bit
203 Mod4            Mod4 modifier bit
204 Mod5            Mod5 modifier bit
205 Button1         Button1 modifier bit
206 Button2         Button2 modifier bit
207 Button3         Button3 modifier bit
208 Button4         Button4 modifier bit
209 Button5         Button5 modifier bit
210 None            No modifiers
211 Any             Any modifier combination
212 .sp 6p
213 _
214 .TE
215 .LP
216 .IN "key modifier"
217 A key modifier is any modifier bit one of whose corresponding KeyCodes
218 contains the corresponding left or right KeySym.
219 For example, 
220 ``m'' or ``Meta'' means any modifier bit mapping to a KeyCode 
221 whose KeySym list contains XK_Meta_L or XK_Meta_R.
222 Note that this interpretation is for each display, 
223 not global or even for each application context.
224 The Control, Shift, and Lock modifier names refer
225 explicitly to the corresponding modifier bits; 
226 there is no additional interpretation of KeySyms for these modifiers.
227 .LP
228 Because it is possible to associate arbitrary KeySyms with modifiers, the set of
229 key modifiers is extensible.  The ``@'' <keysym> syntax means any
230 modifier bit whose corresponding KeyCode contains the specified KeySym name.
231 .LP
232 A modifier_list/KeySym combination in a translation matches a
233 modifiers/KeyCode combination in an event in the following ways:
234 .IP 1. 5
235 If a colon (:) is used, the \*(xI call the display's 
236 .PN XtKeyProc 
237 with the KeyCode and modifiers.
238 To match, (\fImodifiers\fP & ~\fImodifiers_return\fP) must equal \fImodifier_list\fP, and
239 \fIkeysym_return\fP must equal the given KeySym.
240 .IP 2. 5
241 If (:) is not used, the \*(xI mask off all don't-care bits from the 
242 modifiers.
243 This value must be equal to \fImodifier_list\fP.
244 Then, for each possible combination of
245 don't-care modifiers in the modifier list, the \*(xI call the display's 
246 .PN XtKeyProc
247 with the KeyCode and that combination ORed with the cared-about modifier bits 
248 from the event.
249 \fIKeysym_return\fP must match the KeySym in the translation.
250 .SH
251 Event Types
252 .LP
253 The event-type field describes XEvent types.
254 In addition to the standard
255 Xlib symbolic event type names, the following event type synonyms
256 are defined:
257 .TS H
258 lw(1.5i) lw(3i).
259 _
260 .sp 6p
261 Type    Meaning
262 .sp 6p
263 _
264 .sp 6p
265 .TH
266 Key     T{
267 .PN KeyPress
268 T}
269 KeyDown T{
270 .PN KeyPress
271 T}
272 KeyUp   T{
273 .PN KeyRelease
274 T}
275 BtnDown T{
276 .PN ButtonPress
277 T}
278 BtnUp   T{
279 .PN ButtonRelease
280 T}
281 Motion  T{
282 .PN MotionNotify
283 T}
284 PtrMoved        T{
285 .PN MotionNotify
286 T}
287 MouseMoved      T{
288 .PN MotionNotify
289 T}
290 Enter   T{
291 .PN EnterNotify
292 T}
293 EnterWindow     T{
294 .PN EnterNotify
295 T}
296 Leave   T{
297 .PN LeaveNotify
298 T}
299 LeaveWindow     T{
300 .PN LeaveNotify
301 T}
302 FocusIn T{
303 .PN FocusIn
304 T}
305 FocusOut        T{
306 .PN FocusOut
307 T}
308 Keymap  T{
309 .PN KeymapNotify
310 T}
311 Expose  T{
312 .PN Expose
313 T}
314 GrExp   T{
315 .PN GraphicsExpose
316 T}
317 NoExp   T{
318 .PN NoExpose
319 T}
320 Visible T{
321 .PN VisibilityNotify
322 T}
323 Create  T{
324 .PN CreateNotify
325 T}
326 Destroy T{
327 .PN DestroyNotify
328 T}
329 Unmap   T{
330 .PN UnmapNotify
331 T}
332 Map     T{
333 .PN MapNotify
334 T}
335 MapReq  T{
336 .PN MapRequest
337 T}
338 Reparent        T{
339 .PN ReparentNotify
340 T}
341 Configure       T{
342 .PN ConfigureNotify
343 T}
344 ConfigureReq    T{
345 .PN ConfigureRequest
346 T}
347 Grav    T{
348 .PN GravityNotify
349 T}
350 ResReq  T{
351 .PN ResizeRequest
352 T}
353 Circ    T{
354 .PN CirculateNotify
355 T}
356 CircReq T{
357 .PN CirculateRequest
358 T}
359 Prop    T{
360 .PN PropertyNotify
361 T}
362 SelClr  T{
363 .PN SelectionClear
364 T}
365 SelReq  T{
366 .PN SelectionRequest
367 T}
368 Select  T{
369 .PN SelectionNotify
370 T}
371 Clrmap  T{
372 .PN ColormapNotify
373 T}
374 Message T{
375 .PN ClientMessage
376 T}
377 Mapping T{
378 .PN MappingNotify
379 T}
380 .sp 6p
381 _
382 .TE
383 The supported abbreviations are:
384 .TS H
385 lw(1.5i) lw(1.25i) lw(1.75i).
386 _
387 .sp 6p
388 Abbreviation    Event Type      Including
389 .sp 6p
390 _
391 .sp 6p
392 .TH
393 .R
394 Ctrl    T{
395 .PN KeyPress
396 T}      with Control modifier
397 Meta    T{
398 .PN KeyPress
399 T}      with Meta modifier
400 Shift   T{
401 .PN KeyPress
402 T}      with Shift modifier
403 Btn1Down        T{
404 .PN ButtonPress
405 T}      with Button1 detail
406 Btn1Up  T{
407 .PN ButtonRelease
408 T}      with Button1 detail
409 Btn2Down        T{
410 .PN ButtonPress
411 T}      with Button2 detail
412 Btn2Up  T{
413 .PN ButtonRelease
414 T}      with Button2 detail
415 Btn3Down        T{
416 .PN ButtonPress
417 T}      with Button3 detail
418 Btn3Up  T{
419 .PN ButtonRelease
420 T}      with Button3 detail
421 Btn4Down        T{
422 .PN ButtonPress
423 T}      with Button4 detail
424 Btn4Up  T{
425 .PN ButtonRelease
426 T}      with Button4 detail
427 Btn5Down        T{
428 .PN ButtonPress
429 T}      with Button5 detail
430 Btn5Up  T{
431 .PN ButtonRelease
432 T}      with Button5 detail
433 BtnMotion       T{
434 .PN MotionNotify
435 T}      with any button modifier
436 Btn1Motion      T{
437 .PN MotionNotify
438 T}      with Button1 modifier
439 Btn2Motion      T{
440 .PN MotionNotify
441 T}      with Button2 modifier
442 Btn3Motion      T{
443 .PN MotionNotify
444 T}      with Button3 modifier
445 Btn4Motion      T{
446 .PN MotionNotify
447 T}      with Button4 modifier
448 Btn5Motion      T{
449 .PN MotionNotify
450 T}      with Button5 modifier
451 .sp 6p
452 _
453 .TE
454 .sp
455 .LP
456 The detail field is event-specific and normally corresponds to the
457 detail field of the corresponding event as described
458 by \fI\*(xP\fP, Section 11.  The detail field is supported
459 for the following event types:
460 .LP
461 .TS H
462 l l .
463 _
464 .sp 6p
465 Event   Event Field
466 .sp 6p
467 _
468 .TH
469 .sp 6p
470 KeyPress        KeySym from event \fIdetail\fP (keycode)
471 KeyRelease      KeySym from event \fIdetail\fP (keycode)
472 ButtonPress     button from event \fIdetail\fP
473 ButtonRelease   button from event \fIdetail\fP
474 MotionNotify    event \fIdetail\fP
475 EnterNotify     event \fImode\fP
476 LeaveNotify     event \fImode\fP
477 FocusIn event \fImode\fP
478 FocusOut        event \fImode\fP
479 PropertyNotify  \fIatom\fP
480 SelectionClear  \fIselection\fP
481 SelectionRequest        \fIselection\fP
482 SelectionNotify \fIselection\fP
483 ClientMessage   \fItype\fP
484 MappingNotify   \fIrequest\fP
485 .sp 6p
486 _
487 .TE
488 .LP
489 If the event type is
490 .PN KeyPress
491 or
492 .PN KeyRelease ,
493 the detail field
494 specifies a KeySym name in standard format which is matched against
495 the event as described above, for example, <Key>A.
496 .LP
497 For the
498 .PN PropertyNotify ,
499 .PN SelectionClear ,
500 .PN SelectionRequest ,
501 .PN SelectionNotify ,
502 and
503 .PN ClientMessage
504 events the detail field is specified
505 as an atom name; for example, <Message>WM_PROTOCOLS.  For the
506 .PN MotionNotify ,
507 .PN EnterNotify ,
508 .PN LeaveNotify ,
509 .PN FocusIn ,
510 .PN FocusOut ,
511 and
512 .PN MappingNotify
513 events, either the symbolic constants as defined by
514 \fI\*(xP\fP, Section 11,
515 or the numeric values may be specified.
516 .LP
517 If no detail field is specified, then any value in the event detail is
518 accepted as a match.
519 .LP
520 A KeySym can be specified as any of the standard KeySym names, 
521 a hexadecimal number prefixed with ``0x'' or ``0X'', 
522 an octal number prefixed with ``0'', or a decimal number.
523 A KeySym expressed as a single digit is interpreted as the
524 corresponding Latin 1 KeySym, for example, ``0'' is the KeySym XK_0.
525 Other single character KeySyms are treated as literal constants from Latin 1,
526 for example, ``!'' is treated as 0x21.
527 Standard KeySym names are as defined in 
528 .Pn < X11/keysymdef.h >
529 with the ``XK_'' prefix removed.
530 .LP
531 .SH
532 Canonical Representation
533 .LP
534 Every translation table has a unique, canonical text representation. This
535 representation is passed to a widget's
536 .PN display_accelerator
537 procedure to describe the accelerators installed on that widget.
538 The canonical representation of a translation table is (see also
539 ``Syntax'')
540 .TS
541 l l .
542 translationTable        = { production }
543 production      = lhs ``:'' rhs ``\\\\n''
544 lhs     = event { ``,'' event  }
545 event   = [modifier_list] ``<''event_type``>'' [ ``('' count[``+''] ``)'' ] {detail}
546 modifier_list   = [``!''] [``:''] {modifier}
547 modifier        = [``~''] modifier_name
548 count   = (``1'' | ``2'' | ``3'' | ``4'' | ...)
549 modifier_name   = ``@'' <keysym> | <see canonical modifier names below>
550 event_type      = <see canonical event types below>
551 detail  = <event-specific details>
552 rhs     = { name ``('' [params] ``)'' }
553 name    = namechar { namechar }
554 namechar        = { ``a''-``z'' | ``A''-``Z'' | ``0''-``9'' | ``_'' | ``-'' }
555 params  = string {``,'' string}
556 string  = quoted_string
557 quoted_string   = ``"'' {<Latin 1 character> | escape_char} [``\\\\\\\\'' ] ``"''
558 escape_char     = ``\\\\"''
559 .TE
560 .LP
561 The canonical modifier names are
562 .LP
563 .Ds
564 .TA 1i 2.5i
565 .ta 1i 2.5i
566 Ctrl    Mod1    Button1
567 Shift   Mod2    Button2
568 Lock    Mod3    Button3
569         Mod4    Button4
570         Mod5    Button5
571 .De
572 .LP
573 The canonical event types are
574 .IP
575 .TS
576 l l.
577 T{
578 .PN KeyPress
579 T}      T{
580 .PN KeyRelease
581 T}
582 T{
583 .PN ButtonPress
584 T}      T{
585 .PN ButtonRelease
586 T}
587 T{
588 .PN MotionNotify
589 T}      T{
590 .PN EnterNotify
591 T}
592 T{
593 .PN LeaveNotify
594 T}      T{
595 .PN FocusIn
596 T}
597 T{
598 .PN FocusOut
599 T}      T{
600 .PN KeymapNotify
601 T}
602 T{
603 .PN Expose
604 T}      T{
605 .PN GraphicsExpose,
606 T}
607 T{
608 .PN NoExpose
609 T}      T{
610 .PN VisibilityNotify
611 T}
612 T{
613 .PN CreateNotify
614 T}      T{
615 .PN DestroyNotify
616 T}
617 T{
618 .PN UnmapNotify
619 T}      T{
620 .PN MapNotify
621 T}
622 T{
623 .PN MapRequest
624 T}      T{
625 .PN ReparentNotify
626 T}
627 T{
628 .PN ConfigureNotify
629 T}      T{
630 .PN ConfigureRequest
631 T}
632 T{
633 .PN GravityNotify
634 T}      T{
635 .PN ResizeRequest
636 T}
637 T{
638 .PN CirculateNotify
639 T}      T{
640 .PN CirculateRequest
641 T}
642 T{
643 .PN PropertyNotify
644 T}      T{
645 .PN SelectionClear
646 T}
647 T{
648 .PN SelectionRequest
649 T}      T{
650 .PN SelectionNotify
651 T}
652 T{
653 .PN ColormapNotify
654 T}      T{
655 .PN ClientMessage
656 T}
657 .TE
658 .LP
659
660 .SH
661 Examples
662 .LP
663 .IP \(bu 5
664 Always put more specific events in the table before more general ones:
665 .LP
666 .Ds
667 Shift <Btn1Down> : twas()\\n\\
668 <Btn1Down> : brillig()
669 .De
670 .LP
671 .IP \(bu 5
672 For double-click on Button1 Up with Shift, use this specification:
673 .IP
674 .Ds
675 Shift<Btn1Up>(2) : and()
676 .DE
677 .IP
678 This is equivalent to the following line with appropriate timers set 
679 between events:
680 .IP
681 .Ds
682 Shift<Btn1Down>,Shift<Btn1Up>,Shift<Btn1Down>,Shift<Btn1Up> : and()
683 .De
684 .IP \(bu 5
685 For double-click on Button1 Down with Shift, use this specification:
686 .IP
687 .Ds
688 Shift<Btn1Down>(2) : the()
689 .De
690 .IP
691 This is equivalent to the following line with appropriate timers set
692 between events:
693 .IP
694 .Ds
695 Shift<Btn1Down>,Shift<Btn1Up>,Shift<Btn1Down> : the()
696 .De
697 .IP \(bu 5
698 Mouse motion is always discarded when it occurs between events in a table
699 where no motion event is specified:
700 .IP
701 .Ds
702 <Btn1Down>,<Btn1Up> : slithy()
703 .De
704 .IP
705 This is taken, even if the pointer moves a bit between the down and
706 up events.
707 Similarly, any motion event specified in a translation matches any number
708 of motion events.
709 If the motion event causes an action procedure to be invoked,
710 the procedure is invoked after each motion event.
711 .IP \(bu 5
712 If an event sequence consists of a sequence of events that is also a
713 noninitial subsequence of another translation,
714 it is not taken if it occurs in the context of the longer sequence.
715 This occurs mostly in sequences like the following:
716 .IP
717 .Ds
718 <Btn1Down>,<Btn1Up> : toves()\\n\\
719 <Btn1Up> :  did()
720 .De
721 .IP
722 The second translation is taken only if the button release is not
723 preceded by a button press or if there are intervening events between the
724 press and the release.
725 Be particularly aware of this when using the repeat notation, above,
726 with buttons and keys,
727 because their expansion includes additional events;
728 and when specifying motion events, because they are implicitly included
729 between any two other events.
730 In particular,
731 pointer motion and double-click translations cannot coexist in the same
732 translation table.
733 .IP \(bu 5
734 For single click on Button1 Up with Shift and Meta, use this specification:
735 .IP
736 .Ds
737 Shift Meta <Btn1Down>, Shift Meta<Btn1Up>: gyre()
738 .De
739 .IP \(bu 5
740 For multiple clicks greater or equal to a minimum number,
741 a plus sign (+) may be appended to the final (rightmost)
742 count in an event sequence.  The actions will be invoked
743 on the \fIcount\fP-th click and each subsequent one arriving
744 within the multi-click time interval.  For example:
745 .IP
746 .Ds
747 Shift <Btn1Up>(2+) : and()
748 .De
749 .IP \(bu 5
750 To indicate 
751 .PN EnterNotify
752 with any modifiers, use this specification:
753 .IP
754 .Ds
755 <Enter> : gimble()
756 .De
757 .IP \(bu 5
758 To indicate 
759 .PN EnterNotify
760 with no modifiers, use this specification:
761 .IP
762 .Ds
763 None <Enter> : in()
764 .De
765 .IP \(bu 5
766 To indicate 
767 .PN EnterNotify 
768 with Button1 Down and Button2 Up and ``don't care'' about
769 the other modifiers, use this specification:
770 .IP
771 .Ds
772 Button1 ~Button2 <Enter> : the()
773 .De
774 .IP \(bu 5
775 To indicate 
776 .PN EnterNotify
777 with Button1 down and Button2 down exclusively, use this specification:
778 .IP
779 .Ds
780 ! Button1 Button2 <Enter> : wabe()
781 .De
782 .IP
783 You do not need to use a tilde (~) with an exclamation point (!).