ch05.xml revision e9fcaa8a
1e9fcaa8aSmrg<chapter id='keyboard_state'> 2e9fcaa8aSmrg<title>Keyboard State</title> 3e9fcaa8aSmrg 4e9fcaa8aSmrg<para> 5e9fcaa8aSmrgKeyboard state encompasses all of the transitory information necessary to map a physical key press or release to an appropriate event. The Xkb keyboard state consists of primitive components and additional derived components that are maintained for efficiency reasons. Figure 5.1 shows the components of Xkb keyboard state and their relationships. 6e9fcaa8aSmrg</para> 7e9fcaa8aSmrg 8e9fcaa8aSmrg<mediaobject> 9e9fcaa8aSmrg<!-- <title>Keyboard State Description</title> --> 10e9fcaa8aSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-2.svg"/> 11e9fcaa8aSmrg </imageobject> 12e9fcaa8aSmrg<caption>Xkb State</caption> 13e9fcaa8aSmrg</mediaobject> 14e9fcaa8aSmrg 15e9fcaa8aSmrg 16e9fcaa8aSmrg<sect1 id='keyboard_state_description'> 17e9fcaa8aSmrg<title>Keyboard State Description</title> 18e9fcaa8aSmrg<para> 19e9fcaa8aSmrgThe Xkb keyboard state is comprised of the state of all keyboard modifiers, the keyboard group, and the state of the pointer buttons. These are grouped into the following components: 20e9fcaa8aSmrg</para> 21e9fcaa8aSmrg 22e9fcaa8aSmrg<itemizedlist> 23e9fcaa8aSmrg<listitem> 24e9fcaa8aSmrg <para> 25e9fcaa8aSmrgThe locked group and locked modifiers 26e9fcaa8aSmrg </para> 27e9fcaa8aSmrg</listitem> 28e9fcaa8aSmrg<listitem> 29e9fcaa8aSmrg <para> 30e9fcaa8aSmrgThe latched group and latched modifiers 31e9fcaa8aSmrg </para> 32e9fcaa8aSmrg</listitem> 33e9fcaa8aSmrg<listitem> 34e9fcaa8aSmrg <para> 35e9fcaa8aSmrgThe base group and base modifiers 36e9fcaa8aSmrg </para> 37e9fcaa8aSmrg</listitem> 38e9fcaa8aSmrg<listitem> 39e9fcaa8aSmrg <para> 40e9fcaa8aSmrgThe effective group and effective modifiers 41e9fcaa8aSmrg </para> 42e9fcaa8aSmrg</listitem> 43e9fcaa8aSmrg<listitem> 44e9fcaa8aSmrg <para> 45e9fcaa8aSmrgThe state of the core pointer buttons 46e9fcaa8aSmrg </para> 47e9fcaa8aSmrg</listitem> 48e9fcaa8aSmrg</itemizedlist> 49e9fcaa8aSmrg 50e9fcaa8aSmrg<para> 51e9fcaa8aSmrgThe <emphasis> 52e9fcaa8aSmrgmodifiers</emphasis> 53e9fcaa8aSmrg are <emphasis> 54e9fcaa8aSmrgShift</emphasis> 55e9fcaa8aSmrg, <emphasis> 56e9fcaa8aSmrgLock</emphasis> 57e9fcaa8aSmrg, <emphasis> 58e9fcaa8aSmrgControl</emphasis> 59e9fcaa8aSmrg, and <emphasis> 60e9fcaa8aSmrgMod1</emphasis> 61e9fcaa8aSmrg-<emphasis> 62e9fcaa8aSmrgMod5</emphasis> 63e9fcaa8aSmrg, as defined by the core protocol. A modifier can be thought of as a toggle that is either set or unset. All modifiers are initially unset. When a modifier is locked, it is set and remains set for all future key events, until it is explicitly unset. A latched modifier is set, but automatically unsets after the next key event that does not change the keyboard state. Locked and latched modifier state can be changed by keyboard activity or via Xkb extension library functions. 64e9fcaa8aSmrg</para> 65e9fcaa8aSmrg 66e9fcaa8aSmrg 67e9fcaa8aSmrg<para> 68e9fcaa8aSmrgThe Xkb extension provides support for <emphasis> 69e9fcaa8aSmrgkeysym</emphasis> 70e9fcaa8aSmrg <emphasis> 71e9fcaa8aSmrggroups</emphasis> 72e9fcaa8aSmrg, as defined by ISO9995: 73e9fcaa8aSmrg</para> 74e9fcaa8aSmrg 75e9fcaa8aSmrg 76e9fcaa8aSmrg<variablelist> 77e9fcaa8aSmrg <varlistentry> 78e9fcaa8aSmrg <term>Group</term> 79e9fcaa8aSmrg <listitem> 80e9fcaa8aSmrg <para> 81e9fcaa8aSmrgA logical state of a keyboard providing access to a collection of characters. 82e9fcaa8aSmrgA group usually contains a set of characters that logically belong together 83e9fcaa8aSmrgand that may be arranged on several shift levels within that group. 84e9fcaa8aSmrg </para> 85e9fcaa8aSmrg </listitem> 86e9fcaa8aSmrg </varlistentry> 87e9fcaa8aSmrg</variablelist> 88e9fcaa8aSmrg 89e9fcaa8aSmrg 90e9fcaa8aSmrg 91e9fcaa8aSmrg<para> 92e9fcaa8aSmrgThe Xkb extension supports up to four keysym groups. Groups are named beginning with one and indexed beginning with zero. All group states are indicated using the group index. At any point in time, there is zero or one locked group, zero or one latched group, and one base group. When a group is locked, it supersedes any previous locked group and remains the locked group for all future key events, until a new group is locked. A latched group applies only to the next key event that does not change the keyboard state. The locked and latched group can be changed by keyboard activity or via Xkb extension library functions. 93e9fcaa8aSmrg</para> 94e9fcaa8aSmrg 95e9fcaa8aSmrg 96e9fcaa8aSmrg<para> 97e9fcaa8aSmrgChanging to a different group changes the keyboard state to produce characters from a different group. Groups are typically used to switch between keysyms of different languages and locales. 98e9fcaa8aSmrg</para> 99e9fcaa8aSmrg 100e9fcaa8aSmrg 101e9fcaa8aSmrg<para> 102e9fcaa8aSmrgThe <emphasis> 103e9fcaa8aSmrgpointer buttons</emphasis> 104e9fcaa8aSmrg are <emphasis> 105e9fcaa8aSmrgButton1</emphasis> 106e9fcaa8aSmrg - <emphasis> 107e9fcaa8aSmrgButton5</emphasis> 108e9fcaa8aSmrg, as defined by the core protocol. 109e9fcaa8aSmrg</para> 110e9fcaa8aSmrg 111e9fcaa8aSmrg 112e9fcaa8aSmrg<para> 113e9fcaa8aSmrgThe <emphasis> 114e9fcaa8aSmrgbase group</emphasis> 115e9fcaa8aSmrg and <emphasis> 116e9fcaa8aSmrgbase modifiers</emphasis> 117e9fcaa8aSmrg represent keys that are physically or logically down. These 118e9fcaa8aSmrgand the pointer buttons can be changed by keyboard activity and 119e9fcaa8aSmrgnot by Xkb requests. It is possible for a key to be logically 120e9fcaa8aSmrgdown, but not physically down, and neither latched nor locked. 121e9fcaa8aSmrg<footnote><para> 122e9fcaa8aSmrgKeys may be logically down when they are physically up because 123e9fcaa8aSmrgof their electrical properties or because of the keyboard extension 124e9fcaa8aSmrgin the X server having filtered the key release, for esoteric reasons. 125e9fcaa8aSmrg</para></footnote> 126e9fcaa8aSmrg 127e9fcaa8aSmrg</para> 128e9fcaa8aSmrg 129e9fcaa8aSmrg 130e9fcaa8aSmrg<para> 131e9fcaa8aSmrgThe <emphasis> 132e9fcaa8aSmrgeffective modifiers</emphasis> 133e9fcaa8aSmrg are the bitwise union of the locked, latched, and the base modifiers. 134e9fcaa8aSmrg</para> 135e9fcaa8aSmrg 136e9fcaa8aSmrg 137e9fcaa8aSmrg<para> 138e9fcaa8aSmrgThe <emphasis> 139e9fcaa8aSmrgeffective group</emphasis> 140e9fcaa8aSmrg is the arithmetic sum of the group indices of the latched group, locked group, and base group, which is then normalized by some function. The result is a meaningful group index. 141e9fcaa8aSmrg</para> 142e9fcaa8aSmrg 143e9fcaa8aSmrg<simplelist type='vert' columns='1'> 144e9fcaa8aSmrg<member> 145e9fcaa8aSmrgn = number of keyboard groups, 1<= n <= 4 146e9fcaa8aSmrg</member> 147e9fcaa8aSmrg 148e9fcaa8aSmrg<member> 149e9fcaa8aSmrg0 <= any of locked, latched, or base group < n 150e9fcaa8aSmrg</member> 151e9fcaa8aSmrg 152e9fcaa8aSmrg<member> 153e9fcaa8aSmrgeffective group = f(locked group + latched group + base group) 154e9fcaa8aSmrg</member> 155e9fcaa8aSmrg</simplelist> 156e9fcaa8aSmrg 157e9fcaa8aSmrg<para> 158e9fcaa8aSmrgThe function f ensures that the effective group is within range. The precise function is specified for the keyboard and can be retrieved through the keyboard description. It may wrap around, clamp down, or default. Few applications will actually examine the effective group, and far fewer still will examine the locked, latched, and base groups. 159e9fcaa8aSmrg</para> 160e9fcaa8aSmrg 161e9fcaa8aSmrg 162e9fcaa8aSmrg<para> 163e9fcaa8aSmrgThere are two circumstances under which groups are normalized: 164e9fcaa8aSmrg</para> 165e9fcaa8aSmrg 166e9fcaa8aSmrg<orderedlist> 167e9fcaa8aSmrg <listitem><para> 168e9fcaa8aSmrgThe global locked or effective group changes. In this case, the changed group is normalized into range according to the settings of the <emphasis> 169e9fcaa8aSmrggroups_wrap</emphasis> 170e9fcaa8aSmrg field of the <emphasis> 171e9fcaa8aSmrgXkbControlsRec</emphasis> 172e9fcaa8aSmrg structure for the keyboard (see section 10.7.1). <!-- xref --> 173e9fcaa8aSmrg </para></listitem> 174e9fcaa8aSmrg <listitem><para> 175e9fcaa8aSmrg 176e9fcaa8aSmrgThe Xkb library is interpreting an event with an effective group that is legal for the keyboard as a whole, but not for the key in question. In this case, the group to use for this event only is determined using the <emphasis> 177e9fcaa8aSmrggroup_info</emphasis> 178e9fcaa8aSmrg field of the key symbol mapping (<emphasis> 179e9fcaa8aSmrgXkbSymMapRec</emphasis> 180e9fcaa8aSmrg) for the event key. 181e9fcaa8aSmrg </para></listitem> 182e9fcaa8aSmrg</orderedlist> 183e9fcaa8aSmrg 184e9fcaa8aSmrg<para> 185e9fcaa8aSmrgEach nonmodifier key on a keyboard has zero or more symbols, or keysyms, associated with it. These are the logical symbols that the key can generate when it is pressed. The set of all possible keysyms for a keyboard is divided into groups. Each key is associated with zero or more groups; each group contains one or more symbols. When a key is pressed, the determination of which symbol for the key is selected is based on the effective group and the shift level, which is determined by which modifiers are set. 186e9fcaa8aSmrg</para> 187e9fcaa8aSmrg 188e9fcaa8aSmrg 189e9fcaa8aSmrg<para> 190e9fcaa8aSmrgA client that does not explicitly call Xkb functions, but that otherwise makes use of an X library containing the Xkb extension, will have keyboard state represented in bits 0 - 14 of the state field of events that report modifier and button state. Such a client is said to be <emphasis> 191e9fcaa8aSmrgXkb-capable</emphasis> 192e9fcaa8aSmrg. A client that does explicitly call Xkb functions is an <emphasis> 193e9fcaa8aSmrgXkb-aware</emphasis> 194e9fcaa8aSmrg client. The Xkb keyboard state includes information derived from the effective state and from two server parameters that can be set through the keyboard extension. The following components of keyboard state pertain to Xkb-capable and Xkb-aware clients: 195e9fcaa8aSmrg</para> 196e9fcaa8aSmrg 197e9fcaa8aSmrg<itemizedlist> 198e9fcaa8aSmrg<listitem> 199e9fcaa8aSmrg <para> 200e9fcaa8aSmrglookup state: lookup group and lookup modifiers 201e9fcaa8aSmrg </para> 202e9fcaa8aSmrg</listitem> 203e9fcaa8aSmrg<listitem> 204e9fcaa8aSmrg <para> 205e9fcaa8aSmrggrab state: grab group and grab modifiers 206e9fcaa8aSmrg </para> 207e9fcaa8aSmrg</listitem> 208e9fcaa8aSmrg</itemizedlist> 209e9fcaa8aSmrg 210e9fcaa8aSmrg<para> 211e9fcaa8aSmrgThe <emphasis> 212e9fcaa8aSmrglookup modifiers</emphasis> 213e9fcaa8aSmrg and <emphasis> 214e9fcaa8aSmrglookup group</emphasis> 215e9fcaa8aSmrg are represented in the state field of core X events. The modifier state and keycode of a key event are used to determine the symbols associated with the event. For <emphasis> 216e9fcaa8aSmrgKeyPress</emphasis> 217e9fcaa8aSmrg and <emphasis> 218e9fcaa8aSmrgKeyRelease</emphasis> 219e9fcaa8aSmrg events, the lookup modifiers are computed as: 220e9fcaa8aSmrg</para> 221e9fcaa8aSmrg 222e9fcaa8aSmrg<literallayout> 223e9fcaa8aSmrg ((base | latched | locked) & ~<emphasis> server_internal_modifiers</emphasis>) 224e9fcaa8aSmrg</literallayout> 225e9fcaa8aSmrg 226e9fcaa8aSmrg<para> 227e9fcaa8aSmrgOtherwise the lookup modifiers are computed as: 228e9fcaa8aSmrg</para> 229e9fcaa8aSmrg 230e9fcaa8aSmrg<literallayout> 231e9fcaa8aSmrg(((base | latched | (locked & ~<emphasis> ignore_locks</emphasis>)) & ~<emphasis> server_internal_modifiers</emphasis>) 232e9fcaa8aSmrg</literallayout> 233e9fcaa8aSmrg 234e9fcaa8aSmrg<para> 235e9fcaa8aSmrgThe lookup group is the same as the effective group. 236e9fcaa8aSmrg</para> 237e9fcaa8aSmrg 238e9fcaa8aSmrg 239e9fcaa8aSmrg<para> 240e9fcaa8aSmrgWhen an Xkb-capable or Xkb-aware client wishes to map a keycode to a keysym, it should use the <emphasis> 241e9fcaa8aSmrglookup state</emphasis> 242e9fcaa8aSmrg — the lookup group and the lookup modifiers. 243e9fcaa8aSmrg</para> 244e9fcaa8aSmrg 245e9fcaa8aSmrg 246e9fcaa8aSmrg<para> 247e9fcaa8aSmrgThe <emphasis> 248e9fcaa8aSmrggrab state</emphasis> 249e9fcaa8aSmrg is the state used when matching events to passive grabs. If the event activates a grab, the <emphasis> 250e9fcaa8aSmrggrab modifiers</emphasis> 251e9fcaa8aSmrg and <emphasis> 252e9fcaa8aSmrggrab group</emphasis> 253e9fcaa8aSmrg are represented in the state field of core X events; otherwise, the lookup state is used. The grab modifiers are computed as: 254e9fcaa8aSmrg</para> 255e9fcaa8aSmrg 256e9fcaa8aSmrg<literallayout> 257e9fcaa8aSmrg(((base | latched | (locked & ~ignore_locks)) & ~server_internal_modifiers) 258e9fcaa8aSmrg</literallayout> 259e9fcaa8aSmrg 260e9fcaa8aSmrg<para> 261e9fcaa8aSmrgIf the server’s <emphasis> 262e9fcaa8aSmrgIgnoreGroupLock</emphasis> 263e9fcaa8aSmrg control (see section 10.7.3) is not set, the grab group is the same as the effective group. Otherwise, the grab group is computed from the base group and latched group, ignoring the locked group. 264e9fcaa8aSmrg</para> 265e9fcaa8aSmrg 266e9fcaa8aSmrg 267e9fcaa8aSmrg<para> 268e9fcaa8aSmrgThe final three components of Xkb state are applicable to clients that are not linked with an Xlib containing the X keyboard extension library and therefore are not aware of the keyboard extension (<emphasis> 269e9fcaa8aSmrgXkb-unaware </emphasis> 270e9fcaa8aSmrgclients): 271e9fcaa8aSmrg</para> 272e9fcaa8aSmrg 273e9fcaa8aSmrg<itemizedlist> 274e9fcaa8aSmrg<listitem> 275e9fcaa8aSmrg <para> 276e9fcaa8aSmrgThe compatibility modifier state 277e9fcaa8aSmrg </para> 278e9fcaa8aSmrg</listitem> 279e9fcaa8aSmrg<listitem> 280e9fcaa8aSmrg <para> 281e9fcaa8aSmrgThe compatibility lookup modifier state 282e9fcaa8aSmrg </para> 283e9fcaa8aSmrg</listitem> 284e9fcaa8aSmrg<listitem> 285e9fcaa8aSmrg <para> 286e9fcaa8aSmrgThe compatibility grab modifier state 287e9fcaa8aSmrg </para> 288e9fcaa8aSmrg</listitem> 289e9fcaa8aSmrg</itemizedlist> 290e9fcaa8aSmrg 291e9fcaa8aSmrg<para> 292e9fcaa8aSmrgThe X11 protocol interpretation of modifiers does not include direct support for multiple groups. When an Xkb-extended X server connects to an Xkb-unaware client, the compatibility states remap the keyboard group into a core modifier whenever possible. The compatibility state corresponds to the effective modifier and effective group state, with the group remapped to a modifier. The compatibility lookup and grab states correspond to the lookup and grab states, respectively, with the group remapped to a modifier. The compatibility lookup state is reported in events that do not trigger passive grabs; otherwise, the compatibility grab state is reported. 293e9fcaa8aSmrg</para> 294e9fcaa8aSmrg 295e9fcaa8aSmrg 296e9fcaa8aSmrg</sect1> 297e9fcaa8aSmrg<sect1 id='changing_the_keyboard_state'> 298e9fcaa8aSmrg<title>Changing the Keyboard State</title> 299e9fcaa8aSmrg 300e9fcaa8aSmrg<sect2 id='changing_modifiers'> 301e9fcaa8aSmrg<title>Changing Modifiers</title> 302e9fcaa8aSmrg 303e9fcaa8aSmrg<para> 304e9fcaa8aSmrgThe functions in this section that change the use of modifiers use a mask in the parameter <emphasis> 305e9fcaa8aSmrgaffect</emphasis> 306e9fcaa8aSmrg. It is a bitwise inclusive OR of the legal modifier masks: 307e9fcaa8aSmrg</para> 308e9fcaa8aSmrg 309e9fcaa8aSmrg<table frame='none'> 310e9fcaa8aSmrg<title>Real Modifier Masks</title> 311e9fcaa8aSmrg<tgroup cols='1'> 312e9fcaa8aSmrg<colspec colsep='0'/> 313e9fcaa8aSmrg<tbody> 314e9fcaa8aSmrg <row rowsep='1'> 315e9fcaa8aSmrg <entry>Mask</entry> 316e9fcaa8aSmrg </row> 317e9fcaa8aSmrg <row rowsep='0'> 318e9fcaa8aSmrg <entry>ShiftMask</entry> 319e9fcaa8aSmrg </row> 320e9fcaa8aSmrg <row rowsep='0'> 321e9fcaa8aSmrg <entry>LockMask</entry> 322e9fcaa8aSmrg </row> 323e9fcaa8aSmrg <row rowsep='0'> 324e9fcaa8aSmrg <entry>ControlMask</entry> 325e9fcaa8aSmrg </row> 326e9fcaa8aSmrg <row rowsep='0'> 327e9fcaa8aSmrg <entry>Mod1Mask</entry> 328e9fcaa8aSmrg </row> 329e9fcaa8aSmrg <row rowsep='0'> 330e9fcaa8aSmrg <entry>Mod2Mask</entry> 331e9fcaa8aSmrg </row> 332e9fcaa8aSmrg <row rowsep='0'> 333e9fcaa8aSmrg <entry>Mod3Mask</entry> 334e9fcaa8aSmrg </row> 335e9fcaa8aSmrg <row rowsep='0'> 336e9fcaa8aSmrg <entry>Mod4Mask</entry> 337e9fcaa8aSmrg </row> 338e9fcaa8aSmrg <row rowsep='0'> 339e9fcaa8aSmrg <entry>Mod5Mask</entry> 340e9fcaa8aSmrg </row> 341e9fcaa8aSmrg</tbody> 342e9fcaa8aSmrg</tgroup> 343e9fcaa8aSmrg</table> 344e9fcaa8aSmrg 345e9fcaa8aSmrg<para> 346e9fcaa8aSmrgTo lock and unlock any of the eight real keyboard modifiers, use <emphasis> 347e9fcaa8aSmrgXkbLockModifiers:</emphasis> 348e9fcaa8aSmrg</para> 349e9fcaa8aSmrg 350e9fcaa8aSmrg<informaltable frame='none'> 351e9fcaa8aSmrg<tgroup cols='1'> 352e9fcaa8aSmrg<colspec colsep='0'/> 353e9fcaa8aSmrg<tbody> 354e9fcaa8aSmrg <row rowsep='0'> 355e9fcaa8aSmrg <entry role='functiondecl'> 356e9fcaa8aSmrgBool <emphasis> XkbLockModifiers</emphasis> 357e9fcaa8aSmrg(<emphasis> 358e9fcaa8aSmrgdisplay, device_spec, affect, values</emphasis> 359e9fcaa8aSmrg) 360e9fcaa8aSmrg </entry> 361e9fcaa8aSmrg </row> 362e9fcaa8aSmrg <row rowsep='0'> 363e9fcaa8aSmrg <entry role='functionargdecl'> 364e9fcaa8aSmrgDisplay * <emphasis> 365e9fcaa8aSmrgdisplay</emphasis> 366e9fcaa8aSmrg; /* connection to the X server */ 367e9fcaa8aSmrg </entry> 368e9fcaa8aSmrg </row> 369e9fcaa8aSmrg <row rowsep='0'> 370e9fcaa8aSmrg <entry role='functionargdecl'> 371e9fcaa8aSmrgunsigned int <emphasis> 372e9fcaa8aSmrgdevice_spec</emphasis> 373e9fcaa8aSmrg; /* device ID, or <emphasis> 374e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 375e9fcaa8aSmrg */ 376e9fcaa8aSmrg </entry> 377e9fcaa8aSmrg </row> 378e9fcaa8aSmrg <row rowsep='0'> 379e9fcaa8aSmrg <entry role='functionargdecl'> 380e9fcaa8aSmrgunsigned int<emphasis> 381e9fcaa8aSmrg affect</emphasis> 382e9fcaa8aSmrg; /* mask of real modifiers whose lock state is to change */ 383e9fcaa8aSmrg </entry> 384e9fcaa8aSmrg </row> 385e9fcaa8aSmrg <row rowsep='0'> 386e9fcaa8aSmrg <entry role='functionargdecl'> 387e9fcaa8aSmrgunsigned int <emphasis> 388e9fcaa8aSmrgvalues</emphasis> 389e9fcaa8aSmrg; /* 1 => lock, 0 => unlock; only for modifiers selected by <emphasis> 390e9fcaa8aSmrgaffect</emphasis> 391e9fcaa8aSmrg */ 392e9fcaa8aSmrg </entry> 393e9fcaa8aSmrg</row> 394e9fcaa8aSmrg</tbody> 395e9fcaa8aSmrg</tgroup> 396e9fcaa8aSmrg</informaltable> 397e9fcaa8aSmrg 398e9fcaa8aSmrg<para> 399e9fcaa8aSmrg<emphasis> 400e9fcaa8aSmrgXkbLockModifiers</emphasis> 401e9fcaa8aSmrg sends a request to the server to lock the real modifiers selected by both <emphasis> 402e9fcaa8aSmrgaffect</emphasis> 403e9fcaa8aSmrg and <emphasis> 404e9fcaa8aSmrgvalues</emphasis> 405e9fcaa8aSmrg and to unlock the real modifiers selected by <emphasis> 406e9fcaa8aSmrgaffect</emphasis> 407e9fcaa8aSmrg but not selected by <emphasis> 408e9fcaa8aSmrgvalues</emphasis> 409e9fcaa8aSmrg. <emphasis> 410e9fcaa8aSmrgXkbLockModifiers</emphasis> 411e9fcaa8aSmrg does not wait for a reply from the server. It returns <emphasis> 412e9fcaa8aSmrgTrue</emphasis> 413e9fcaa8aSmrg if the request was sent, and <emphasis> 414e9fcaa8aSmrgFalse</emphasis> 415e9fcaa8aSmrg otherwise. 416e9fcaa8aSmrg</para> 417e9fcaa8aSmrg 418e9fcaa8aSmrg 419e9fcaa8aSmrg<para> 420e9fcaa8aSmrgTo latch and unlatch any of the eight real keyboard modifiers, use <emphasis> 421e9fcaa8aSmrgXkbLatchModifiers:</emphasis> 422e9fcaa8aSmrg</para> 423e9fcaa8aSmrg 424e9fcaa8aSmrg 425e9fcaa8aSmrg<informaltable frame='none'> 426e9fcaa8aSmrg<tgroup cols='1'> 427e9fcaa8aSmrg<colspec colsep='0'/> 428e9fcaa8aSmrg<tbody> 429e9fcaa8aSmrg <row rowsep='0'> 430e9fcaa8aSmrg <entry role='functiondecl'> 431e9fcaa8aSmrgBool <emphasis> 432e9fcaa8aSmrgXkbLatchModifiers</emphasis> 433e9fcaa8aSmrg(d<emphasis> 434e9fcaa8aSmrgisplay, device_spec, affect, values</emphasis> 435e9fcaa8aSmrg) 436e9fcaa8aSmrg </entry> 437e9fcaa8aSmrg </row> 438e9fcaa8aSmrg <row rowsep='0'> 439e9fcaa8aSmrg <entry role='functionargdecl'> 440e9fcaa8aSmrgDisplay * <emphasis> 441e9fcaa8aSmrgdisplay</emphasis> 442e9fcaa8aSmrg; /* connection to the X server */ 443e9fcaa8aSmrg </entry> 444e9fcaa8aSmrg </row> 445e9fcaa8aSmrg <row rowsep='0'> 446e9fcaa8aSmrg <entry role='functionargdecl'> 447e9fcaa8aSmrgunsigned int <emphasis> 448e9fcaa8aSmrgdevice_spec</emphasis> 449e9fcaa8aSmrg; /* device ID, or <emphasis> 450e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 451e9fcaa8aSmrg */ 452e9fcaa8aSmrg </entry> 453e9fcaa8aSmrg </row> 454e9fcaa8aSmrg <row rowsep='0'> 455e9fcaa8aSmrg <entry role='functionargdecl'> 456e9fcaa8aSmrgunsigned int<emphasis> 457e9fcaa8aSmrg affect</emphasis> 458e9fcaa8aSmrg; /* mask of modifiers whose latch state is to change */ 459e9fcaa8aSmrg </entry> 460e9fcaa8aSmrg </row> 461e9fcaa8aSmrg <row rowsep='0'> 462e9fcaa8aSmrg <entry role='functionargdecl'> 463e9fcaa8aSmrgunsigned int <emphasis>values</emphasis>; 464e9fcaa8aSmrg/* 1 => latch, 0 => unlatch; only for mods selected by <emphasis> 465e9fcaa8aSmrgaffect</emphasis> 466e9fcaa8aSmrg */ 467e9fcaa8aSmrg </entry> 468e9fcaa8aSmrg</row> 469e9fcaa8aSmrg</tbody> 470e9fcaa8aSmrg</tgroup> 471e9fcaa8aSmrg</informaltable> 472e9fcaa8aSmrg 473e9fcaa8aSmrg<para> 474e9fcaa8aSmrg<emphasis> 475e9fcaa8aSmrgXkbLatchModifiers</emphasis> 476e9fcaa8aSmrg sends a request to the server to latch the real modifiers selected by both <emphasis> 477e9fcaa8aSmrgaffect</emphasis> 478e9fcaa8aSmrg and <emphasis> 479e9fcaa8aSmrgvalues</emphasis> 480e9fcaa8aSmrg and to unlatch the real modifiers selected by <emphasis> 481e9fcaa8aSmrgaffect</emphasis> 482e9fcaa8aSmrg but not selected by <emphasis> 483e9fcaa8aSmrgvalues</emphasis> 484e9fcaa8aSmrg. <emphasis> 485e9fcaa8aSmrgXkbLatchModifiers</emphasis> 486e9fcaa8aSmrg does not wait for a reply from the server. It returns <emphasis> 487e9fcaa8aSmrgTrue</emphasis> 488e9fcaa8aSmrg if the request was sent, and <emphasis> 489e9fcaa8aSmrgFalse</emphasis> 490e9fcaa8aSmrg otherwise. 491e9fcaa8aSmrg</para> 492e9fcaa8aSmrg 493e9fcaa8aSmrg 494e9fcaa8aSmrg</sect2> 495e9fcaa8aSmrg<sect2 id='changing_groups'> 496e9fcaa8aSmrg<title>Changing Groups</title> 497e9fcaa8aSmrg 498e9fcaa8aSmrg<para> 499e9fcaa8aSmrgReference the keysym group indices with these symbolic constants: 500e9fcaa8aSmrg</para> 501e9fcaa8aSmrg 502e9fcaa8aSmrg<table frame='none'> 503e9fcaa8aSmrg<title>Symbolic Group Names</title> 504e9fcaa8aSmrg<tgroup cols='2'> 505e9fcaa8aSmrg<colspec colsep='0'/> 506e9fcaa8aSmrg<tbody> 507e9fcaa8aSmrg <row rowsep='0'> 508e9fcaa8aSmrg <entry>Symbolic Name</entry> 509e9fcaa8aSmrg <entry>Value</entry> 510e9fcaa8aSmrg </row> 511e9fcaa8aSmrg <row rowsep='0'> 512e9fcaa8aSmrg <entry>XkbGroup1Index</entry> 513e9fcaa8aSmrg <entry>0</entry> 514e9fcaa8aSmrg </row> 515e9fcaa8aSmrg <row rowsep='0'> 516e9fcaa8aSmrg <entry>XkbGroup2Index</entry> 517e9fcaa8aSmrg <entry>1</entry> 518e9fcaa8aSmrg </row> 519e9fcaa8aSmrg <row rowsep='0'> 520e9fcaa8aSmrg <entry>XkbGroup3Index</entry> 521e9fcaa8aSmrg <entry>2</entry> 522e9fcaa8aSmrg </row> 523e9fcaa8aSmrg <row rowsep='0'> 524e9fcaa8aSmrg <entry>XkbGroup4Index</entry> 525e9fcaa8aSmrg <entry>3</entry> 526e9fcaa8aSmrg </row> 527e9fcaa8aSmrg</tbody> 528e9fcaa8aSmrg</tgroup> 529e9fcaa8aSmrg</table> 530e9fcaa8aSmrg 531e9fcaa8aSmrg<para> 532e9fcaa8aSmrgTo lock the keysym group, use <emphasis> 533e9fcaa8aSmrgXkbLockGroup. </emphasis> 534e9fcaa8aSmrg</para> 535e9fcaa8aSmrg 536e9fcaa8aSmrg<informaltable frame='none'> 537e9fcaa8aSmrg<tgroup cols='1'> 538e9fcaa8aSmrg<colspec colsep='0'/> 539e9fcaa8aSmrg<tbody> 540e9fcaa8aSmrg <row rowsep='0'> 541e9fcaa8aSmrg <entry role='functiondecl'> 542e9fcaa8aSmrgBool <emphasis> 543e9fcaa8aSmrgXkbLockGroup</emphasis> 544e9fcaa8aSmrg(<emphasis> 545e9fcaa8aSmrgdisplay, device_spec, group</emphasis> 546e9fcaa8aSmrg) 547e9fcaa8aSmrg </entry> 548e9fcaa8aSmrg </row> 549e9fcaa8aSmrg <row rowsep='0'> 550e9fcaa8aSmrg <entry role='functionargdecl'> 551e9fcaa8aSmrgDisplay * <emphasis> 552e9fcaa8aSmrgdisplay</emphasis> 553e9fcaa8aSmrg; /* connection to the X server */ 554e9fcaa8aSmrg </entry> 555e9fcaa8aSmrg </row> 556e9fcaa8aSmrg <row rowsep='0'> 557e9fcaa8aSmrg <entry role='functionargdecl'> 558e9fcaa8aSmrgunsigned int <emphasis> 559e9fcaa8aSmrgdevice_spec</emphasis> 560e9fcaa8aSmrg; /* device ID, or <emphasis> 561e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 562e9fcaa8aSmrg */ 563e9fcaa8aSmrg </entry> 564e9fcaa8aSmrg </row> 565e9fcaa8aSmrg <row rowsep='0'> 566e9fcaa8aSmrg <entry role='functionargdecl'> 567e9fcaa8aSmrgunsigned int <emphasis> 568e9fcaa8aSmrggroup</emphasis> 569e9fcaa8aSmrg; /* index of the keysym group to lock */ 570e9fcaa8aSmrg </entry> 571e9fcaa8aSmrg</row> 572e9fcaa8aSmrg</tbody> 573e9fcaa8aSmrg</tgroup> 574e9fcaa8aSmrg</informaltable> 575e9fcaa8aSmrg 576e9fcaa8aSmrg<para> 577e9fcaa8aSmrg<emphasis> 578e9fcaa8aSmrgXkbLockGroup</emphasis> 579e9fcaa8aSmrg sends a request to the server to lock the specified <emphasis> 580e9fcaa8aSmrggroup </emphasis> 581e9fcaa8aSmrgand does not wait for a reply. It returns <emphasis> 582e9fcaa8aSmrgTrue</emphasis> 583e9fcaa8aSmrg if the request was sent and <emphasis> 584e9fcaa8aSmrgFalse</emphasis> 585e9fcaa8aSmrg otherwise. 586e9fcaa8aSmrg</para> 587e9fcaa8aSmrg 588e9fcaa8aSmrg 589e9fcaa8aSmrg<para> 590e9fcaa8aSmrgTo latch the keysym group, use <emphasis> 591e9fcaa8aSmrgXkbLatchGroup.</emphasis> 592e9fcaa8aSmrg</para> 593e9fcaa8aSmrg 594e9fcaa8aSmrg 595e9fcaa8aSmrg<informaltable frame='none'> 596e9fcaa8aSmrg<tgroup cols='1'> 597e9fcaa8aSmrg<colspec colsep='0'/> 598e9fcaa8aSmrg<tbody> 599e9fcaa8aSmrg <row rowsep='0'> 600e9fcaa8aSmrg <entry role='functiondecl'> 601e9fcaa8aSmrgBool <emphasis> 602e9fcaa8aSmrgXkbLatchGroup</emphasis> 603e9fcaa8aSmrg(<emphasis> 604e9fcaa8aSmrgdisplay, device_spec, group</emphasis> 605e9fcaa8aSmrg) 606e9fcaa8aSmrg </entry> 607e9fcaa8aSmrg </row> 608e9fcaa8aSmrg <row rowsep='0'> 609e9fcaa8aSmrg <entry role='functionargdecl'> 610e9fcaa8aSmrgDisplay * <emphasis> 611e9fcaa8aSmrgdisplay</emphasis> 612e9fcaa8aSmrg; /* connection to the X server */ 613e9fcaa8aSmrg </entry> 614e9fcaa8aSmrg </row> 615e9fcaa8aSmrg <row rowsep='0'> 616e9fcaa8aSmrg <entry role='functionargdecl'> 617e9fcaa8aSmrgunsigned int<emphasis> 618e9fcaa8aSmrg device_spec</emphasis> 619e9fcaa8aSmrg; /* device ID, or <emphasis> 620e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 621e9fcaa8aSmrg */ 622e9fcaa8aSmrg </entry> 623e9fcaa8aSmrg </row> 624e9fcaa8aSmrg <row rowsep='0'> 625e9fcaa8aSmrg <entry role='functionargdecl'> 626e9fcaa8aSmrgunsigned int<emphasis> 627e9fcaa8aSmrg group</emphasis> 628e9fcaa8aSmrg; /* index of the keysym group to latch */ 629e9fcaa8aSmrg </entry> 630e9fcaa8aSmrg</row> 631e9fcaa8aSmrg</tbody> 632e9fcaa8aSmrg</tgroup> 633e9fcaa8aSmrg</informaltable> 634e9fcaa8aSmrg 635e9fcaa8aSmrg<para> 636e9fcaa8aSmrg<emphasis> 637e9fcaa8aSmrgXkbLatchGroup</emphasis> 638e9fcaa8aSmrg sends a request to the server to latch the specified group and does not wait for a reply. It returns <emphasis> 639e9fcaa8aSmrgTrue</emphasis> 640e9fcaa8aSmrg if the request was sent and <emphasis> 641e9fcaa8aSmrgFalse</emphasis> 642e9fcaa8aSmrg otherwise. 643e9fcaa8aSmrg</para> 644e9fcaa8aSmrg 645e9fcaa8aSmrg 646e9fcaa8aSmrg</sect2> 647e9fcaa8aSmrg</sect1> 648e9fcaa8aSmrg<sect1 id='determining_keyboard_state'> 649e9fcaa8aSmrg<title>Determining Keyboard State</title> 650e9fcaa8aSmrg 651e9fcaa8aSmrg<para> 652e9fcaa8aSmrgXkb keyboard state may be represented in an <emphasis> 653e9fcaa8aSmrgXkbStateRec</emphasis> 654e9fcaa8aSmrg structure: 655e9fcaa8aSmrg</para> 656e9fcaa8aSmrg 657e9fcaa8aSmrg<para><programlisting> 658e9fcaa8aSmrgtypedef struct { 659e9fcaa8aSmrg unsigned char group; /* effective group index */ 660e9fcaa8aSmrg unsigned char base_group; /* base group index */ 661e9fcaa8aSmrg unsigned char latched_group; /* latched group index */ 662e9fcaa8aSmrg unsigned char locked_group; /* locked group index */ 663e9fcaa8aSmrg unsigned char mods; /* effective modifiers */ 664e9fcaa8aSmrg unsigned char base_mods; /* base modifiers */ 665e9fcaa8aSmrg unsigned char latched_mods; /* latched modifiers */ 666e9fcaa8aSmrg unsigned char locked_mods; /* locked modifiers */ 667e9fcaa8aSmrg unsigned char compat_state; /* effective group => modifiers */ 668e9fcaa8aSmrg unsigned char grab_mods; /* modifiers used for grabs */ 669e9fcaa8aSmrg unsigned char compat_grab_mods; /* mods used for compatibility mode grabs */ 670e9fcaa8aSmrg unsigned char lookup_mods; /* modifiers used to lookup symbols */ 671e9fcaa8aSmrg unsigned char compat_lookup_mods; /* mods used for compatibility lookup */ 672e9fcaa8aSmrg unsigned short ptr_buttons; /* 1 bit => corresponding pointer btn is down */ 673e9fcaa8aSmrg} <emphasis> 674e9fcaa8aSmrgXkbStateRec</emphasis> 675e9fcaa8aSmrg,*XkbStatePtr; 676e9fcaa8aSmrg</programlisting></para> 677e9fcaa8aSmrg 678e9fcaa8aSmrg<para> 679e9fcaa8aSmrgTo obtain the keyboard state, use <emphasis> 680e9fcaa8aSmrgXkbGetState.</emphasis> 681e9fcaa8aSmrg</para> 682e9fcaa8aSmrg 683e9fcaa8aSmrg<informaltable frame='none'> 684e9fcaa8aSmrg<tgroup cols='1'> 685e9fcaa8aSmrg<colspec colsep='0'/> 686e9fcaa8aSmrg<tbody> 687e9fcaa8aSmrg <row rowsep='0'> 688e9fcaa8aSmrg <entry role='functiondecl'> 689e9fcaa8aSmrgStatus <emphasis> 690e9fcaa8aSmrgXkbGetState</emphasis> 691e9fcaa8aSmrg(<emphasis> 692e9fcaa8aSmrgdisplay</emphasis> 693e9fcaa8aSmrg, <emphasis> 694e9fcaa8aSmrgdevice_spec</emphasis> 695e9fcaa8aSmrg, <emphasis> 696e9fcaa8aSmrgstate_return</emphasis> 697e9fcaa8aSmrg) 698e9fcaa8aSmrg </entry> 699e9fcaa8aSmrg </row> 700e9fcaa8aSmrg <row rowsep='0'> 701e9fcaa8aSmrg <entry role='functionargdecl'> 702e9fcaa8aSmrgDisplay * <emphasis> 703e9fcaa8aSmrgdisplay</emphasis> 704e9fcaa8aSmrg; /* connection to the X server */ 705e9fcaa8aSmrg </entry> 706e9fcaa8aSmrg </row> 707e9fcaa8aSmrg <row rowsep='0'> 708e9fcaa8aSmrg <entry role='functionargdecl'> 709e9fcaa8aSmrgunsigned int <emphasis> 710e9fcaa8aSmrgdevice_spec</emphasis> 711e9fcaa8aSmrg; /* device ID, or <emphasis> 712e9fcaa8aSmrgXkbUseCoreKbd</emphasis> 713e9fcaa8aSmrg */ 714e9fcaa8aSmrg </entry> 715e9fcaa8aSmrg </row> 716e9fcaa8aSmrg <row rowsep='0'> 717e9fcaa8aSmrg <entry role='functionargdecl'> 718e9fcaa8aSmrgXkbStatePtr <emphasis> 719e9fcaa8aSmrgstate_return</emphasis> 720e9fcaa8aSmrg; /* backfilled with Xkb state */ 721e9fcaa8aSmrg </entry> 722e9fcaa8aSmrg</row> 723e9fcaa8aSmrg</tbody> 724e9fcaa8aSmrg</tgroup> 725e9fcaa8aSmrg</informaltable> 726e9fcaa8aSmrg 727e9fcaa8aSmrg<para> 728e9fcaa8aSmrgThe <emphasis> 729e9fcaa8aSmrgXkbGetState </emphasis> 730e9fcaa8aSmrgfunction queries the server for the current keyboard state, waits for a reply, and then backfills <emphasis> 731e9fcaa8aSmrgstate_return</emphasis> 732e9fcaa8aSmrg with the results. 733e9fcaa8aSmrg</para> 734e9fcaa8aSmrg 735e9fcaa8aSmrg 736e9fcaa8aSmrg<para> 737e9fcaa8aSmrgAll group values are expressed as group indices in the range [0..3]. Modifiers and the compatibility modifier state values are expressed as the bitwise union of the core X11 modifier masks. The pointer button state is reported as in the core X11 protocol. 738e9fcaa8aSmrg</para> 739e9fcaa8aSmrg 740e9fcaa8aSmrg 741e9fcaa8aSmrg</sect1> 742e9fcaa8aSmrg<sect1 id='tracking_keyboard_state'> 743e9fcaa8aSmrg<title>Tracking Keyboard State</title> 744e9fcaa8aSmrg 745e9fcaa8aSmrg<para> 746e9fcaa8aSmrgThe Xkb extension reports <emphasis> 747e9fcaa8aSmrgXkbStateNotify </emphasis> 748e9fcaa8aSmrgevents to clients wanting notification whenever the Xkb state changes. The changes reported include changes to any aspect of the keyboard state: when a modifier is set or unset, when the current group changes, or when a pointer button is pressed or released. As with all Xkb events, <emphasis> 749e9fcaa8aSmrgXkbStateNotify</emphasis> 750e9fcaa8aSmrg events are reported to all interested clients without regard to the current keyboard input focus or grab state. 751e9fcaa8aSmrg</para> 752e9fcaa8aSmrg 753e9fcaa8aSmrg 754e9fcaa8aSmrg<para> 755e9fcaa8aSmrgThere are many different types of Xkb state changes. Xkb defines an event detail mask corresponding to each type of change. The event detail masks are listed in Table 5.3. 756e9fcaa8aSmrg</para> 757e9fcaa8aSmrg 758e9fcaa8aSmrg<table frame='none'> 759e9fcaa8aSmrg<title>XkbStateNotify Event Detail Masks</title> 760e9fcaa8aSmrg<tgroup cols='2'> 761e9fcaa8aSmrg<colspec colsep='0'/> 762e9fcaa8aSmrg<thead> 763e9fcaa8aSmrg <row rowsep='0'> 764e9fcaa8aSmrg <entry>Mask</entry> 765e9fcaa8aSmrg <entry>Value</entry> 766e9fcaa8aSmrg </row> 767e9fcaa8aSmrg</thead> 768e9fcaa8aSmrg<tbody> 769e9fcaa8aSmrg <row rowsep='0'> 770e9fcaa8aSmrg <entry>XkbModifierStateMask</entry> 771e9fcaa8aSmrg <entry>(1L << 0)</entry> 772e9fcaa8aSmrg </row> 773e9fcaa8aSmrg <row rowsep='0'> 774e9fcaa8aSmrg <entry>XkbModifierBaseMask</entry> 775e9fcaa8aSmrg <entry>(1L << 1)</entry> 776e9fcaa8aSmrg </row> 777e9fcaa8aSmrg <row rowsep='0'> 778e9fcaa8aSmrg <entry>XkbModifierLatchMask</entry> 779e9fcaa8aSmrg <entry>(1L << 2)</entry> 780e9fcaa8aSmrg </row> 781e9fcaa8aSmrg <row rowsep='0'> 782e9fcaa8aSmrg <entry>XkbModifierLockMask</entry> 783e9fcaa8aSmrg <entry>(1L << 3)</entry> 784e9fcaa8aSmrg </row> 785e9fcaa8aSmrg <row rowsep='0'> 786e9fcaa8aSmrg <entry>XkbGroupStateMask</entry> 787e9fcaa8aSmrg <entry>(1L << 4)</entry> 788e9fcaa8aSmrg </row> 789e9fcaa8aSmrg <row rowsep='0'> 790e9fcaa8aSmrg <entry>XkbGroupBaseMask</entry> 791e9fcaa8aSmrg <entry>(1L << 5)</entry> 792e9fcaa8aSmrg </row> 793e9fcaa8aSmrg <row rowsep='0'> 794e9fcaa8aSmrg <entry>XkbGroupLatchMask</entry> 795e9fcaa8aSmrg <entry>(1L << 6)</entry> 796e9fcaa8aSmrg </row> 797e9fcaa8aSmrg <row rowsep='0'> 798e9fcaa8aSmrg <entry>XkbGroupLockMask</entry> 799e9fcaa8aSmrg <entry>(1L << 7)</entry> 800e9fcaa8aSmrg </row> 801e9fcaa8aSmrg <row rowsep='0'> 802e9fcaa8aSmrg <entry>XkbCompatStateMask</entry> 803e9fcaa8aSmrg <entry>(1L << 8)</entry> 804e9fcaa8aSmrg </row> 805e9fcaa8aSmrg <row rowsep='0'> 806e9fcaa8aSmrg <entry>XkbGrabModsMask</entry> 807e9fcaa8aSmrg <entry>(1L << 9)</entry> 808e9fcaa8aSmrg </row> 809e9fcaa8aSmrg <row rowsep='0'> 810e9fcaa8aSmrg <entry>XkbCompatGrabModsMask</entry> 811e9fcaa8aSmrg <entry>(1L << 10)</entry> 812e9fcaa8aSmrg </row> 813e9fcaa8aSmrg <row rowsep='0'> 814e9fcaa8aSmrg <entry>XkbLookupModsMask</entry> 815e9fcaa8aSmrg <entry>(1L << 11)</entry> 816e9fcaa8aSmrg </row> 817e9fcaa8aSmrg <row rowsep='0'> 818e9fcaa8aSmrg <entry>XkbCompatLookupModsMask</entry> 819e9fcaa8aSmrg <entry>(1L << 12)</entry> 820e9fcaa8aSmrg </row> 821e9fcaa8aSmrg <row rowsep='0'> 822e9fcaa8aSmrg <entry>XkbPointerButtonMask</entry> 823e9fcaa8aSmrg <entry>(1L << 13)</entry> 824e9fcaa8aSmrg </row> 825e9fcaa8aSmrg <row rowsep='0'> 826e9fcaa8aSmrg <entry>XkbAllStateComponentsMask</entry> 827e9fcaa8aSmrg <entry>(0x3fff)</entry> 828e9fcaa8aSmrg </row> 829e9fcaa8aSmrg</tbody> 830e9fcaa8aSmrg</tgroup> 831e9fcaa8aSmrg</table> 832e9fcaa8aSmrg 833e9fcaa8aSmrg<para> 834e9fcaa8aSmrgTo track changes in the keyboard state for a particular device, select to receive <emphasis> 835e9fcaa8aSmrgXkbStateNotify</emphasis> 836e9fcaa8aSmrg events by calling either <emphasis> 837e9fcaa8aSmrgXkbSelectEvents</emphasis> 838e9fcaa8aSmrg or <emphasis> 839e9fcaa8aSmrgXkbSelectEventDetails</emphasis> 840e9fcaa8aSmrg (see section 4.3). <!-- xref --> 841e9fcaa8aSmrg</para> 842e9fcaa8aSmrg 843e9fcaa8aSmrg 844e9fcaa8aSmrg<para> 845e9fcaa8aSmrgTo receive <emphasis> 846e9fcaa8aSmrgXkbStateNotify</emphasis> 847e9fcaa8aSmrg events under all possible conditions, use <emphasis> 848e9fcaa8aSmrgXkbSelectEvents</emphasis> 849e9fcaa8aSmrg and pass <emphasis> 850e9fcaa8aSmrgXkbStateNotifyMask</emphasis> 851e9fcaa8aSmrg in both <emphasis> 852e9fcaa8aSmrgbits_to_change</emphasis> 853e9fcaa8aSmrg and <emphasis> 854e9fcaa8aSmrgvalues_for_bits</emphasis> 855e9fcaa8aSmrg. 856e9fcaa8aSmrg</para> 857e9fcaa8aSmrg 858e9fcaa8aSmrg 859e9fcaa8aSmrg<para> 860e9fcaa8aSmrgTo receive <emphasis> 861e9fcaa8aSmrgXkbStateNotify</emphasis> 862e9fcaa8aSmrg events only under certain conditions, use <emphasis> 863e9fcaa8aSmrgXkbSelectEventDetails</emphasis> 864e9fcaa8aSmrg using <emphasis> 865e9fcaa8aSmrgXkbStateNotify</emphasis> 866e9fcaa8aSmrg as the <emphasis> 867e9fcaa8aSmrgevent_type</emphasis> 868e9fcaa8aSmrg and specifying the desired state changes in <emphasis> 869e9fcaa8aSmrgbits_to_change</emphasis> 870e9fcaa8aSmrg and <emphasis> 871e9fcaa8aSmrgvalues_for_bits</emphasis> 872e9fcaa8aSmrg using mask bits from Table 5.3. <!-- xref --> 873e9fcaa8aSmrg</para> 874e9fcaa8aSmrg 875e9fcaa8aSmrg 876e9fcaa8aSmrg<para> 877e9fcaa8aSmrgThe structure for <emphasis> 878e9fcaa8aSmrgXkbStateNotify</emphasis> 879e9fcaa8aSmrg events is: 880e9fcaa8aSmrg</para> 881e9fcaa8aSmrg 882e9fcaa8aSmrg<para><programlisting> 883e9fcaa8aSmrgtypedef struct { 884e9fcaa8aSmrg int type; /* Xkb extension base event code */ 885e9fcaa8aSmrg unsigned long serial; /* X server serial number for event */ 886e9fcaa8aSmrg Bool send_event; /* <emphasis> True</emphasis> => synthetically generated */ 887e9fcaa8aSmrg Display * display; /* server connection where event generated */ 888e9fcaa8aSmrg Time time; /* server time when event generated */ 889e9fcaa8aSmrg int xkb_type; /* <emphasis> XkbStateNotify</emphasis> */ 890e9fcaa8aSmrg int device; /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */ 891e9fcaa8aSmrg unsigned int changed; /* bits indicating what has changed */ 892e9fcaa8aSmrg int group; /* group index of effective group */ 893e9fcaa8aSmrg int base_group; /* group index of base group */ 894e9fcaa8aSmrg int latched_group; /* group index of latched group */ 895e9fcaa8aSmrg int locked_group; /* group index of locked group */ 896e9fcaa8aSmrg unsigned int mods; /* effective modifiers */ 897e9fcaa8aSmrg unsigned int base_mods; /* base modifiers */ 898e9fcaa8aSmrg unsigned int latched_mods; /* latched modifiers */ 899e9fcaa8aSmrg unsigned int locked_mods; /* locked modifiers */ 900e9fcaa8aSmrg int compat_state; /* computed compatibility state */ 901e9fcaa8aSmrg unsigned char grab_mods; /* modifiers used for grabs */ 902e9fcaa8aSmrg unsigned char compat_grab_mods; /* modifiers used for compatibility grabs */ 903e9fcaa8aSmrg unsigned char lookup_mods; /* modifiers used to lookup symbols */ 904e9fcaa8aSmrg unsigned char compat_lookup_mods; /* mods used for compatibility look up */ 905e9fcaa8aSmrg int ptr_buttons; /* core pointer buttons */ 906e9fcaa8aSmrg KeyCode keycode; /* keycode causing event, 0 if programmatic */ 907e9fcaa8aSmrg char event_type; /* core event if <emphasis> req_major</emphasis> or 908e9fcaa8aSmrg <emphasis> req_minor</emphasis> non zero */ 909e9fcaa8aSmrg char req_major; /* major request code if program trigger, else 0 */ 910e9fcaa8aSmrg char req_minor; /* minor request code if program trigger, else 0 */ 911e9fcaa8aSmrg} <emphasis>XkbStateNotifyEvent</emphasis> 912e9fcaa8aSmrg; 913e9fcaa8aSmrg</programlisting></para> 914e9fcaa8aSmrg 915e9fcaa8aSmrg<para> 916e9fcaa8aSmrgWhen you receive an <emphasis> 917e9fcaa8aSmrgXkbStateNotify</emphasis> 918e9fcaa8aSmrg event, the <emphasis> 919e9fcaa8aSmrgchanged</emphasis> 920e9fcaa8aSmrg field indicates which elements of keyboard state have changed. 921e9fcaa8aSmrgThis will be the bitwise inclusive OR of one or more of the <emphasis> 922e9fcaa8aSmrgXkbStateNotify</emphasis> 923e9fcaa8aSmrg event detail masks shown in Table 5.3. All fields reported in <!-- xref --> 924e9fcaa8aSmrgthe event are valid, but only those indicated in <emphasis> 925e9fcaa8aSmrgchanged</emphasis> 926e9fcaa8aSmrg have changed values. 927e9fcaa8aSmrg</para> 928e9fcaa8aSmrg 929e9fcaa8aSmrg 930e9fcaa8aSmrg<para> 931e9fcaa8aSmrgThe <emphasis> 932e9fcaa8aSmrggroup</emphasis> 933e9fcaa8aSmrg field is the group index of the effective keysym group. The <emphasis> 934e9fcaa8aSmrgbase_group</emphasis> 935e9fcaa8aSmrg, <emphasis> 936e9fcaa8aSmrglatched_group</emphasis> 937e9fcaa8aSmrg, and <emphasis> 938e9fcaa8aSmrglocked_group</emphasis> 939e9fcaa8aSmrg fields are set to a group index value representing the base group, 940e9fcaa8aSmrgthe latched group, and the locked group, respectively. The X 941e9fcaa8aSmrgserver can set the modifier and compatibility state fields to 942e9fcaa8aSmrga union of the core modifier mask bits; this union represents the 943e9fcaa8aSmrgcorresponding modifier states. The <emphasis>ptr_button</emphasis> 944e9fcaa8aSmrg field gives the state of the core pointer buttons as a 945e9fcaa8aSmrgmask composed of an inclusive OR of zero or more of the 946e9fcaa8aSmrgcore pointer button masks. 947e9fcaa8aSmrg</para> 948e9fcaa8aSmrg 949e9fcaa8aSmrg 950e9fcaa8aSmrg<para> 951e9fcaa8aSmrgXkb state changes can occur either in response to keyboard 952e9fcaa8aSmrgactivity or under application control. If a key event 953e9fcaa8aSmrgcaused the state change, the <emphasis> 954e9fcaa8aSmrgkeycode</emphasis> 955e9fcaa8aSmrg field gives the keycode of the key event, and the <emphasis> 956e9fcaa8aSmrgevent_type</emphasis> 957e9fcaa8aSmrg field is set to either <emphasis>KeyPress</emphasis> 958e9fcaa8aSmrg or <emphasis> 959e9fcaa8aSmrgKeyRelease</emphasis> 960e9fcaa8aSmrg. If a pointer button event caused the state change, the <emphasis> 961e9fcaa8aSmrgkeycode</emphasis> 962e9fcaa8aSmrg field is zero, and the <emphasis>event_type</emphasis> 963e9fcaa8aSmrg field is set to either <emphasis>ButtonPress</emphasis> 964e9fcaa8aSmrg or <emphasis>ButtonRelease</emphasis> 965e9fcaa8aSmrg. Otherwise, the major and minor codes of the request that caused the 966e9fcaa8aSmrgstate change are given in the <emphasis> 967e9fcaa8aSmrgreq_major</emphasis> 968e9fcaa8aSmrg and <emphasis> 969e9fcaa8aSmrgreq_minor</emphasis> 970e9fcaa8aSmrg fields, and the <emphasis> 971e9fcaa8aSmrgkeycode</emphasis> 972e9fcaa8aSmrg field is zero. The <emphasis> 973e9fcaa8aSmrgreq_major</emphasis> 974e9fcaa8aSmrg value is the same as the major extension opcode. 975e9fcaa8aSmrg</para> 976e9fcaa8aSmrg</sect1> 977e9fcaa8aSmrg</chapter> 978