ch12.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='interpreting_key_events'>
2e9fcaa8aSmrg<title>Interpreting Key Events</title>
3e9fcaa8aSmrg
4e9fcaa8aSmrg<para>
5e9fcaa8aSmrgXkb provides functions to help developers interpret key events without having
6e9fcaa8aSmrgto directly interpret Xkb data structures. Xkb also modifies the behavior of
7e9fcaa8aSmrgseveral core X library functions.
8e9fcaa8aSmrg</para>
9e9fcaa8aSmrg
10e9fcaa8aSmrg<sect1 id='effects_of_xkb_on_the_core_x_library'>
11e9fcaa8aSmrg<title>Effects of Xkb on the Core X Library</title>
12e9fcaa8aSmrg
13e9fcaa8aSmrg<para>
14e9fcaa8aSmrgWhen support for Xkb is built into the X library, the <emphasis>
15e9fcaa8aSmrgXOpenDisplay</emphasis>
16e9fcaa8aSmrg function looks for a compatible version of Xkb on the server. If it finds a
17e9fcaa8aSmrgcompatible version, it initializes the extension and enables <emphasis>
18e9fcaa8aSmrgimplicit support</emphasis>
19e9fcaa8aSmrg for Xkb in a number of X library functions. This makes it possible for clients
20e9fcaa8aSmrgto take advantage of nearly all Xkb features without having to be rewritten or
21e9fcaa8aSmrgeven recompiled, if they are built with shared libraries. This implicit support
22e9fcaa8aSmrgis invisible to most clients, but it can have side effects, so the extension
23e9fcaa8aSmrgincludes ways to control or disable it.
24e9fcaa8aSmrg</para>
25e9fcaa8aSmrg
26e9fcaa8aSmrg
27e9fcaa8aSmrg<sect2 id='effects_of_xkb_on_event_state'>
28e9fcaa8aSmrg<title>Effects of Xkb on Event State</title>
29e9fcaa8aSmrg
30e9fcaa8aSmrg<para>
31e9fcaa8aSmrgBecause <emphasis>
32e9fcaa8aSmrgXOpenDisplay</emphasis>
33e9fcaa8aSmrg initializes Xkb, some events contain an Xkb description of the keyboard state
34e9fcaa8aSmrginstead of that normally used by the core protocol. See section 17.1.1 for more
35e9fcaa8aSmrginformation about the differences between Xkb keyboard state and that reported
36e9fcaa8aSmrgby the core protocol.
37e9fcaa8aSmrg</para>
38e9fcaa8aSmrg
39e9fcaa8aSmrg
40e9fcaa8aSmrg</sect2>
41e9fcaa8aSmrg<sect2 id='effects_of_xkb_on_mappingnotify_events'>
42e9fcaa8aSmrg<title>Effects of Xkb on MappingNotify Events</title>
43e9fcaa8aSmrg
44e9fcaa8aSmrg<para>
45e9fcaa8aSmrgWhen Xkb is missing or disabled, the X library tracks changes to the keyboard
46e9fcaa8aSmrgmapping using <emphasis>
47e9fcaa8aSmrgMappingNotify</emphasis>
48e9fcaa8aSmrg events. Whenever the keyboard mapping is changed, the server sends all clients
49e9fcaa8aSmrga <emphasis>
50e9fcaa8aSmrgMappingNotify</emphasis>
51e9fcaa8aSmrg event to report the change. When a client receives a <emphasis>
52e9fcaa8aSmrgMappingNotify</emphasis>
53e9fcaa8aSmrg event, it is supposed to call <emphasis>
54e9fcaa8aSmrgXRefreshKeyboardMapping</emphasis>
55e9fcaa8aSmrg to update the keyboard description used internally by the X library.
56e9fcaa8aSmrg</para>
57e9fcaa8aSmrg
58e9fcaa8aSmrg
59e9fcaa8aSmrg<para>
60e9fcaa8aSmrgThe X Keyboard Extension uses <emphasis>
61e9fcaa8aSmrgXkbMapNotify</emphasis>
62e9fcaa8aSmrg and <emphasis>
63e9fcaa8aSmrgXkbNewKeyboardNotify</emphasis>
64e9fcaa8aSmrg events to track changes to the keyboard mapping. When an Xkb-aware client
65e9fcaa8aSmrgreceives either event, it should call <emphasis>
66e9fcaa8aSmrgXkbRefreshKeyboardMapping</emphasis>
67e9fcaa8aSmrg to update the keyboard description used internally by the X library. To avoid
68e9fcaa8aSmrgduplicate events, the X server does not send core protocol <emphasis>
69e9fcaa8aSmrgMappingNotify</emphasis>
70e9fcaa8aSmrg events to a client that has selected for <emphasis>
71e9fcaa8aSmrgXkbMapNotify</emphasis>
72e9fcaa8aSmrg events.
73e9fcaa8aSmrg</para>
74e9fcaa8aSmrg
75e9fcaa8aSmrg
76e9fcaa8aSmrg<para>
77e9fcaa8aSmrgThe implicit support for Xkb selects for <emphasis>
78e9fcaa8aSmrgXkbMapNotify</emphasis>
79e9fcaa8aSmrg events. This means that clients that do not explicitly use Xkb but that are
80e9fcaa8aSmrgusing a version of the X library that has implicit support for Xkb do not
81e9fcaa8aSmrgreceive <emphasis>
82e9fcaa8aSmrgMappingNotify</emphasis>
83e9fcaa8aSmrg events over the wire. Clients that were not written with Xkb in mind do not
84e9fcaa8aSmrgrecognize or properly handle the new Xkb events, so the implicit support
85e9fcaa8aSmrgconverts them to <emphasis>
86e9fcaa8aSmrgMappingNotify</emphasis>
87e9fcaa8aSmrg events that report approximately the same information, unless the client has
88e9fcaa8aSmrgexplicitly selected for the Xkb version of the event.
89e9fcaa8aSmrg</para>
90e9fcaa8aSmrg
91e9fcaa8aSmrg
92e9fcaa8aSmrg<para>
93e9fcaa8aSmrgAn Xkb-capable X server does not send events from keys that fall outside the
94e9fcaa8aSmrglegal range of keycodes expected by that client. Once the server sends a client
95e9fcaa8aSmrgan <emphasis>
96e9fcaa8aSmrgXkbNewKeyboardNotify</emphasis>
97e9fcaa8aSmrg event, it reports events from all keys because it assumes that any client that
98e9fcaa8aSmrghas receieved an <emphasis>
99e9fcaa8aSmrgXkbNewKeyboardNotify</emphasis>
100e9fcaa8aSmrg event expects key events from the new range of keycodes. The implicit support
101e9fcaa8aSmrgfor Xkb asks for <emphasis>
102e9fcaa8aSmrgXkbNewKeyboardNotify</emphasis>
103e9fcaa8aSmrg events, so the range of keycodes reported to the client might vary without the
104e9fcaa8aSmrgclient’s knowledge. Most clients don’t really care about the range of legal
105e9fcaa8aSmrgkeycodes, but some clients maintain information about each key and might have
106e9fcaa8aSmrgproblems with events that come from unexpected keys. Such clients can set the
107e9fcaa8aSmrg<emphasis>
108e9fcaa8aSmrgXkbLC_IgnoreNewKeyboards</emphasis>
109e9fcaa8aSmrg library control (see section 11.3.1) to prevent the implicit support from
110e9fcaa8aSmrgrequesting notification of changes to the legal range of keycodes.
111e9fcaa8aSmrg</para>
112e9fcaa8aSmrg
113e9fcaa8aSmrg
114e9fcaa8aSmrg</sect2>
115e9fcaa8aSmrg<sect2 id='x_library_functions_affected_by_xkb'>
116e9fcaa8aSmrg<title>X Library Functions Affected by Xkb</title>
117e9fcaa8aSmrg
118e9fcaa8aSmrg<para>
119e9fcaa8aSmrgThe following X library functions are modified by Xkb:
120e9fcaa8aSmrg</para>
121e9fcaa8aSmrg
122e9fcaa8aSmrg<para><programlisting>
123e9fcaa8aSmrg     <emphasis>XKeycodeToKeysym</emphasis>
124e9fcaa8aSmrg     <emphasis>XKeysymToKeycode</emphasis>
125e9fcaa8aSmrg     <emphasis>XLookupKeysym</emphasis>
126e9fcaa8aSmrg     <emphasis>XLookupString</emphasis>
127e9fcaa8aSmrg     <emphasis>XRefreshKeyboardMapping</emphasis>
128e9fcaa8aSmrg     <emphasis>XRebindKeysym</emphasis>
129e9fcaa8aSmrg</programlisting></para>
130e9fcaa8aSmrg
131e9fcaa8aSmrg<para>
132e9fcaa8aSmrgThe implicit support for Xkb replaces a number of X library functions with
133e9fcaa8aSmrgversions that understand and use the X Keyboard Extension. In most cases, the
134e9fcaa8aSmrgsemantics of the new versions are identical to those of the old, but there are
135e9fcaa8aSmrgoccasional visible differences. This section lists all of the functions that
136e9fcaa8aSmrgare affected and the differences in behavior, if any, that are visible to
137e9fcaa8aSmrgclients.
138e9fcaa8aSmrg</para>
139e9fcaa8aSmrg
140e9fcaa8aSmrg
141e9fcaa8aSmrg<para>
142e9fcaa8aSmrgThe <emphasis>
143e9fcaa8aSmrgXKeycodeToKeysym</emphasis>
144e9fcaa8aSmrg function reports the keysym associated with a particular index for a single
145e9fcaa8aSmrgkey. The index specifies a column of symbols in the core keyboard mapping (that
146e9fcaa8aSmrgis, as reported by the core protocol <emphasis>
147e9fcaa8aSmrgGetKeyboardMapping</emphasis>
148e9fcaa8aSmrg request). The order of the symbols in the core mapping does not necessarily
149e9fcaa8aSmrgcorrespond to the order of the symbols used by Xkb; section 17.1.3 describes
150e9fcaa8aSmrgthe differences.
151e9fcaa8aSmrg</para>
152e9fcaa8aSmrg
153e9fcaa8aSmrg
154e9fcaa8aSmrg<para>
155e9fcaa8aSmrgThe <emphasis>
156e9fcaa8aSmrgXKeysymToKeycode</emphasis>
157e9fcaa8aSmrg function reports a keycode to which a particular keysym is bound. When Xkb is
158e9fcaa8aSmrgmissing or disabled, this function looks in each column of the core keyboard
159e9fcaa8aSmrgmapping in turn and returns the lowest numbered key that matches in the lowest
160e9fcaa8aSmrgnumbered group. When Xkb is present, this function uses the Xkb ordering for
161e9fcaa8aSmrgsymbols instead.
162e9fcaa8aSmrg</para>
163e9fcaa8aSmrg
164e9fcaa8aSmrg
165e9fcaa8aSmrg<para>
166e9fcaa8aSmrgThe <emphasis>
167e9fcaa8aSmrgXLookupKeysym</emphasis>
168e9fcaa8aSmrg function reports the symbol in a specific column of the key associated with an
169e9fcaa8aSmrgevent. Whether or not Xkb is present, the column specifies an index into the
170e9fcaa8aSmrgcore symbol mapping.
171e9fcaa8aSmrg</para>
172e9fcaa8aSmrg
173e9fcaa8aSmrg
174e9fcaa8aSmrg<para>
175e9fcaa8aSmrgThe <emphasis>
176e9fcaa8aSmrgXLookupString</emphasis>
177e9fcaa8aSmrg function reports the symbol and string associated with a key event, taking
178e9fcaa8aSmrginto account the keycode and keyboard state as reported in the event. When Xkb
179e9fcaa8aSmrgis disabled or missing, <emphasis>
180e9fcaa8aSmrgXLookupString</emphasis>
181e9fcaa8aSmrg uses the rules specified by the core protocol and reports only ISO Latin-1
182e9fcaa8aSmrgcharacters. When Xkb is present, <emphasis>
183e9fcaa8aSmrgXLookupString</emphasis>
184e9fcaa8aSmrg uses the explicit keyboard group, key types, and rules specified by Xkb. When
185e9fcaa8aSmrgXkb is present, <emphasis>
186e9fcaa8aSmrgXLookupString</emphasis>
187e9fcaa8aSmrg is allowed, but not required, to return strings in character sets other than
188e9fcaa8aSmrgISO Latin-1, depending on the current locale. If any key bindings are defined,
189e9fcaa8aSmrg<emphasis>
190e9fcaa8aSmrgXLookupString</emphasis>
191e9fcaa8aSmrg does not use any consumed modifiers (see sections 11.1.2 and 15.2) to
192e9fcaa8aSmrgdetermine matching bindings.
193e9fcaa8aSmrg</para>
194e9fcaa8aSmrg
195e9fcaa8aSmrg
196e9fcaa8aSmrg<para>
197e9fcaa8aSmrgThe <emphasis>
198e9fcaa8aSmrgXRefreshKeyboardMapping</emphasis>
199e9fcaa8aSmrg function updates the X library’s internal representation of the keyboard to
200e9fcaa8aSmrgreflect changes reported via <emphasis>
201e9fcaa8aSmrgMappingNotify</emphasis>
202e9fcaa8aSmrg events. When Xkb is missing or disabled, this function reloads the entire
203e9fcaa8aSmrgmodifier map or keyboard mapping. When Xkb is present, the implicit Xkb support
204e9fcaa8aSmrgkeeps track of the changed components reported by each <emphasis>
205e9fcaa8aSmrgXkbMapNotify</emphasis>
206e9fcaa8aSmrg event and updates only those pieces of the keyboard description that have
207e9fcaa8aSmrgchanged. If the implicit support has not noted any keyboard mapping changes,
208e9fcaa8aSmrg<emphasis>
209e9fcaa8aSmrgXRefreshKeyboardMapping</emphasis>
210e9fcaa8aSmrg updates the entire keyboard description.
211e9fcaa8aSmrg</para>
212e9fcaa8aSmrg
213e9fcaa8aSmrg
214e9fcaa8aSmrg<para>
215e9fcaa8aSmrgThe <emphasis>
216e9fcaa8aSmrgXRebindKeysym</emphasis>
217e9fcaa8aSmrg function associates a string with a keysym and a set of modifiers. Xkb does
218e9fcaa8aSmrgnot directly change this function, but it does affect the way that the state
219e9fcaa8aSmrgreported in the event is compared to the state specified to <emphasis>
220e9fcaa8aSmrgXRebindKeysym</emphasis>
221e9fcaa8aSmrg. When Xkb is missing or disabled, <emphasis>
222e9fcaa8aSmrgXLookupString</emphasis>
223e9fcaa8aSmrg returns the specified string if the modifiers in the event exactly match the
224e9fcaa8aSmrgmodifiers from this call. When Xkb is present, any modifiers used to determine
225e9fcaa8aSmrgthe keysym are consumed and are not used to look up the string.
226e9fcaa8aSmrg</para>
227e9fcaa8aSmrg
228e9fcaa8aSmrg
229e9fcaa8aSmrg</sect2>
230e9fcaa8aSmrg</sect1>
231e9fcaa8aSmrg<sect1 id='xkb_event_and_keymap_functions'>
232e9fcaa8aSmrg<title>Xkb Event and Keymap Functions</title>
233e9fcaa8aSmrg
234e9fcaa8aSmrg<para>
235e9fcaa8aSmrgTo find the keysym bound to a particular key at a specified group and shift
236e9fcaa8aSmrglevel, use <emphasis>XkbKeycodeToKeysym</emphasis>.
237e9fcaa8aSmrg</para>
238e9fcaa8aSmrg
239e9fcaa8aSmrg<informaltable frame='none'>
240e9fcaa8aSmrg<tgroup cols='1'>
241e9fcaa8aSmrg<colspec colsep='0'/>
242e9fcaa8aSmrg<tbody>
243e9fcaa8aSmrg  <row rowsep='0'>
244e9fcaa8aSmrg    <entry role='functiondecl'>
245e9fcaa8aSmrgKeySym <emphasis>
246e9fcaa8aSmrgXkbKeycodeToKeysym</emphasis>
247e9fcaa8aSmrg(<emphasis>
248e9fcaa8aSmrgdpy, kc, group, level</emphasis>
249e9fcaa8aSmrg)
250e9fcaa8aSmrg    </entry>
251e9fcaa8aSmrg  </row>
252e9fcaa8aSmrg  <row rowsep='0'>
253e9fcaa8aSmrg    <entry role='functionargdecl'>
254e9fcaa8aSmrgDisplay *            dpy;            /* connection to X server */
255e9fcaa8aSmrg    </entry>
256e9fcaa8aSmrg  </row>
257e9fcaa8aSmrg  <row rowsep='0'>
258e9fcaa8aSmrg    <entry role='functionargdecl'>
259e9fcaa8aSmrgKeyCode            kc;            /* key of interest */
260e9fcaa8aSmrg    </entry>
261e9fcaa8aSmrg  </row>
262e9fcaa8aSmrg  <row rowsep='0'>
263e9fcaa8aSmrg    <entry role='functionargdecl'>
264e9fcaa8aSmrgunsigned int            group;            /* group of interest */
265e9fcaa8aSmrg    </entry>
266e9fcaa8aSmrg  </row>
267e9fcaa8aSmrg  <row rowsep='0'>
268e9fcaa8aSmrg    <entry role='functionargdecl'>
269e9fcaa8aSmrgunsigned int            level;            /* shift level of interest */
270e9fcaa8aSmrg    </entry>
271e9fcaa8aSmrg</row>
272e9fcaa8aSmrg</tbody>
273e9fcaa8aSmrg</tgroup>
274e9fcaa8aSmrg</informaltable>
275e9fcaa8aSmrg
276e9fcaa8aSmrg<para>
277e9fcaa8aSmrg<emphasis>
278e9fcaa8aSmrgXkbKeycodeToKeysym</emphasis>
279e9fcaa8aSmrg returns the keysym bound to a particular group and shift level for a
280e9fcaa8aSmrgparticular key on the core keyboard. If <emphasis>
281e9fcaa8aSmrgkc</emphasis>
282e9fcaa8aSmrg is not a legal keycode for the core keyboard, or if <emphasis>
283e9fcaa8aSmrggroup</emphasis>
284e9fcaa8aSmrg or <emphasis>
285e9fcaa8aSmrglevel</emphasis>
286e9fcaa8aSmrg are out of range for the specified key, <emphasis>
287e9fcaa8aSmrgXkbKeycodeToKeysym</emphasis>
288e9fcaa8aSmrg returns <emphasis>
289e9fcaa8aSmrgNoSymbol</emphasis>
290e9fcaa8aSmrg.
291e9fcaa8aSmrg</para>
292e9fcaa8aSmrg
293e9fcaa8aSmrg
294e9fcaa8aSmrg<para>
295e9fcaa8aSmrgTo find the set of modifiers bound to a particular keysym on the core keyboard,
296e9fcaa8aSmrguse <emphasis>
297e9fcaa8aSmrgXkbKeysymToModifiers</emphasis>
298e9fcaa8aSmrg.
299e9fcaa8aSmrg</para>
300e9fcaa8aSmrg
301e9fcaa8aSmrg
302e9fcaa8aSmrg<informaltable frame='none'>
303e9fcaa8aSmrg<tgroup cols='1'>
304e9fcaa8aSmrg<colspec colsep='0'/>
305e9fcaa8aSmrg<tbody>
306e9fcaa8aSmrg  <row rowsep='0'>
307e9fcaa8aSmrg    <entry role='functiondecl'>
308e9fcaa8aSmrgunsigned<emphasis>
309e9fcaa8aSmrg </emphasis>
310e9fcaa8aSmrgint <emphasis>
311e9fcaa8aSmrgXkbKeysymToModifiers</emphasis>
312e9fcaa8aSmrg(<emphasis>
313e9fcaa8aSmrgdpy</emphasis>
314e9fcaa8aSmrg,<emphasis>
315e9fcaa8aSmrg ks</emphasis>
316e9fcaa8aSmrg)
317e9fcaa8aSmrg    </entry>
318e9fcaa8aSmrg  </row>
319e9fcaa8aSmrg  <row rowsep='0'>
320e9fcaa8aSmrg    <entry role='functionargdecl'>
321e9fcaa8aSmrgDisplay *<emphasis>
322e9fcaa8aSmrg            dpy</emphasis>
323e9fcaa8aSmrg;            /* connection to X server */
324e9fcaa8aSmrg    </entry>
325e9fcaa8aSmrg  </row>
326e9fcaa8aSmrg  <row rowsep='0'>
327e9fcaa8aSmrg    <entry role='functionargdecl'>
328e9fcaa8aSmrgKeySym <emphasis>
329e9fcaa8aSmrg            ks</emphasis>
330e9fcaa8aSmrg;            /* keysym of interest */
331e9fcaa8aSmrg    </entry>
332e9fcaa8aSmrg</row>
333e9fcaa8aSmrg</tbody>
334e9fcaa8aSmrg</tgroup>
335e9fcaa8aSmrg</informaltable>
336e9fcaa8aSmrg
337e9fcaa8aSmrg<para>
338e9fcaa8aSmrg<emphasis>
339e9fcaa8aSmrgXkbKeysymToModifiers</emphasis>
340e9fcaa8aSmrg finds the set of modifiers currently bound to the keysym <emphasis>
341e9fcaa8aSmrgks</emphasis>
342e9fcaa8aSmrg on the core keyboard. The value returned is the mask of modifiers bound to the
343e9fcaa8aSmrgkeysym <emphasis>
344e9fcaa8aSmrgks</emphasis>
345e9fcaa8aSmrg. If no modifiers are bound to the keysym, <emphasis>
346e9fcaa8aSmrgXkbKeysymToModifiers</emphasis>
347e9fcaa8aSmrg returns zero; otherwise, it returns the inclusive OR of zero or more of the
348e9fcaa8aSmrgfollowing: <emphasis>
349e9fcaa8aSmrgShiftMask</emphasis>
350e9fcaa8aSmrg, <emphasis>
351e9fcaa8aSmrgControlMask</emphasis>
352e9fcaa8aSmrg, <emphasis>
353e9fcaa8aSmrgLockMask</emphasis>
354e9fcaa8aSmrg, <emphasis>
355e9fcaa8aSmrgMod1Mask</emphasis>
356e9fcaa8aSmrg, <emphasis>
357e9fcaa8aSmrgMod2Mask</emphasis>
358e9fcaa8aSmrg, <emphasis>
359e9fcaa8aSmrgMod3Mask</emphasis>
360e9fcaa8aSmrg, <emphasis>
361e9fcaa8aSmrgMod4Mask,</emphasis>
362e9fcaa8aSmrg and <emphasis>
363e9fcaa8aSmrgMod5Mask</emphasis>
364e9fcaa8aSmrg.
365e9fcaa8aSmrg</para>
366e9fcaa8aSmrg
367e9fcaa8aSmrg
368e9fcaa8aSmrg<para>
369e9fcaa8aSmrgUse <emphasis>
370e9fcaa8aSmrgXkbLookupKeySym</emphasis>
371e9fcaa8aSmrg to find the symbol associated with a key for a particular state.
372e9fcaa8aSmrg</para>
373e9fcaa8aSmrg
374e9fcaa8aSmrg
375e9fcaa8aSmrg<informaltable frame='none'>
376e9fcaa8aSmrg<tgroup cols='1'>
377e9fcaa8aSmrg<colspec colsep='0'/>
378e9fcaa8aSmrg<tbody>
379e9fcaa8aSmrg  <row rowsep='0'>
380e9fcaa8aSmrg    <entry role='functiondecl'>
381e9fcaa8aSmrgBool <emphasis>
382e9fcaa8aSmrgXkbLookupKeySym</emphasis>
383e9fcaa8aSmrg(<emphasis>
384e9fcaa8aSmrgdpy</emphasis>
385e9fcaa8aSmrg,<emphasis>
386e9fcaa8aSmrg key</emphasis>
387e9fcaa8aSmrg,<emphasis>
388e9fcaa8aSmrg state</emphasis>
389e9fcaa8aSmrg,<emphasis>
390e9fcaa8aSmrg mods_rtrn</emphasis>
391e9fcaa8aSmrg,<emphasis>
392e9fcaa8aSmrg sym_rtrn</emphasis>
393e9fcaa8aSmrg)
394e9fcaa8aSmrg    </entry>
395e9fcaa8aSmrg  </row>
396e9fcaa8aSmrg  <row rowsep='0'>
397e9fcaa8aSmrg    <entry role='functionargdecl'>
398e9fcaa8aSmrgDisplay * <emphasis>
399e9fcaa8aSmrg            dpy</emphasis>
400e9fcaa8aSmrg;            /* connection to X server */
401e9fcaa8aSmrg    </entry>
402e9fcaa8aSmrg  </row>
403e9fcaa8aSmrg  <row rowsep='0'>
404e9fcaa8aSmrg    <entry role='functionargdecl'>
405e9fcaa8aSmrgKeyCode <emphasis>
406e9fcaa8aSmrg            key</emphasis>
407e9fcaa8aSmrg;            /* key for which symbols are to be found */
408e9fcaa8aSmrg    </entry>
409e9fcaa8aSmrg  </row>
410e9fcaa8aSmrg  <row rowsep='0'>
411e9fcaa8aSmrg    <entry role='functionargdecl'>
412e9fcaa8aSmrgunsigned int <emphasis>
413e9fcaa8aSmrg            state</emphasis>
414e9fcaa8aSmrg;            /* state for which symbol should be found */
415e9fcaa8aSmrg    </entry>
416e9fcaa8aSmrg  </row>
417e9fcaa8aSmrg  <row rowsep='0'>
418e9fcaa8aSmrg    <entry role='functionargdecl'>
419e9fcaa8aSmrgunsigned int * <emphasis>
420e9fcaa8aSmrg            mods_rtrn</emphasis>
421e9fcaa8aSmrg;            /* backfilled with unconsumed modifiers */
422e9fcaa8aSmrg    </entry>
423e9fcaa8aSmrg  </row>
424e9fcaa8aSmrg  <row rowsep='0'>
425e9fcaa8aSmrg    <entry role='functionargdecl'>
426e9fcaa8aSmrgKeySym *<emphasis>
427e9fcaa8aSmrg            sym_rtrn</emphasis>
428e9fcaa8aSmrg;            /* backfilled with symbol associated with key + state */
429e9fcaa8aSmrg    </entry>
430e9fcaa8aSmrg</row>
431e9fcaa8aSmrg</tbody>
432e9fcaa8aSmrg</tgroup>
433e9fcaa8aSmrg</informaltable>
434e9fcaa8aSmrg
435e9fcaa8aSmrg<para>
436e9fcaa8aSmrg<emphasis>
437e9fcaa8aSmrgXkbLookupKeySym</emphasis>
438e9fcaa8aSmrg is the equivalent of the core <emphasis>
439e9fcaa8aSmrgXLookupKeySym</emphasis>
440e9fcaa8aSmrg function. For the core keyboard, given a keycode <emphasis>
441e9fcaa8aSmrgkey</emphasis>
442e9fcaa8aSmrg and an Xkb state <emphasis>
443e9fcaa8aSmrgstate</emphasis>
444e9fcaa8aSmrg, <emphasis>
445e9fcaa8aSmrgXkbLookupKeySym</emphasis>
446e9fcaa8aSmrg returns the symbol associated with the key  in <emphasis>
447e9fcaa8aSmrgsym_rtrn</emphasis>
448e9fcaa8aSmrg and the list of modifiers that should still be applied in <emphasis>
449e9fcaa8aSmrgmods_rtrn</emphasis>
450e9fcaa8aSmrg. The <emphasis>
451e9fcaa8aSmrgstate</emphasis>
452e9fcaa8aSmrg parameter is the state from a <emphasis>
453e9fcaa8aSmrgKeyPress</emphasis>
454e9fcaa8aSmrg or <emphasis>
455e9fcaa8aSmrgKeyRelease</emphasis>
456e9fcaa8aSmrg event. <emphasis>
457e9fcaa8aSmrgXkbLookupKeySym</emphasis>
458e9fcaa8aSmrg returns <emphasis>
459e9fcaa8aSmrgTrue</emphasis>
460e9fcaa8aSmrg if it succeeds.
461e9fcaa8aSmrg</para>
462e9fcaa8aSmrg
463e9fcaa8aSmrg
464e9fcaa8aSmrg<para>
465e9fcaa8aSmrgUse <emphasis>
466e9fcaa8aSmrgXkbLookupKeyBinding</emphasis>
467e9fcaa8aSmrg to find the string bound to a key by <emphasis>
468e9fcaa8aSmrgXRebindKeySym</emphasis>
469e9fcaa8aSmrg. <emphasis>
470e9fcaa8aSmrgXkbLookupKeyBinding</emphasis>
471e9fcaa8aSmrg is the equivalent of the core <emphasis>
472e9fcaa8aSmrgXLookupString</emphasis>
473e9fcaa8aSmrg function.
474e9fcaa8aSmrg</para>
475e9fcaa8aSmrg
476e9fcaa8aSmrg
477e9fcaa8aSmrg<informaltable frame='none'>
478e9fcaa8aSmrg<tgroup cols='1'>
479e9fcaa8aSmrg<colspec colsep='0'/>
480e9fcaa8aSmrg<tbody>
481e9fcaa8aSmrg  <row rowsep='0'>
482e9fcaa8aSmrg    <entry role='functiondecl'>
483e9fcaa8aSmrgint <emphasis>
484e9fcaa8aSmrgXkbLookupKeyBinding</emphasis>
485e9fcaa8aSmrg(<emphasis>
486e9fcaa8aSmrgdpy</emphasis>
487e9fcaa8aSmrg,<emphasis>
488e9fcaa8aSmrg sym</emphasis>
489e9fcaa8aSmrg,<emphasis>
490e9fcaa8aSmrg state</emphasis>
491e9fcaa8aSmrg,<emphasis>
492e9fcaa8aSmrg buf</emphasis>
493e9fcaa8aSmrg,<emphasis>
494e9fcaa8aSmrg nbytes</emphasis>
495e9fcaa8aSmrg,<emphasis>
496e9fcaa8aSmrg extra_rtrn</emphasis>
497e9fcaa8aSmrg)
498e9fcaa8aSmrg    </entry>
499e9fcaa8aSmrg  </row>
500e9fcaa8aSmrg  <row rowsep='0'>
501e9fcaa8aSmrg    <entry role='functionargdecl'>
502e9fcaa8aSmrgDisplay * <emphasis>
503e9fcaa8aSmrg            dpy</emphasis>
504e9fcaa8aSmrg;            /* connection to server */
505e9fcaa8aSmrg    </entry>
506e9fcaa8aSmrg  </row>
507e9fcaa8aSmrg  <row rowsep='0'>
508e9fcaa8aSmrg    <entry role='functionargdecl'>
509e9fcaa8aSmrgKeySym<emphasis>
510e9fcaa8aSmrg            sym</emphasis>
511e9fcaa8aSmrg;            /* symbol to be looked up */
512e9fcaa8aSmrg    </entry>
513e9fcaa8aSmrg  </row>
514e9fcaa8aSmrg  <row rowsep='0'>
515e9fcaa8aSmrg    <entry role='functionargdecl'>
516e9fcaa8aSmrgunsigned int            <emphasis>
517e9fcaa8aSmrgstate</emphasis>
518e9fcaa8aSmrg;            /* state for which string is to be looked up */
519e9fcaa8aSmrg    </entry>
520e9fcaa8aSmrg  </row>
521e9fcaa8aSmrg  <row rowsep='0'>
522e9fcaa8aSmrg    <entry role='functionargdecl'>
523e9fcaa8aSmrgchar * <emphasis>
524e9fcaa8aSmrg            buf</emphasis>
525e9fcaa8aSmrg;            /* buffer into which returned string is written */
526e9fcaa8aSmrg    </entry>
527e9fcaa8aSmrg  </row>
528e9fcaa8aSmrg  <row rowsep='0'>
529e9fcaa8aSmrg    <entry role='functionargdecl'>
530e9fcaa8aSmrgint <emphasis>
531e9fcaa8aSmrg            nbytes</emphasis>
532e9fcaa8aSmrg;            /* size of buffer in bytes */
533e9fcaa8aSmrg    </entry>
534e9fcaa8aSmrg  </row>
535e9fcaa8aSmrg  <row rowsep='0'>
536e9fcaa8aSmrg    <entry role='functionargdecl'>
537e9fcaa8aSmrgint * <emphasis>
538e9fcaa8aSmrg            extra_rtrn</emphasis>
539e9fcaa8aSmrg;            /* backfilled with number bytes overflow */
540e9fcaa8aSmrg    </entry>
541e9fcaa8aSmrg</row>
542e9fcaa8aSmrg</tbody>
543e9fcaa8aSmrg</tgroup>
544e9fcaa8aSmrg</informaltable>
545e9fcaa8aSmrg
546e9fcaa8aSmrg<para>
547e9fcaa8aSmrg<emphasis>
548e9fcaa8aSmrgXRebindKeysym</emphasis>
549e9fcaa8aSmrg binds an ASCII string to a specified keysym, so that the string and keysym are
550e9fcaa8aSmrgreturned when the key is pressed and a specified list of modifiers are also
551e9fcaa8aSmrgbeing held down. <emphasis>
552e9fcaa8aSmrgXkbLookupKeyBinding</emphasis>
553e9fcaa8aSmrg returns in <emphasis>
554e9fcaa8aSmrgbuf</emphasis>
555e9fcaa8aSmrg the string associated with the keysym <emphasis>
556e9fcaa8aSmrgsym</emphasis>
557e9fcaa8aSmrg and modifier state <emphasis>
558e9fcaa8aSmrgstate</emphasis>
559e9fcaa8aSmrg. <emphasis>
560e9fcaa8aSmrgbuf</emphasis>
561e9fcaa8aSmrg is <emphasis>
562e9fcaa8aSmrgNULL</emphasis>
563e9fcaa8aSmrg terminated unless there’s an overflow. If the string returned is larger than
564e9fcaa8aSmrg<emphasis>
565e9fcaa8aSmrgnbytes</emphasis>
566e9fcaa8aSmrg, a count of bytes that does not fit into the buffer is returned in extra_rtrn.
567e9fcaa8aSmrg<emphasis>
568e9fcaa8aSmrgXkbTranslateKeySym</emphasis>
569e9fcaa8aSmrg returns the number of bytes that it placed into <emphasis>
570e9fcaa8aSmrgbuf</emphasis>
571e9fcaa8aSmrg.
572e9fcaa8aSmrg</para>
573e9fcaa8aSmrg
574e9fcaa8aSmrg
575e9fcaa8aSmrg<para>
576e9fcaa8aSmrgTo find the string and symbol associated with a keysym for a given keyboard
577e9fcaa8aSmrgstate, use <emphasis>
578e9fcaa8aSmrgXkbTranslateKeySym</emphasis>
579e9fcaa8aSmrg.
580e9fcaa8aSmrg</para>
581e9fcaa8aSmrg
582e9fcaa8aSmrg
583e9fcaa8aSmrg<informaltable frame='none'>
584e9fcaa8aSmrg<tgroup cols='1'>
585e9fcaa8aSmrg<colspec colsep='0'/>
586e9fcaa8aSmrg<tbody>
587e9fcaa8aSmrg  <row rowsep='0'>
588e9fcaa8aSmrg    <entry role='functiondecl'>
589e9fcaa8aSmrgint <emphasis>
590e9fcaa8aSmrgXkbTranslateKeySym</emphasis>
591e9fcaa8aSmrg(<emphasis>
592e9fcaa8aSmrgdpy</emphasis>
593e9fcaa8aSmrg,<emphasis>
594e9fcaa8aSmrg sym_inout</emphasis>
595e9fcaa8aSmrg,<emphasis>
596e9fcaa8aSmrg mods</emphasis>
597e9fcaa8aSmrg,<emphasis>
598e9fcaa8aSmrg buf</emphasis>
599e9fcaa8aSmrg,<emphasis>
600e9fcaa8aSmrg nbytes</emphasis>
601e9fcaa8aSmrg, <emphasis>
602e9fcaa8aSmrgextra_rtrn</emphasis>
603e9fcaa8aSmrg)
604e9fcaa8aSmrg    </entry>
605e9fcaa8aSmrg  </row>
606e9fcaa8aSmrg  <row rowsep='0'>
607e9fcaa8aSmrg    <entry role='functionargdecl'>
608e9fcaa8aSmrgDisplay * <emphasis>
609e9fcaa8aSmrg            dpy</emphasis>
610e9fcaa8aSmrg;            /* connection to X server */
611e9fcaa8aSmrg    </entry>
612e9fcaa8aSmrg  </row>
613e9fcaa8aSmrg  <row rowsep='0'>
614e9fcaa8aSmrg    <entry role='functionargdecl'>
615e9fcaa8aSmrgKeySym * <emphasis>
616e9fcaa8aSmrg            sym_inout</emphasis>
617e9fcaa8aSmrg;            /* symbol to be translated; result of translation */
618e9fcaa8aSmrg    </entry>
619e9fcaa8aSmrg  </row>
620e9fcaa8aSmrg  <row rowsep='0'>
621e9fcaa8aSmrg    <entry role='functionargdecl'>
622e9fcaa8aSmrgunsigned int <emphasis>
623e9fcaa8aSmrg            mods</emphasis>
624e9fcaa8aSmrg;            /* modifiers to apply to <emphasis>
625e9fcaa8aSmrgsym_inout</emphasis>
626e9fcaa8aSmrg */
627e9fcaa8aSmrg    </entry>
628e9fcaa8aSmrg  </row>
629e9fcaa8aSmrg  <row rowsep='0'>
630e9fcaa8aSmrg    <entry role='functionargdecl'>
631e9fcaa8aSmrgchar * <emphasis>
632e9fcaa8aSmrg            buf</emphasis>
633e9fcaa8aSmrg;            /* buffer into which returned string is written */
634e9fcaa8aSmrg    </entry>
635e9fcaa8aSmrg  </row>
636e9fcaa8aSmrg  <row rowsep='0'>
637e9fcaa8aSmrg    <entry role='functionargdecl'>
638e9fcaa8aSmrgint <emphasis>
639e9fcaa8aSmrg            nbytes</emphasis>
640e9fcaa8aSmrg;            /* size of buffer in bytes */
641e9fcaa8aSmrg    </entry>
642e9fcaa8aSmrg  </row>
643e9fcaa8aSmrg  <row rowsep='0'>
644e9fcaa8aSmrg    <entry role='functionargdecl'>
645e9fcaa8aSmrgint *<emphasis>
646e9fcaa8aSmrg            extra_rtrn</emphasis>
647e9fcaa8aSmrg;            /* number of bytes overflow*/
648e9fcaa8aSmrg    </entry>
649e9fcaa8aSmrg</row>
650e9fcaa8aSmrg</tbody>
651e9fcaa8aSmrg</tgroup>
652e9fcaa8aSmrg</informaltable>
653e9fcaa8aSmrg
654e9fcaa8aSmrg<para>
655e9fcaa8aSmrg<emphasis>
656e9fcaa8aSmrgXkbTranslateKeySym</emphasis>
657e9fcaa8aSmrg applies the transformations specified in <emphasis>
658e9fcaa8aSmrgmods</emphasis>
659e9fcaa8aSmrg to the symbol specified by <emphasis>
660e9fcaa8aSmrgsym_inout</emphasis>
661e9fcaa8aSmrg. It returns in <emphasis>
662e9fcaa8aSmrgbuf</emphasis>
663e9fcaa8aSmrg the string, if any, associated with the keysym for the current locale. If the
664e9fcaa8aSmrgtransformations in <emphasis>
665e9fcaa8aSmrgmods</emphasis>
666e9fcaa8aSmrg changes the keysym, <emphasis>
667e9fcaa8aSmrgsym_inout</emphasis>
668e9fcaa8aSmrg is updated accordingly. If the string returned is larger than <emphasis>
669e9fcaa8aSmrgnbytes</emphasis>
670e9fcaa8aSmrg, a count of bytes that does not fit into the buffer is returned in extra_rtrn.
671e9fcaa8aSmrg<emphasis>
672e9fcaa8aSmrgXkbTranslateKeySym</emphasis>
673e9fcaa8aSmrg returns the number of bytes it placed into <emphasis>
674e9fcaa8aSmrgbuf</emphasis>
675e9fcaa8aSmrg.
676e9fcaa8aSmrg</para>
677e9fcaa8aSmrg
678e9fcaa8aSmrg
679e9fcaa8aSmrg<para>
680e9fcaa8aSmrgTo update the keyboard description that is internal to the X library, use
681e9fcaa8aSmrg<emphasis>
682e9fcaa8aSmrgXkbRefreshKeyboardMapping</emphasis>
683e9fcaa8aSmrg.
684e9fcaa8aSmrg</para>
685e9fcaa8aSmrg
686e9fcaa8aSmrg
687e9fcaa8aSmrg<informaltable frame='none'>
688e9fcaa8aSmrg<tgroup cols='1'>
689e9fcaa8aSmrg<colspec colsep='0'/>
690e9fcaa8aSmrg<tbody>
691e9fcaa8aSmrg  <row rowsep='0'>
692e9fcaa8aSmrg    <entry role='functiondecl'>
693e9fcaa8aSmrgStatus <emphasis>
694e9fcaa8aSmrgXkbRefreshKeyboardMapping</emphasis>
695e9fcaa8aSmrg(<emphasis>
696e9fcaa8aSmrgevent)</emphasis>
697e9fcaa8aSmrg    </entry>
698e9fcaa8aSmrg  </row>
699e9fcaa8aSmrg  <row rowsep='0'>
700e9fcaa8aSmrg    <entry role='functionargdecl'>
701e9fcaa8aSmrgXkbMapNotifyEvent * <emphasis>
702e9fcaa8aSmrg            event</emphasis>
703e9fcaa8aSmrg;            /* event initiating remapping */
704e9fcaa8aSmrg    </entry>
705e9fcaa8aSmrg</row>
706e9fcaa8aSmrg</tbody>
707e9fcaa8aSmrg</tgroup>
708e9fcaa8aSmrg</informaltable>
709e9fcaa8aSmrg
710e9fcaa8aSmrg<para>
711e9fcaa8aSmrg<emphasis>
712e9fcaa8aSmrgXkbRefreshKeyboardMapping</emphasis>
713e9fcaa8aSmrg is the Xkb equivalent of the core <emphasis>
714e9fcaa8aSmrgXRefreshKeyboardMapping</emphasis>
715e9fcaa8aSmrg function. It requests that the X server send the current key mapping
716e9fcaa8aSmrginformation to this client. A client usually invokes <emphasis>
717e9fcaa8aSmrgXkbRefreshKeyboardMapping</emphasis>
718e9fcaa8aSmrg after receiving an <emphasis>
719e9fcaa8aSmrgXkbMapNotify</emphasis>
720e9fcaa8aSmrg event. <emphasis>
721e9fcaa8aSmrgXkbRefreshKeyboardMapping</emphasis>
722e9fcaa8aSmrg returns <emphasis>
723e9fcaa8aSmrgSuccess</emphasis>
724e9fcaa8aSmrg if it succeeds and <emphasis>
725e9fcaa8aSmrgBadMatch</emphasis>
726e9fcaa8aSmrg if the event is not an Xkb event.
727e9fcaa8aSmrg</para>
728e9fcaa8aSmrg
729e9fcaa8aSmrg
730e9fcaa8aSmrg<para>
731e9fcaa8aSmrgThe <emphasis>
732e9fcaa8aSmrgXkbMapNotify</emphasis>
733e9fcaa8aSmrg event can be generated when some client calls <emphasis>
734e9fcaa8aSmrgXkbSetMap</emphasis>
735e9fcaa8aSmrg, <emphasis>
736e9fcaa8aSmrgXkbChangeMap</emphasis>
737e9fcaa8aSmrg, <emphasis>
738e9fcaa8aSmrgXkbGetKeyboardByName</emphasis>
739e9fcaa8aSmrg, or any of the standard X library functions that change the keyboard mapping
740e9fcaa8aSmrgor modifier mapping.
741e9fcaa8aSmrg</para>
742e9fcaa8aSmrg
743e9fcaa8aSmrg
744e9fcaa8aSmrg<para>
745e9fcaa8aSmrgTo translate a keycode to a key symbol and modifiers, use <emphasis>
746e9fcaa8aSmrgXkbTranslateKeyCode</emphasis>
747e9fcaa8aSmrg.
748e9fcaa8aSmrg</para>
749e9fcaa8aSmrg
750e9fcaa8aSmrg
751e9fcaa8aSmrg<informaltable frame='none'>
752e9fcaa8aSmrg<tgroup cols='1'>
753e9fcaa8aSmrg<colspec colsep='0'/>
754e9fcaa8aSmrg<tbody>
755e9fcaa8aSmrg  <row rowsep='0'>
756e9fcaa8aSmrg    <entry role='functiondecl'>
757e9fcaa8aSmrgBooll <emphasis>
758e9fcaa8aSmrgXkbTranslateKeyCode</emphasis>
759e9fcaa8aSmrg(<emphasis>
760e9fcaa8aSmrgxkb, key, mods, mods_rtrn, keysym_rtrn)</emphasis>
761e9fcaa8aSmrg    </entry>
762e9fcaa8aSmrg  </row>
763e9fcaa8aSmrg  <row rowsep='0'>
764e9fcaa8aSmrg    <entry role='functionargdecl'>
765e9fcaa8aSmrgXkbDescPtr            <emphasis>
766e9fcaa8aSmrgxkb</emphasis>
767e9fcaa8aSmrg;            /* keyboard description to use for translation */
768e9fcaa8aSmrg    </entry>
769e9fcaa8aSmrg  </row>
770e9fcaa8aSmrg  <row rowsep='0'>
771e9fcaa8aSmrg    <entry role='functionargdecl'>
772e9fcaa8aSmrgKeyCode            <emphasis>
773e9fcaa8aSmrgkey</emphasis>
774e9fcaa8aSmrg;            /* keycode to translate */
775e9fcaa8aSmrg    </entry>
776e9fcaa8aSmrg  </row>
777e9fcaa8aSmrg  <row rowsep='0'>
778e9fcaa8aSmrg    <entry role='functionargdecl'>
779e9fcaa8aSmrgunsigned int            <emphasis>
780e9fcaa8aSmrgmods</emphasis>
781e9fcaa8aSmrg;            /* modifiers to apply when translating <emphasis>
782e9fcaa8aSmrgkey</emphasis>
783e9fcaa8aSmrg */
784e9fcaa8aSmrg    </entry>
785e9fcaa8aSmrg  </row>
786e9fcaa8aSmrg  <row rowsep='0'>
787e9fcaa8aSmrg    <entry role='functionargdecl'>
788e9fcaa8aSmrgunsigned int *            <emphasis>
789e9fcaa8aSmrgmods_rtrn</emphasis>
790e9fcaa8aSmrg;            /* backfilled with unconsumed modifiers */
791e9fcaa8aSmrg    </entry>
792e9fcaa8aSmrg  </row>
793e9fcaa8aSmrg  <row rowsep='0'>
794e9fcaa8aSmrg    <entry role='functionargdecl'>
795e9fcaa8aSmrgKeySym *            <emphasis>
796e9fcaa8aSmrgkeysym_rtrn</emphasis>
797e9fcaa8aSmrg;            /* keysym resulting from translation */
798e9fcaa8aSmrg    </entry>
799e9fcaa8aSmrg</row>
800e9fcaa8aSmrg</tbody>
801e9fcaa8aSmrg</tgroup>
802e9fcaa8aSmrg</informaltable>
803e9fcaa8aSmrg
804e9fcaa8aSmrg<para>
805e9fcaa8aSmrg<emphasis>
806e9fcaa8aSmrgmods_rtrn</emphasis>
807e9fcaa8aSmrg is backfilled with the modifiers consumed by the translation process.
808e9fcaa8aSmrg<emphasis>
809e9fcaa8aSmrgmods</emphasis>
810e9fcaa8aSmrg is a bitwise inclusive OR of the legal modifier masks: <emphasis>
811e9fcaa8aSmrgShiftMask</emphasis>
812e9fcaa8aSmrg, <emphasis>
813e9fcaa8aSmrgLockMask</emphasis>
814e9fcaa8aSmrg, <emphasis>
815e9fcaa8aSmrgControlMask</emphasis>
816e9fcaa8aSmrg, <emphasis>
817e9fcaa8aSmrgMod1Mask</emphasis>
818e9fcaa8aSmrg, <emphasis>
819e9fcaa8aSmrgMod2Mask</emphasis>
820e9fcaa8aSmrg, <emphasis>
821e9fcaa8aSmrgMod3Mask</emphasis>
822e9fcaa8aSmrg, <emphasis>
823e9fcaa8aSmrgMod4Mask</emphasis>
824e9fcaa8aSmrg, <emphasis>
825e9fcaa8aSmrgMod5Mask</emphasis>
826e9fcaa8aSmrg.The <emphasis>
827e9fcaa8aSmrgAlwaysConsumeShiftAndLock</emphasis>
828e9fcaa8aSmrg library control (see section 11.1.3), if enabled, causes <emphasis>
829e9fcaa8aSmrgXkbTranslateKeyCode</emphasis>
830e9fcaa8aSmrg to consume shift and lock.<emphasis>
831e9fcaa8aSmrg XkbTranslateKeyCode</emphasis>
832e9fcaa8aSmrg returns <emphasis>
833e9fcaa8aSmrgTrue</emphasis>
834e9fcaa8aSmrg if the translation resulted in a keysym, and <emphasis>
835e9fcaa8aSmrgFalse</emphasis>
836e9fcaa8aSmrg if it resulted in <emphasis>
837e9fcaa8aSmrgNoSymbol</emphasis>
838e9fcaa8aSmrg.
839e9fcaa8aSmrg</para>
840e9fcaa8aSmrg</sect1>
841e9fcaa8aSmrg</chapter>
842