aboutsummaryrefslogtreecommitdiff
path: root/libXt/specs/appB.xml
diff options
context:
space:
mode:
Diffstat (limited to 'libXt/specs/appB.xml')
-rw-r--r--libXt/specs/appB.xml1181
1 files changed, 1181 insertions, 0 deletions
diff --git a/libXt/specs/appB.xml b/libXt/specs/appB.xml
new file mode 100644
index 000000000..0afac11e0
--- /dev/null
+++ b/libXt/specs/appB.xml
@@ -0,0 +1,1181 @@
+<appendix id='Translation_Table_Syntax'>
+<title>Translation Table Syntax</title>
+<para><emphasis role='strong'>Notation</emphasis></para>
+
+<para>
+Syntax is specified in EBNF notation with the following conventions:
+</para>
+
+<informaltable frame='none'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colwidth='0.1*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <tbody>
+ <row>
+ <entry>[ a ]</entry>
+ <entry>Means either nothing or "a"</entry>
+ </row>
+ <row>
+ <entry>{ a }</entry>
+ <entry>Means zero or more occurrences of "a"</entry>
+ </row>
+ <row>
+ <entry>( a | b )</entry>
+ <entry>Means either "a" or "b"</entry>
+ </row>
+ <row>
+ <entry>\\n</entry>
+ <entry>Is the newline character</entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>
+All terminals are enclosed in double quotation marks (" ").
+Informal descriptions are enclosed in angle brackets (&lt; &gt;).
+Syntax
+</para>
+
+<para>The syntax of a translation table is</para>
+<informaltable frame='none'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colwidth='0.2*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <tbody>
+ <row>
+ <entry>translationTable</entry>
+ <entry>= [ directive ] { production }</entry>
+ </row>
+ <row>
+ <entry>directive</entry>
+ <entry>= ( "#replace" | "#override" | "#augment" ) "\\\\n"</entry>
+ </row>
+ <row>
+ <entry>production</entry>
+ <entry>= lhs ":" rhs "\\\\n"</entry>
+ </row>
+ <row>
+ <entry>lhs</entry>
+ <entry>= ( event | keyseq ) { "," (event | keyseq) }</entry>
+ </row>
+ <row>
+ <entry>keyseq</entry>
+ <entry>= """ keychar {keychar} """</entry>
+ </row>
+ <row>
+ <entry>keychar</entry>
+ <entry>= [ "^" | "$" | "\\\\" ] &lt;ISO Latin 1 character&gt;</entry>
+ </row>
+ <row>
+ <entry>event</entry>
+ <entry>= [modifier_list] "&lt;"event_type"&gt;" [ "(" count["+"] ")" ] {detail}</entry>
+ </row>
+ <row>
+ <entry>modifier_list</entry>
+ <entry>= ( ["!"] [":"] {modifier} ) | "None"</entry>
+ </row>
+ <row>
+ <entry>modifier</entry>
+ <entry>= ["~"] modifier_name</entry>
+ </row>
+ <row>
+ <entry>count</entry>
+ <entry>= ("1" | "2" | "3" | "4" | ...)</entry>
+ </row>
+ <row>
+ <entry>modifier_name</entry>
+ <entry>= "@" &lt;keysym&gt; | &lt;see ModifierNames table below&gt;</entry>
+ </row>
+ <row>
+ <entry>event_type</entry>
+ <entry>= &lt;see Event Types table below&gt;</entry>
+ </row>
+ <row>
+ <entry>detail</entry>
+ <entry>= &lt;event specific details&gt;</entry>
+ </row>
+ <row>
+ <entry>rhs</entry>
+ <entry>= { name "(" [params] ")" }</entry>
+ </row>
+ <row>
+ <entry>name</entry>
+ <entry>= namechar { namechar }</entry>
+ </row>
+ <row>
+ <entry>namechar</entry>
+ <entry>= { "a"-"z" | "A"-"Z" | "0"-"9" | "_" | "-" }</entry>
+ </row>
+ <row>
+ <entry>params</entry>
+ <entry>= string {"," string}</entry>
+ </row>
+ <row>
+ <entry>string</entry>
+ <entry>= quoted_string | unquoted_string</entry>
+ </row>
+ <row>
+ <entry>quoted_string</entry>
+ <entry>= <quote>"</quote> {&lt;Latin 1 character&gt; | escape_char} ["\\\\" ] <quote>"</quote></entry>
+ </row>
+ <row>
+ <entry>escape_char</entry>
+ <entry>= "\\""</entry>
+ </row>
+ <row>
+ <entry>unquoted_string</entry>
+ <entry>= {&lt;Latin 1 character except space, tab, ",", "\\n", ")"&gt;}</entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>
+The <emphasis remap='I'>params</emphasis> field is parsed into a list of
+<function>String</function>
+values that will be passed to the named action procedure. A
+<emphasis remap='I'>quoted string</emphasis> may contain an embedded quotation mark if the
+quotation mark is preceded by a single backslash (\). The
+three-character sequence "\\\"" is interpreted as "single backslash
+followed by end-of-string".
+</para>
+<para><emphasis role='strong'>Modifier Names</emphasis></para>
+
+<para>
+The modifier field is used to specify standard X keyboard and button
+modifier mask bits.
+Modifiers are legal on event types
+<function>KeyPress</function>,
+<function>KeyRelease</function>,
+<function>ButtonPress</function>,
+<function>ButtonRelease</function>,
+<function>MotionNotify</function>,
+<function>EnterNotify</function>,
+<function>LeaveNotify</function>,
+and their abbreviations.
+An error is generated when a translation table
+that contains modifiers for any other events is parsed.
+</para>
+
+<itemizedlist spacing='compact'>
+ <listitem>
+ <para>
+If the modifier list has no entries and is not "None",
+it means "don't care" on all modifiers.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If an exclamation point (!) is specified at the beginning
+of the modifier list,
+it means that the listed modifiers must be in the correct state
+and no other modifiers can be asserted.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If any modifiers are specified
+and an exclamation point (!) is not specified,
+it means that the listed modifiers must be in the
+correct state and "don't care" about any other modifiers.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If a modifier is preceded by a tilde (~),
+it means that that modifier must not be asserted.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If "None" is specified, it means no modifiers can be asserted.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If a colon (:) is specified at the beginning of the modifier list,
+it directs the Intrinsics to apply any standard modifiers in the
+event to map the event keycode into a KeySym.
+The default standard modifiers are Shift and Lock,
+with the interpretation as defined in <emphasis remap='I'>X Window
+System Protocol</emphasis>, Section 5.
+The resulting KeySym must exactly match the specified
+KeySym, and the nonstandard modifiers in the event must match the
+modifier list.
+For example, ":&lt;Key&gt;a" is distinct from ":&lt;Key&gt;A",
+and ":Shift&lt;Key&gt;A" is distinct from ":&lt;Key&gt;A".
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If both an exclamation point (!) and a colon (:) are specified at
+the beginning of the modifier list, it means that the listed
+modifiers must be in the correct state and that no other modifiers
+except the standard modifiers can be asserted. Any standard
+modifiers in the event are applied as for colon (:) above.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If a colon (:) is not specified,
+no standard modifiers are applied.
+Then, for example, "&lt;Key&gt;A" and "&lt;Key&gt;a" are equivalent.
+ </para>
+ </listitem>
+</itemizedlist>
+
+<para>
+In key sequences,
+a circumflex (^) is an abbreviation for the Control modifier,
+a dollar sign ($) is an abbreviation for Meta,
+and a backslash (\) can be used to quote any
+character, in particular a double quote ("), a circumflex (^),
+a dollar sign ($), and another backslash (\).
+Briefly:
+</para>
+
+<literallayout >
+No modifiers: None &lt;event&gt; detail
+Any modifiers: &lt;event&gt; detail
+Only these modifiers: ! mod1 mod2 &lt;event&gt; detail
+These modifiers and any others: mod1 mod2 &lt;event&gt; detail
+</literallayout>
+
+<para>
+The use of "None" for a modifier list is identical to the use
+of an exclamation point with no modifers.
+</para>
+
+<informaltable frame='topbot'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+ <colspec colwidth='1.0*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <colspec colwidth='1.0*' colname='c3'/>
+ <thead>
+ <row rowsep='1'>
+ <entry>Modifier</entry>
+ <entry>Abbreviation</entry>
+ <entry>Meaning</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Ctrl</entry>
+ <entry>c</entry>
+ <entry>Control modifier bit</entry>
+ </row>
+ <row>
+ <entry>Shift</entry>
+ <entry>s</entry>
+ <entry>Shift modifier bit</entry>
+ </row>
+ <row>
+ <entry>Lock</entry>
+ <entry>l</entry>
+ <entry>Lock modifier bit</entry>
+ </row>
+ <row>
+ <entry>Meta</entry>
+ <entry>m</entry>
+ <entry>Meta key modifier</entry>
+ </row>
+ <row>
+ <entry>Hyper</entry>
+ <entry>h</entry>
+ <entry>Hyper key modifier</entry>
+ </row>
+ <row>
+ <entry>Super</entry>
+ <entry>su</entry>
+ <entry>Super key modifier</entry>
+ </row>
+ <row>
+ <entry>Alt</entry>
+ <entry>a</entry>
+ <entry>Alt key modifier</entry>
+ </row>
+ <row>
+ <entry>Mod1</entry>
+ <entry></entry>
+ <entry>Mod1 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Mod2</entry>
+ <entry></entry>
+ <entry>Mod2 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Mod3</entry>
+ <entry></entry>
+ <entry>Mod3 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Mod4</entry>
+ <entry></entry>
+ <entry>Mod4 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Mod5</entry>
+ <entry></entry>
+ <entry>Mod5 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Button1</entry>
+ <entry></entry>
+ <entry>Button1 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Button2</entry>
+ <entry></entry>
+ <entry>Button2 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Button3</entry>
+ <entry></entry>
+ <entry>Button3 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Button4</entry>
+ <entry></entry>
+ <entry>Button4 modifier bit</entry>
+ </row>
+ <row>
+ <entry>Button5</entry>
+ <entry></entry>
+ <entry>Button5 modifier bit</entry>
+ </row>
+ <row>
+ <entry>None</entry>
+ <entry></entry>
+ <entry>No modifiers</entry>
+ </row>
+ <row>
+ <entry>Any</entry>
+ <entry></entry>
+ <entry>Any modifier combination</entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>
+A key modifier is any modifier bit one of whose corresponding KeyCodes
+contains the corresponding left or right KeySym.
+For example,
+"m" or "Meta" means any modifier bit mapping to a KeyCode
+whose KeySym list contains XK_Meta_L or XK_Meta_R.
+Note that this interpretation is for each display,
+not global or even for each application context.
+The Control, Shift, and Lock modifier names refer
+explicitly to the corresponding modifier bits;
+there is no additional interpretation of KeySyms for these modifiers.
+</para>
+
+<para>
+Because it is possible to associate arbitrary KeySyms with modifiers, the set of
+key modifiers is extensible. The "@" &lt;keysym&gt; syntax means any
+modifier bit whose corresponding KeyCode contains the specified KeySym name.
+</para>
+
+<para>
+A modifier_list/KeySym combination in a translation matches a
+modifiers/KeyCode combination in an event in the following ways:
+</para>
+
+<orderedlist>
+ <listitem>
+ <para>
+If a colon (:) is used, the Intrinsics call the display's
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>
+with the KeyCode and modifiers.
+To match, (<emphasis remap='I'>modifiers</emphasis> &amp; ~<emphasis remap='I'>modifiers_return</emphasis>) must equal <emphasis remap='I'>modifier_list</emphasis>, and
+<emphasis remap='I'>keysym_return</emphasis> must equal the given KeySym.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If (:) is not used, the Intrinsics mask off all don't-care bits from the
+modifiers.
+This value must be equal to <emphasis remap='I'>modifier_list</emphasis>.
+Then, for each possible combination of
+don't-care modifiers in the modifier list, the Intrinsics call the display's
+<xref linkend='XtKeyProc' xrefstyle='select: title'/>
+with the KeyCode and that combination ORed with the cared-about modifier bits
+from the event.
+<emphasis remap='I'>Keysym_return</emphasis> must match the KeySym in the translation.
+ </para>
+ </listitem>
+</orderedlist>
+
+<para><emphasis role='strong'>Event Types</emphasis></para>
+
+<para>
+The event-type field describes XEvent types.
+In addition to the standard
+Xlib symbolic event type names, the following event type synonyms
+are defined:
+</para>
+
+<informaltable frame='topbot'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colwidth='1.0*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <thead>
+ <row rowsep='1'>
+ <entry>Type</entry>
+ <entry>Meaning</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Key</entry>
+ <entry><function>KeyPress</function></entry>
+ </row>
+ <row>
+ <entry>KeyDown</entry>
+ <entry><function>KeyPress</function></entry>
+ </row>
+ <row>
+ <entry>KeyUp</entry>
+ <entry><function>KeyRelease</function></entry>
+ </row>
+ <row>
+ <entry>BtnDown</entry>
+ <entry><function>ButtonPress</function></entry>
+ </row>
+ <row>
+ <entry>BtnUp</entry>
+ <entry><function>ButtonRelease</function></entry>
+ </row>
+ <row>
+ <entry>Motion</entry>
+ <entry><function>MotionNotify</function></entry>
+ </row>
+ <row>
+ <entry>PtrMoved</entry>
+ <entry><function>MotionNotify</function></entry>
+ </row>
+ <row>
+ <entry>MouseMoved</entry>
+ <entry><function>MotionNotify</function></entry>
+ </row>
+ <row>
+ <entry>Enter</entry>
+ <entry><function>EnterNotify</function></entry>
+ </row>
+ <row>
+ <entry>EnterWindow</entry>
+ <entry><function>EnterNotify</function></entry>
+ </row>
+ <row>
+ <entry>Leave</entry>
+ <entry><function>LeaveNotify</function></entry>
+ </row>
+ <row>
+ <entry>LeaveWindow</entry>
+ <entry><function>LeaveNotify</function></entry>
+ </row>
+ <row>
+ <entry>FocusIn</entry>
+ <entry><function>FocusIn</function></entry>
+ </row>
+ <row>
+ <entry>FocusOut</entry>
+ <entry><function>FocusOut</function></entry>
+ </row>
+ <row>
+ <entry>Keymap</entry>
+ <entry><function>KeymapNotify</function></entry>
+ </row>
+ <row>
+ <entry>Expose</entry>
+ <entry><function>Expose</function></entry>
+ </row>
+ <row>
+ <entry>GrExp</entry>
+ <entry><function>GraphicsExpose</function></entry>
+ </row>
+ <row>
+ <entry>NoExp</entry>
+ <entry><function>NoExpose</function></entry>
+ </row>
+ <row>
+ <entry>Visible</entry>
+ <entry><function>VisibilityNotify</function></entry>
+ </row>
+ <row>
+ <entry>Create</entry>
+ <entry><function>CreateNotify</function></entry>
+ </row>
+ <row>
+ <entry>Destroy</entry>
+ <entry><function>DestroyNotify</function></entry>
+ </row>
+ <row>
+ <entry>Unmap</entry>
+ <entry><function>UnmapNotify</function></entry>
+ </row>
+ <row>
+ <entry>Map</entry>
+ <entry><function>MapNotify</function></entry>
+ </row>
+ <row>
+ <entry>MapReq</entry>
+ <entry><function>MapRequest</function></entry>
+ </row>
+ <row>
+ <entry>Reparent</entry>
+ <entry><function>ReparentNotify</function></entry>
+ </row>
+ <row>
+ <entry>Configure</entry>
+ <entry><function>ConfigureNotify</function></entry>
+ </row>
+ <row>
+ <entry>ConfigureReq</entry>
+ <entry><function>ConfigureRequest</function></entry>
+ </row>
+ <row>
+ <entry>Grav</entry>
+ <entry><function>GravityNotify</function></entry>
+ </row>
+ <row>
+ <entry>ResReq</entry>
+ <entry><function>ResizeRequest</function></entry>
+ </row>
+ <row>
+ <entry>Circ</entry>
+ <entry><function>CirculateNotify</function></entry>
+ </row>
+ <row>
+ <entry>CircReq</entry>
+ <entry><function>CirculateRequest</function></entry>
+ </row>
+ <row>
+ <entry>Prop</entry>
+ <entry><function>PropertyNotify</function></entry>
+ </row>
+ <row>
+ <entry>SelClr</entry>
+ <entry><function>SelectionClear</function></entry>
+ </row>
+ <row>
+ <entry>SelReq</entry>
+ <entry><function>SelectionRequest</function></entry>
+ </row>
+ <row>
+ <entry>Select</entry>
+ <entry><function>SelectionNotify</function></entry>
+ </row>
+ <row>
+ <entry>Clrmap</entry>
+ <entry><function>ColormapNotify</function></entry>
+ </row>
+ <row>
+ <entry>Message</entry>
+ <entry><function>ClientMessage</function></entry>
+ </row>
+ <row>
+ <entry>Mapping</entry>
+ <entry><function>MappingNotify</function></entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>The supported abbreviations are:</para>
+
+<informaltable frame='topbot'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='3' align='left' rowsep='0' colsep='0'>
+ <colspec colwidth='1.0*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <colspec colwidth='1.0*' colname='c3'/>
+ <thead>
+ <row rowsep='1'>
+ <entry>Abbreviation</entry>
+ <entry>Event Type</entry>
+ <entry>Including</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Ctrl</entry>
+ <entry><function>KeyPress</function></entry>
+ <entry>with Control modifier</entry>
+ </row>
+ <row>
+ <entry>Meta</entry>
+ <entry><function>KeyPress</function></entry>
+ <entry>with Meta modifier</entry>
+ </row>
+ <row>
+ <entry>Shift</entry>
+ <entry><function>KeyPress</function></entry>
+ <entry>with Shift modifier</entry>
+ </row>
+ <row>
+ <entry>Btn1Down</entry>
+ <entry><function>ButtonPress</function></entry>
+ <entry>with Button1 detail</entry>
+ </row>
+ <row>
+ <entry>Btn1Up</entry>
+ <entry><function>ButtonRelease</function></entry>
+ <entry>with Button1 detail</entry>
+ </row>
+ <row>
+ <entry>Btn2Down</entry>
+ <entry><function>ButtonPress</function></entry>
+ <entry>with Button2 detail</entry>
+ </row>
+ <row>
+ <entry>Btn2Up</entry>
+ <entry><function>ButtonRelease</function></entry>
+ <entry>with Button2 detail</entry>
+ </row>
+ <row>
+ <entry>Btn3Down</entry>
+ <entry><function>ButtonPress</function></entry>
+ <entry>with Button3 detail</entry>
+ </row>
+ <row>
+ <entry>Btn3Up</entry>
+ <entry><function>ButtonRelease</function></entry>
+ <entry>with Button3 detail</entry>
+ </row>
+ <row>
+ <entry>Btn4Down</entry>
+ <entry><function>ButtonPress</function></entry>
+ <entry>with Button4 detail</entry>
+ </row>
+ <row>
+ <entry>Btn4Up</entry>
+ <entry><function>ButtonRelease</function></entry>
+ <entry>with Button4 detail</entry>
+ </row>
+ <row>
+ <entry>Btn5Down</entry>
+ <entry><function>ButtonPress</function></entry>
+ <entry>with Button5 detail</entry>
+ </row>
+ <row>
+ <entry>Btn5Up</entry>
+ <entry><function>ButtonRelease</function></entry>
+ <entry>with Button5 detail</entry>
+ </row>
+ <row>
+ <entry>BtnMotion</entry>
+ <entry><function>MotionNotify</function></entry>
+ <entry>with any button modifier</entry>
+ </row>
+ <row>
+ <entry>Btn1Motion</entry>
+ <entry><function>MotionNotify</function></entry>
+ <entry>with Button1 modifier</entry>
+ </row>
+ <row>
+ <entry>Btn2Motion</entry>
+ <entry><function>MotionNotify</function></entry>
+ <entry>with Button2 modifier</entry>
+ </row>
+ <row>
+ <entry>Btn3Motion</entry>
+ <entry><function>MotionNotify</function></entry>
+ <entry>with Button3 modifier</entry>
+ </row>
+ <row>
+ <entry>Btn4Motion</entry>
+ <entry><function>MotionNotify</function></entry>
+ <entry>with Button4 modifier</entry>
+ </row>
+ <row>
+ <entry>Btn5Motion</entry>
+ <entry><function>MotionNotify</function></entry>
+ <entry>with Button5 modifier</entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>
+The detail field is event-specific and normally corresponds to the
+detail field of the corresponding event as described
+by <emphasis remap='I'>X Window System Protocol</emphasis>, Section 11.
+The detail field is supported for the following event types:
+</para>
+
+<informaltable frame='none'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='2' align='left' rowsep='0' colsep='0'>
+ <colspec colwidth='0.5*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <tbody>
+ <row>
+ <entry>KeyPress</entry>
+ <entry>KeySym from event <emphasis>detail</emphasis> (keycode)</entry>
+ </row>
+ <row>
+ <entry>KeyRelease</entry>
+ <entry>KeySym from event <emphasis>detail</emphasis> (keycode)</entry>
+ </row>
+ <row>
+ <entry>ButtonPress</entry>
+ <entry>button from event <emphasis>detail</emphasis></entry>
+ </row>
+ <row>
+ <entry>ButtonRelease</entry>
+ <entry>button from event <emphasis>detail</emphasis></entry>
+ </row>
+ <row>
+ <entry>MotionNotify</entry>
+ <entry>event <emphasis>detail</emphasis></entry>
+ </row>
+ <row>
+ <entry>EnterNotify</entry>
+ <entry>event <emphasis>mode</emphasis></entry>
+ </row>
+ <row>
+ <entry>LeaveNotify</entry>
+ <entry>event <emphasis>mode</emphasis></entry>
+ </row>
+ <row>
+ <entry>FocusIn</entry>
+ <entry>event <emphasis>mode</emphasis></entry>
+ </row>
+ <row>
+ <entry>FocusOut</entry>
+ <entry>event <emphasis>mode</emphasis></entry>
+ </row>
+ <row>
+ <entry>PropertyNotify</entry>
+ <entry><emphasis>atom</emphasis></entry>
+ </row>
+ <row>
+ <entry>SelectionClear</entry>
+ <entry><emphasis>selection</emphasis></entry>
+ </row>
+ <row>
+ <entry>SelectionRequest</entry>
+ <entry><emphasis>selection</emphasis></entry>
+ </row>
+ <row>
+ <entry>SelectionNotify</entry>
+ <entry><emphasis>selection</emphasis></entry>
+ </row>
+ <row>
+ <entry>ClientMessage</entry>
+ <entry><emphasis>type</emphasis></entry>
+ </row>
+ <row>
+ <entry>MappingNotify</entry>
+ <entry><emphasis>request</emphasis></entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>
+If the event type is
+<function>KeyPress</function>
+or
+<function>KeyRelease</function>,
+the detail field
+specifies a KeySym name in standard format which is matched against
+the event as described above, for example, &lt;Key&gt;A.
+</para>
+
+<para>
+For the
+<function>PropertyNotify</function>,
+<function>SelectionClear</function>,
+<function>SelectionRequest</function>,
+<function>SelectionNotify</function>,
+and
+<function>ClientMessage</function>
+events the detail field is specified
+as an atom name; for example, &lt;Message&gt;WM_PROTOCOLS. For the
+<function>MotionNotify</function>,
+<function>EnterNotify</function>,
+<function>LeaveNotify</function>,
+<function>FocusIn</function>,
+<function>FocusOut</function>,
+and
+<function>MappingNotify</function>
+events, either the symbolic constants as defined by
+<emphasis remap='I'>X Window
+System Protocol</emphasis>, Section 11,
+or the numeric values may be specified.
+</para>
+
+<para>
+If no detail field is specified, then any value in the event detail is
+accepted as a match.
+</para>
+
+<para>
+A KeySym can be specified as any of the standard KeySym names,
+a hexadecimal number prefixed with "0x" or "0X",
+an octal number prefixed with "0", or a decimal number.
+A KeySym expressed as a single digit is interpreted as the
+corresponding Latin 1 KeySym, for example, "0" is the KeySym XK_0.
+Other single character KeySyms are treated as literal constants from Latin 1,
+for example, "!" is treated as 0x21.
+Standard KeySym names are as defined in
+<function>&lt;X11/keysymdef.h&gt;</function>
+with the "XK_" prefix removed.
+</para>
+
+<para><emphasis role='strong'>Canonical Representation</emphasis></para>
+
+<para>
+Every translation table has a unique, canonical text representation. This
+representation is passed to a widget's
+<function>display_accelerator</function>
+procedure to describe the accelerators installed on that widget.
+The canonical representation of a translation table is (see also
+"Syntax")
+</para>
+
+<informaltable frame='none'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colwidth='0.2*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <tbody>
+ <row>
+ <entry>translationTable</entry>
+ <entry>= { production }
+ </entry>
+ </row>
+ <row>
+ <entry>production</entry>
+ <entry>= lhs ":" rhs "\\n"
+ </entry>
+ </row>
+ <row>
+ <entry>lhs</entry>
+ <entry>=event { "," event }
+ </entry>
+ </row>
+ <row>
+ <entry>event</entry>
+ <entry>=[modifier_list] "&lt;"event_type"&gt;" [ "(" count["+"] ")" ] {detail}
+ </entry>
+ </row>
+ <row>
+ <entry>modifier_list</entry>
+ <entry>= ["!"] [":"] {modifier}
+ </entry>
+ </row>
+ <row>
+ <entry>modifier</entry>
+ <entry>= ["˜"] modifier_name
+ </entry>
+ </row>
+ <row>
+ <entry>count</entry>
+ <entry>=("1" | "2" | "3" | "4" | ...)
+ </entry>
+ </row>
+ <row>
+ <entry>modifier_name</entry>
+ <entry>= "@" &lt;keysym&gt; | &lt;see canonical modifier names below&gt;
+ </entry>
+ </row>
+ <row>
+ <entry>event_type</entry>
+ <entry>= &lt;see canonical event types below&gt;
+ </entry>
+ </row>
+ <row>
+ <entry>detail</entry>
+ <entry>=&lt;event-specific details&gt;
+ </entry>
+ </row>
+ <row>
+ <entry>rhs</entry>
+ <entry>={ name "(" [params] ")" }
+ </entry>
+ </row>
+ <row>
+ <entry>name</entry>
+ <entry>=namechar { namechar }
+ </entry>
+ </row>
+ <row>
+ <entry>namechar</entry>
+ <entry>= { "a"-"z" | "A"-"Z" | "0"-"9" | "_" | "-" }
+ </entry>
+ </row>
+ <row>
+ <entry>params</entry>
+ <entry>=string {"," string}
+ </entry>
+ </row>
+ <row>
+ <entry>string</entry>
+ <entry>=quoted_string
+ </entry>
+ </row>
+ <row>
+ <entry>quoted_string</entry>
+ <entry>= <quote>"</quote> {&lt;Latin 1 character&gt; | escape_char} ["\\\\" ] <quote>"</quote>
+ </entry>
+ </row>
+ <row>
+ <entry>escape_char</entry>
+ <entry>= "\\""
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para>The canonical modifier names are</para>
+
+<literallayout >
+ Ctrl Mod1 Button1
+ Shift Mod2 Button2
+ Lock Mod3 Button3
+ Mod4 Button4
+ Mod5 Button5
+</literallayout>
+
+<para>The canonical event types are</para>
+
+<informaltable frame='none'>
+ <?dbfo keep-together="auto" ?>
+ <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+ <colspec colwidth='1.0*' colname='c1'/>
+ <colspec colwidth='1.0*' colname='c2'/>
+ <tbody>
+ <row>
+ <entry>KeyPress</entry>
+ <entry>KeyRelease</entry>
+ </row>
+ <row>
+ <entry>ButtonPress</entry>
+ <entry>ButtonRelease</entry>
+ </row>
+ <row>
+ <entry>MotionNotify</entry>
+ <entry>EnterNotify</entry>
+ </row>
+ <row>
+ <entry>LeaveNotify</entry>
+ <entry>FocusIn</entry>
+ </row>
+ <row>
+ <entry>FocusOut</entry>
+ <entry>KeymapNotify</entry>
+ </row>
+ <row>
+ <entry>Expose</entry>
+ <entry>GraphicsExpose,</entry>
+ </row>
+ <row>
+ <entry>NoExpose</entry>
+ <entry>VisibilityNotify</entry>
+ </row>
+ <row>
+ <entry>CreateNotify</entry>
+ <entry>DestroyNotify</entry>
+ </row>
+ <row>
+ <entry>UnmapNotify</entry>
+ <entry>MapNotify</entry>
+ </row>
+ <row>
+ <entry>MapRequest</entry>
+ <entry>ReparentNotify</entry>
+ </row>
+ <row>
+ <entry>ConfigureNotify</entry>
+ <entry>ConfigureRequest</entry>
+ </row>
+ <row>
+ <entry>GravityNotify</entry>
+ <entry>ResizeRequest</entry>
+ </row>
+ <row>
+ <entry>CirculateNotify</entry>
+ <entry>CirculateRequest</entry>
+ </row>
+ <row>
+ <entry>PropertyNotify</entry>
+ <entry>SelectionClear</entry>
+ </row>
+ <row>
+ <entry>SelectionRequest</entry>
+ <entry>SelectionNotify</entry>
+ </row>
+ <row>
+ <entry>ColormapNotify</entry>
+ <entry>ClientMessage</entry>
+ </row>
+ </tbody>
+ </tgroup>
+</informaltable>
+
+<para><emphasis role='strong'>Examples</emphasis></para>
+
+<itemizedlist spacing='compact'>
+ <listitem>
+ <para>
+Always put more specific events in the table before more general ones:
+ </para>
+<literallayout >
+ Shift &lt;Btn1Down&gt; : twas()\n\
+ &lt;Btn1Down&gt; : brillig()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+For double-click on Button1 Up with Shift, use this specification:
+ </para>
+ <literallayout >
+Shift&lt;Btn1Up&gt;(2) : and()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+This is equivalent to the following line with appropriate timers set
+between events:
+ </para>
+ <literallayout >
+Shift&lt;Btn1Down&gt;,Shift&lt;Btn1Up&gt;,Shift&lt;Btn1Down&gt;,Shift&lt;Btn1Up&gt; : and()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+For double-click on Button1 Down with Shift, use this specification:
+ </para>
+ <literallayout >
+Shift&lt;Btn1Down&gt;(2) : the()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+This is equivalent to the following line with appropriate timers set
+between events:
+ </para>
+ <literallayout >
+Shift&lt;Btn1Down&gt;,Shift&lt;Btn1Up&gt;,Shift&lt;Btn1Down&gt; : the()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+Mouse motion is always discarded when it occurs between events in a table
+where no motion event is specified:
+ </para>
+ <literallayout >
+&lt;Btn1Down&gt;,&lt;Btn1Up&gt; : slithy()
+</literallayout>
+ <para>
+This is taken, even if the pointer moves a bit between the down and
+up events.
+Similarly, any motion event specified in a translation matches any number
+of motion events.
+If the motion event causes an action procedure to be invoked,
+the procedure is invoked after each motion event.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If an event sequence consists of a sequence of events that is also a
+noninitial subsequence of another translation,
+it is not taken if it occurs in the context of the longer sequence.
+This occurs mostly in sequences like the following:
+ </para>
+ <literallayout >
+&lt;Btn1Down&gt;,&lt;Btn1Up&gt; : toves()\n\
+&lt;Btn1Up&gt; : did()
+</literallayout>
+ <para>
+The second translation is taken only if the button release is not
+preceded by a button press or if there are intervening events between the
+press and the release.
+Be particularly aware of this when using the repeat notation, above,
+with buttons and keys,
+because their expansion includes additional events;
+and when specifying motion events, because they are implicitly included
+between any two other events.
+In particular,
+pointer motion and double-click translations cannot coexist in the same
+translation table.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+For single click on Button1 Up with Shift and Meta, use this specification:
+ </para>
+ </listitem>
+ <listitem>
+ <literallayout >
+Shift Meta &lt;Btn1Down&gt;, Shift Meta&lt;Btn1Up&gt;: gyre()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+For multiple clicks greater or equal to a minimum number,
+a plus sign (+) may be appended to the final (rightmost)
+count in an event sequence. The actions will be invoked
+on the <emphasis remap='I'>count</emphasis>-th click and each subsequent one arriving
+within the multi-click time interval. For example:
+ </para>
+ <literallayout >
+Shift &lt;Btn1Up&gt;(2+) : and()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+To indicate
+<function>EnterNotify</function>
+with any modifiers, use this specification:
+ </para>
+ <literallayout >
+&lt;Enter&gt; : gimble()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+To indicate
+<function>EnterNotify</function>
+with no modifiers, use this specification:
+ </para>
+ <literallayout >
+None &lt;Enter&gt; : in()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+To indicate
+<function>EnterNotify</function>
+with Button1 Down and Button2 Up and "don't care" about
+the other modifiers, use this specification:
+ </para>
+ <literallayout >
+Button1 ~Button2 &lt;Enter&gt; : the()
+</literallayout>
+ </listitem>
+ <listitem>
+ <para>
+To indicate
+<function>EnterNotify</function>
+with Button1 down and Button2 down exclusively, use this specification:
+ </para>
+ <literallayout >
+! Button1 Button2 &lt;Enter&gt; : wabe()
+</literallayout>
+ <para>
+You do not need to use a tilde (~) with an exclamation point (!).
+ </para>
+ </listitem>
+</itemizedlist>
+</appendix>