10f8248bfSmrg<?xml version="1.0" encoding="UTF-8" ?> 20f8248bfSmrg<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" 30f8248bfSmrg "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"> 4eb411b4bSmrg<chapter id='Keyboard_State'> 5e9fcaa8aSmrg<title>Keyboard State</title> 6e9fcaa8aSmrg 7e9fcaa8aSmrg<para> 80f8248bfSmrgKeyboard 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. <link linkend="figure5.1">Figure 5.1</link> shows the components of Xkb keyboard state and their relationships. 9e9fcaa8aSmrg</para> 10e9fcaa8aSmrg 110f8248bfSmrg<figure id='figure5.1'> 120f8248bfSmrg <title>Xkb State</title> 130f8248bfSmrg <mediaobject> 140f8248bfSmrg <!-- <title>Keyboard State Description</title> --> 150f8248bfSmrg <imageobject> <imagedata format="SVG" fileref="XKBlib-2.svg"/> 160f8248bfSmrg </imageobject> 170f8248bfSmrg </mediaobject> 180f8248bfSmrg</figure> 19e9fcaa8aSmrg 20e9fcaa8aSmrg 21eb411b4bSmrg<sect1 id='Keyboard_State_Description'> 22e9fcaa8aSmrg<title>Keyboard State Description</title> 23e9fcaa8aSmrg<para> 24e9fcaa8aSmrgThe 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: 25e9fcaa8aSmrg</para> 26e9fcaa8aSmrg 27e9fcaa8aSmrg<itemizedlist> 28e9fcaa8aSmrg<listitem> 29e9fcaa8aSmrg <para> 30e9fcaa8aSmrgThe locked group and locked modifiers 31e9fcaa8aSmrg </para> 32e9fcaa8aSmrg</listitem> 33e9fcaa8aSmrg<listitem> 34e9fcaa8aSmrg <para> 35e9fcaa8aSmrgThe latched group and latched modifiers 36e9fcaa8aSmrg </para> 37e9fcaa8aSmrg</listitem> 38e9fcaa8aSmrg<listitem> 39e9fcaa8aSmrg <para> 40e9fcaa8aSmrgThe base group and base modifiers 41e9fcaa8aSmrg </para> 42e9fcaa8aSmrg</listitem> 43e9fcaa8aSmrg<listitem> 44e9fcaa8aSmrg <para> 45e9fcaa8aSmrgThe effective group and effective modifiers 46e9fcaa8aSmrg </para> 47e9fcaa8aSmrg</listitem> 48e9fcaa8aSmrg<listitem> 49e9fcaa8aSmrg <para> 50e9fcaa8aSmrgThe state of the core pointer buttons 51e9fcaa8aSmrg </para> 52e9fcaa8aSmrg</listitem> 53e9fcaa8aSmrg</itemizedlist> 54e9fcaa8aSmrg 550f8248bfSmrg<para id='modifiers'> 560f8248bfSmrgThe 570f8248bfSmrg<firstterm>modifiers</firstterm> 580f8248bfSmrg<indexterm significance="preferred" zone="modifiers"> 590f8248bfSmrg<primary>modifiers</primary></indexterm> 600f8248bfSmrgare 610f8248bfSmrg<symbol>Shift</symbol>, 620f8248bfSmrg<symbol>Lock</symbol>, 630f8248bfSmrg<symbol>Control</symbol>, 640f8248bfSmrgand 650f8248bfSmrg<symbol>Mod1</symbol> 660f8248bfSmrg– 670f8248bfSmrg<symbol>Mod5</symbol>, 680f8248bfSmrgas 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. 69e9fcaa8aSmrg</para> 70e9fcaa8aSmrg 71e9fcaa8aSmrg 720f8248bfSmrg<para id='keysym_groups'> 730f8248bfSmrgThe Xkb extension provides support for 740f8248bfSmrg<firstterm>keysym groups</firstterm>, 750f8248bfSmrg<indexterm significance="preferred" zone="keysym_groups"> 760f8248bfSmrg<primary>keysym groups</primary></indexterm> 770f8248bfSmrg<indexterm significance="preferred" zone="keysym_groups"> 780f8248bfSmrg<primary>group</primary><secondary>keysym</secondary></indexterm> 790f8248bfSmrg<indexterm significance="preferred" zone="keysym_groups"> 800f8248bfSmrg<primary>group</primary><secondary>ISO9995</secondary></indexterm> 810f8248bfSmrgas defined by ISO9995: 82e9fcaa8aSmrg</para> 83e9fcaa8aSmrg 84e9fcaa8aSmrg 85e9fcaa8aSmrg<variablelist> 86e9fcaa8aSmrg <varlistentry> 87e9fcaa8aSmrg <term>Group</term> 88e9fcaa8aSmrg <listitem> 89e9fcaa8aSmrg <para> 90e9fcaa8aSmrgA logical state of a keyboard providing access to a collection of characters. 91e9fcaa8aSmrgA group usually contains a set of characters that logically belong together 92e9fcaa8aSmrgand that may be arranged on several shift levels within that group. 93e9fcaa8aSmrg </para> 94e9fcaa8aSmrg </listitem> 95e9fcaa8aSmrg </varlistentry> 96e9fcaa8aSmrg</variablelist> 97e9fcaa8aSmrg 98e9fcaa8aSmrg 99e9fcaa8aSmrg 100e9fcaa8aSmrg<para> 101e9fcaa8aSmrgThe 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. 102e9fcaa8aSmrg</para> 103e9fcaa8aSmrg 104e9fcaa8aSmrg 105e9fcaa8aSmrg<para> 106e9fcaa8aSmrgChanging 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. 107e9fcaa8aSmrg</para> 108e9fcaa8aSmrg 109e9fcaa8aSmrg 110e9fcaa8aSmrg<para> 1110f8248bfSmrgThe 1120f8248bfSmrg<firstterm>pointer buttons</firstterm> 1130f8248bfSmrgare 1140f8248bfSmrg<symbol>Button1</symbol> 1150f8248bfSmrg– 1160f8248bfSmrg<symbol>Button5</symbol>, 1170f8248bfSmrgas defined by the core protocol. 118e9fcaa8aSmrg</para> 119e9fcaa8aSmrg 120e9fcaa8aSmrg 1210f8248bfSmrg<para id='base_group'> 1220f8248bfSmrgThe 1230f8248bfSmrg<firstterm>base group</firstterm> 1240f8248bfSmrg<indexterm significance="preferred" zone="base_group"> 1250f8248bfSmrg<primary>base group</primary></indexterm> 1260f8248bfSmrg<indexterm significance="preferred" zone="base_group"> 1270f8248bfSmrg<primary>group</primary><secondary>base</secondary></indexterm> 1280f8248bfSmrgand 1290f8248bfSmrg<firstterm>base modifiers</firstterm> 1300f8248bfSmrg<indexterm significance="preferred" zone="base_group"> 1310f8248bfSmrg<primary>base modifiers</primary></indexterm> 1320f8248bfSmrg<indexterm significance="preferred" zone="base_group"> 1330f8248bfSmrg<primary>modifiers</primary><secondary>base</secondary></indexterm> 1340f8248bfSmrgrepresent keys that are physically or logically down. These 135e9fcaa8aSmrgand the pointer buttons can be changed by keyboard activity and 136e9fcaa8aSmrgnot by Xkb requests. It is possible for a key to be logically 137e9fcaa8aSmrgdown, but not physically down, and neither latched nor locked. 138e9fcaa8aSmrg<footnote><para> 139e9fcaa8aSmrgKeys may be logically down when they are physically up because 140e9fcaa8aSmrgof their electrical properties or because of the keyboard extension 141e9fcaa8aSmrgin the X server having filtered the key release, for esoteric reasons. 142e9fcaa8aSmrg</para></footnote> 143e9fcaa8aSmrg 144e9fcaa8aSmrg</para> 145e9fcaa8aSmrg 146e9fcaa8aSmrg 1470f8248bfSmrg<para id='effective_modifiers'> 1480f8248bfSmrgThe 1490f8248bfSmrg<firstterm>effective modifiers</firstterm> 1500f8248bfSmrg<indexterm significance="preferred" zone="effective_modifiers"> 1510f8248bfSmrg<primary>effective modifiers</primary></indexterm> 1520f8248bfSmrg<indexterm significance="preferred" zone="effective_modifiers"> 1530f8248bfSmrg<primary>modifiers</primary><secondary>effective</secondary></indexterm> 1540f8248bfSmrgare the bitwise union of the locked, latched, and the base modifiers. 155e9fcaa8aSmrg</para> 156e9fcaa8aSmrg 157e9fcaa8aSmrg 1580f8248bfSmrg<para id='effective_group'> 1590f8248bfSmrgThe 1600f8248bfSmrg<firstterm>effective group</firstterm> 1610f8248bfSmrg<indexterm significance="preferred" zone="effective_group"> 1620f8248bfSmrg<primary>effective group</primary></indexterm> 1630f8248bfSmrg<indexterm significance="preferred" zone="effective_group"> 1640f8248bfSmrg<primary>group</primary><secondary>effective</secondary></indexterm> 1650f8248bfSmrgis 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. 166e9fcaa8aSmrg</para> 167e9fcaa8aSmrg 168e9fcaa8aSmrg<simplelist type='vert' columns='1'> 169e9fcaa8aSmrg<member> 170e9fcaa8aSmrgn = number of keyboard groups, 1<= n <= 4 171e9fcaa8aSmrg</member> 172e9fcaa8aSmrg 173e9fcaa8aSmrg<member> 174e9fcaa8aSmrg0 <= any of locked, latched, or base group < n 175e9fcaa8aSmrg</member> 176e9fcaa8aSmrg 177e9fcaa8aSmrg<member> 178e9fcaa8aSmrgeffective group = f(locked group + latched group + base group) 179e9fcaa8aSmrg</member> 180e9fcaa8aSmrg</simplelist> 181e9fcaa8aSmrg 182e9fcaa8aSmrg<para> 183e9fcaa8aSmrgThe 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. 184e9fcaa8aSmrg</para> 185e9fcaa8aSmrg 186e9fcaa8aSmrg 187e9fcaa8aSmrg<para> 188e9fcaa8aSmrgThere are two circumstances under which groups are normalized: 189e9fcaa8aSmrg</para> 190e9fcaa8aSmrg 191e9fcaa8aSmrg<orderedlist> 192e9fcaa8aSmrg <listitem><para> 1930f8248bfSmrgThe global locked or effective group changes. In this case, the changed group is normalized into range according to the settings of the 1940f8248bfSmrg<structfield>groups_wrap</structfield> 1950f8248bfSmrgfield of the 1960f8248bfSmrg<structname>XkbControlsRec</structname> 1970f8248bfSmrgstructure for the keyboard (see <link linkend="The_GroupsWrap_Control">section 10.7.1</link>). 198e9fcaa8aSmrg </para></listitem> 199e9fcaa8aSmrg <listitem><para> 200e9fcaa8aSmrg 2010f8248bfSmrgThe 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 2020f8248bfSmrg<structfield>group_info</structfield> 2030f8248bfSmrgfield of the key symbol mapping 2040f8248bfSmrg(<structname>XkbSymMapRec</structname>) 2050f8248bfSmrgfor the event key. 206e9fcaa8aSmrg </para></listitem> 207e9fcaa8aSmrg</orderedlist> 208e9fcaa8aSmrg 209e9fcaa8aSmrg<para> 210e9fcaa8aSmrgEach 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. 211e9fcaa8aSmrg</para> 212e9fcaa8aSmrg 213e9fcaa8aSmrg 2140f8248bfSmrg<para id='Xkb-aware'> 2150f8248bfSmrgA 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 2160f8248bfSmrg<firstterm>Xkb-capable</firstterm>. 2170f8248bfSmrg<indexterm significance="preferred" zone="Xkb-aware"> 2180f8248bfSmrg<primary>Xkb-capable client</primary></indexterm> 2190f8248bfSmrg 2200f8248bfSmrgA client that does explicitly call Xkb functions is an 2210f8248bfSmrg<firstterm>Xkb-aware</firstterm> 2220f8248bfSmrg<indexterm significance="preferred" zone="Xkb-aware"> 2230f8248bfSmrg<primary>Xkb-aware client</primary></indexterm> 2240f8248bfSmrgclient. 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: 225e9fcaa8aSmrg</para> 226e9fcaa8aSmrg 227e9fcaa8aSmrg<itemizedlist> 228e9fcaa8aSmrg<listitem> 229e9fcaa8aSmrg <para> 230e9fcaa8aSmrglookup state: lookup group and lookup modifiers 231e9fcaa8aSmrg </para> 232e9fcaa8aSmrg</listitem> 233e9fcaa8aSmrg<listitem> 234e9fcaa8aSmrg <para> 235e9fcaa8aSmrggrab state: grab group and grab modifiers 236e9fcaa8aSmrg </para> 237e9fcaa8aSmrg</listitem> 238e9fcaa8aSmrg</itemizedlist> 239e9fcaa8aSmrg 2400f8248bfSmrg<para id='lookup_state'> 2410f8248bfSmrgThe 2420f8248bfSmrg<firstterm>lookup modifiers</firstterm> 2430f8248bfSmrg<indexterm significance="preferred" zone="lookup_state"> 2440f8248bfSmrg<primary>lookup modifiers</primary></indexterm> 2450f8248bfSmrg<indexterm significance="preferred" zone="lookup_state"> 2460f8248bfSmrg<primary>modifiers</primary><secondary>lookup</secondary></indexterm> 2470f8248bfSmrgand 2480f8248bfSmrg<firstterm>lookup group</firstterm> 2490f8248bfSmrg<indexterm significance="preferred" zone="lookup_state"> 2500f8248bfSmrg<primary>lookup group</primary></indexterm> 2510f8248bfSmrg<indexterm significance="preferred" zone="lookup_state"> 2520f8248bfSmrg<primary>group</primary><secondary>lookup</secondary></indexterm> 2530f8248bfSmrgare 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 2540f8248bfSmrg<symbol>KeyPress</symbol> 2550f8248bfSmrgand 2560f8248bfSmrg<symbol>KeyRelease</symbol> 2570f8248bfSmrgevents, the lookup modifiers are computed as: 2580f8248bfSmrg 2590f8248bfSmrg<literallayout> ((base | latched | locked) & ~<emphasis>server_internal_modifiers</emphasis>)</literallayout> 260e9fcaa8aSmrg</para> 261e9fcaa8aSmrg 262e9fcaa8aSmrg<para> 263e9fcaa8aSmrgOtherwise the lookup modifiers are computed as: 264e9fcaa8aSmrg 2650f8248bfSmrg<literallayout> (((base | latched | (locked & ~<emphasis>ignore_locks</emphasis>)) & ~<emphasis>server_internal_modifiers</emphasis>)</literallayout> 2660f8248bfSmrg</para> 267e9fcaa8aSmrg 268e9fcaa8aSmrg<para> 269e9fcaa8aSmrgThe lookup group is the same as the effective group. 270e9fcaa8aSmrg</para> 271e9fcaa8aSmrg 272e9fcaa8aSmrg 273e9fcaa8aSmrg<para> 2740f8248bfSmrgWhen an Xkb-capable or Xkb-aware client wishes to map a keycode to a keysym, it should use the 2750f8248bfSmrg<firstterm>lookup state</firstterm> 2760f8248bfSmrg<indexterm significance="preferred" zone="lookup_state"> 2770f8248bfSmrg<primary>lookup state</primary></indexterm> 2780f8248bfSmrg<indexterm significance="preferred" zone="lookup_state"> 2790f8248bfSmrg<primary>state</primary><secondary>lookup</secondary></indexterm> 2800f8248bfSmrg— the lookup group and the lookup modifiers. 281e9fcaa8aSmrg</para> 282e9fcaa8aSmrg 283e9fcaa8aSmrg 2840f8248bfSmrg<para id='grab_state'> 2850f8248bfSmrgThe 2860f8248bfSmrg<firstterm>grab state</firstterm> 2870f8248bfSmrg<indexterm significance="preferred" zone="grab_state"> 2880f8248bfSmrg<primary>grab state</primary></indexterm> 2890f8248bfSmrg<indexterm significance="preferred" zone="grab_state"> 2900f8248bfSmrg<primary>state</primary><secondary>grab</secondary></indexterm> 2910f8248bfSmrgis the state used when matching events to passive grabs. If the event activates a grab, the 2920f8248bfSmrg<firstterm>grab modifiers</firstterm> 2930f8248bfSmrg<indexterm significance="preferred" zone="grab_state"> 2940f8248bfSmrg<primary>grab modifiers</primary></indexterm> 2950f8248bfSmrg<indexterm significance="preferred" zone="grab_state"> 2960f8248bfSmrg<primary>modifiers</primary><secondary>grab</secondary></indexterm> 2970f8248bfSmrgand 2980f8248bfSmrg<firstterm>grab group</firstterm> 2990f8248bfSmrg<indexterm significance="preferred" zone="grab_state"> 3000f8248bfSmrg<primary>grab group</primary></indexterm> 3010f8248bfSmrg<indexterm significance="preferred" zone="grab_state"> 3020f8248bfSmrg<primary>group</primary><secondary>grab</secondary></indexterm> 3030f8248bfSmrgare represented in the state field of core X events; otherwise, the lookup state is used. The grab modifiers are computed as: 3040f8248bfSmrg 3050f8248bfSmrg<literallayout> (((base | latched | (locked & ~ignore_locks)) & ~server_internal_modifiers)</literallayout> 306e9fcaa8aSmrg</para> 307e9fcaa8aSmrg 308e9fcaa8aSmrg<para> 3090f8248bfSmrgIf the server’s 3100f8248bfSmrg<emphasis>IgnoreGroupLock</emphasis> 3110f8248bfSmrgcontrol (see <link linkend="The_IgnoreGroupLock_Control">section 10.7.3</link>) 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. 312e9fcaa8aSmrg</para> 313e9fcaa8aSmrg 314e9fcaa8aSmrg 315e9fcaa8aSmrg<para> 3160f8248bfSmrgThe 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 3170f8248bfSmrg(<emphasis>Xkb-unaware</emphasis> 318e9fcaa8aSmrgclients): 319e9fcaa8aSmrg</para> 320e9fcaa8aSmrg 321e9fcaa8aSmrg<itemizedlist> 322e9fcaa8aSmrg<listitem> 323e9fcaa8aSmrg <para> 324e9fcaa8aSmrgThe compatibility modifier state 325e9fcaa8aSmrg </para> 326e9fcaa8aSmrg</listitem> 327e9fcaa8aSmrg<listitem> 328e9fcaa8aSmrg <para> 329e9fcaa8aSmrgThe compatibility lookup modifier state 330e9fcaa8aSmrg </para> 331e9fcaa8aSmrg</listitem> 332e9fcaa8aSmrg<listitem> 333e9fcaa8aSmrg <para> 334e9fcaa8aSmrgThe compatibility grab modifier state 335e9fcaa8aSmrg </para> 336e9fcaa8aSmrg</listitem> 337e9fcaa8aSmrg</itemizedlist> 338e9fcaa8aSmrg 339e9fcaa8aSmrg<para> 340e9fcaa8aSmrgThe 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. 341e9fcaa8aSmrg</para> 342e9fcaa8aSmrg 343e9fcaa8aSmrg 344e9fcaa8aSmrg</sect1> 345eb411b4bSmrg<sect1 id='Changing_the_Keyboard_State'> 346e9fcaa8aSmrg<title>Changing the Keyboard State</title> 347e9fcaa8aSmrg 348eb411b4bSmrg<sect2 id='Changing_Modifiers'> 349e9fcaa8aSmrg<title>Changing Modifiers</title> 350e9fcaa8aSmrg 3510f8248bfSmrg<indexterm zone="Changing_Modifiers"> 3520f8248bfSmrg<primary>real modifiers</primary></indexterm> 3530f8248bfSmrg<indexterm zone="Changing_Modifiers"> 3540f8248bfSmrg<primary>modifiers</primary><secondary>real</secondary></indexterm> 3550f8248bfSmrg<indexterm significance="preferred" zone="Changing_Modifiers"> 3560f8248bfSmrg<primary>mask</primary><secondary>real modifiers</secondary></indexterm> 3570f8248bfSmrg 358e9fcaa8aSmrg<para> 3590f8248bfSmrgThe functions in this section that change the use of modifiers use a mask in the parameter 3600f8248bfSmrg<structfield>affect</structfield>. 3610f8248bfSmrgIt is a bitwise inclusive OR of the legal modifier masks: 362e9fcaa8aSmrg</para> 363e9fcaa8aSmrg 3640f8248bfSmrg<table id='table5.1' frame='none'> 365e9fcaa8aSmrg<title>Real Modifier Masks</title> 366eb411b4bSmrg<?dbfo keep-together="always" ?> 367eb411b4bSmrg<tgroup cols='1' align='left' colsep='0' rowsep='0'> 368eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 369e9fcaa8aSmrg<tbody> 370eb411b4bSmrg <row> 371e9fcaa8aSmrg <entry>Mask</entry> 372e9fcaa8aSmrg </row> 373eb411b4bSmrg <row> 374e9fcaa8aSmrg <entry>ShiftMask</entry> 375e9fcaa8aSmrg </row> 376eb411b4bSmrg <row> 377e9fcaa8aSmrg <entry>LockMask</entry> 378e9fcaa8aSmrg </row> 379eb411b4bSmrg <row> 380e9fcaa8aSmrg <entry>ControlMask</entry> 381e9fcaa8aSmrg </row> 382eb411b4bSmrg <row> 383e9fcaa8aSmrg <entry>Mod1Mask</entry> 384e9fcaa8aSmrg </row> 385eb411b4bSmrg <row> 386e9fcaa8aSmrg <entry>Mod2Mask</entry> 387e9fcaa8aSmrg </row> 388eb411b4bSmrg <row> 389e9fcaa8aSmrg <entry>Mod3Mask</entry> 390e9fcaa8aSmrg </row> 391eb411b4bSmrg <row> 392e9fcaa8aSmrg <entry>Mod4Mask</entry> 393e9fcaa8aSmrg </row> 394eb411b4bSmrg <row> 395e9fcaa8aSmrg <entry>Mod5Mask</entry> 396e9fcaa8aSmrg </row> 397e9fcaa8aSmrg</tbody> 398e9fcaa8aSmrg</tgroup> 399e9fcaa8aSmrg</table> 400e9fcaa8aSmrg 401e9fcaa8aSmrg<para> 4020f8248bfSmrgTo lock and unlock any of the eight real keyboard modifiers, use 4030f8248bfSmrg<function>XkbLockModifiers</function>: 404e9fcaa8aSmrg</para> 405e9fcaa8aSmrg 4060f8248bfSmrg<indexterm significance="preferred" zone="XkbLockModifiers"><primary><function>XkbLockModifiers</function></primary></indexterm> 4070f8248bfSmrg<funcsynopsis id="XkbLockModifiers"> 4080f8248bfSmrg <funcprototype> 4090f8248bfSmrg <funcdef>Bool <function>XkbLockModifiers</function></funcdef> 4100f8248bfSmrg<!-- ( 4110f8248bfSmrg<parameter>display, device_spec, affect, values</parameter> 4120f8248bfSmrg) --> 4130f8248bfSmrg 4140f8248bfSmrg <paramdef>Display *<parameter>display</parameter></paramdef> 4150f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 4160f8248bfSmrg <paramdef>unsigned int <parameter>affect</parameter></paramdef> 4170f8248bfSmrg <paramdef>unsigned int <parameter>values</parameter></paramdef> 4180f8248bfSmrg </funcprototype> 4190f8248bfSmrg</funcsynopsis> 4200f8248bfSmrg<variablelist> 4210f8248bfSmrg <varlistentry> 4220f8248bfSmrg <term> 4230f8248bfSmrg <parameter>display</parameter> 4240f8248bfSmrg </term> 4250f8248bfSmrg <listitem> 4260f8248bfSmrg <para> 4270f8248bfSmrg connection to the X server 4280f8248bfSmrg </para> 4290f8248bfSmrg </listitem> 4300f8248bfSmrg </varlistentry> 4310f8248bfSmrg <varlistentry> 4320f8248bfSmrg <term> 4330f8248bfSmrg <parameter>device_spec</parameter> 4340f8248bfSmrg </term> 4350f8248bfSmrg <listitem> 4360f8248bfSmrg <para> 4370f8248bfSmrg device ID, or <symbol>XkbUseCoreKbd</symbol> 4380f8248bfSmrg </para> 4390f8248bfSmrg </listitem> 4400f8248bfSmrg </varlistentry> 4410f8248bfSmrg <varlistentry> 4420f8248bfSmrg <term> 4430f8248bfSmrg <parameter>affect</parameter> 4440f8248bfSmrg </term> 4450f8248bfSmrg <listitem> 4460f8248bfSmrg <para> 4470f8248bfSmrg mask of real modifiers whose lock state is to change 4480f8248bfSmrg </para> 4490f8248bfSmrg </listitem> 4500f8248bfSmrg </varlistentry> 4510f8248bfSmrg <varlistentry> 4520f8248bfSmrg <term> 4530f8248bfSmrg <parameter>values</parameter> 4540f8248bfSmrg </term> 4550f8248bfSmrg <listitem> 4560f8248bfSmrg <para> 4570f8248bfSmrg 1 ⇒ lock, 0 ⇒ unlock; only for modifiers selected by <parameter>affect</parameter> 4580f8248bfSmrg </para> 4590f8248bfSmrg </listitem> 4600f8248bfSmrg </varlistentry> 4610f8248bfSmrg</variablelist> 462e9fcaa8aSmrg 463e9fcaa8aSmrg<para> 4640f8248bfSmrg<function>XkbLockModifiers</function> 4650f8248bfSmrgsends a request to the server to lock the real modifiers selected by both 4660f8248bfSmrg<parameter>affect</parameter> 4670f8248bfSmrgand 4680f8248bfSmrg<parameter>values</parameter> 4690f8248bfSmrgand to unlock the real modifiers selected by 4700f8248bfSmrg<parameter>affect</parameter> 4710f8248bfSmrgbut not selected by 4720f8248bfSmrg<parameter>values</parameter>. 4730f8248bfSmrg<function>XkbLockModifiers</function> 4740f8248bfSmrgdoes not wait for a reply from the server. It returns 4750f8248bfSmrg<symbol>True</symbol> 4760f8248bfSmrgif the request was sent, and 4770f8248bfSmrg<symbol>False</symbol> 4780f8248bfSmrgotherwise. 479e9fcaa8aSmrg</para> 480e9fcaa8aSmrg 481e9fcaa8aSmrg 482e9fcaa8aSmrg<para> 4830f8248bfSmrgTo latch and unlatch any of the eight real keyboard modifiers, use 4840f8248bfSmrg<function>XkbLatchModifiers</function>: 485e9fcaa8aSmrg</para> 486e9fcaa8aSmrg 487e9fcaa8aSmrg 4880f8248bfSmrg<indexterm significance="preferred" zone="XkbLatchModifiers"><primary><function>XkbLatchModifiers</function></primary></indexterm> 4890f8248bfSmrg<funcsynopsis id="XkbLatchModifiers"> 4900f8248bfSmrg <funcprototype> 4910f8248bfSmrg <funcdef>Bool <function>XkbLatchModifiers</function></funcdef> 4920f8248bfSmrg<!-- ( 4930f8248bfSmrg<parameter>display, device_spec, affect, values</parameter> 4940f8248bfSmrg) --> 4950f8248bfSmrg 4960f8248bfSmrg <paramdef>Display *<parameter>display</parameter></paramdef> 4970f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 4980f8248bfSmrg <paramdef>unsigned int <parameter>affect</parameter></paramdef> 4990f8248bfSmrg <paramdef>unsigned int <parameter>values</parameter></paramdef> 5000f8248bfSmrg </funcprototype> 5010f8248bfSmrg</funcsynopsis> 5020f8248bfSmrg<variablelist> 5030f8248bfSmrg <varlistentry> 5040f8248bfSmrg <term> 5050f8248bfSmrg <parameter>display</parameter> 5060f8248bfSmrg </term> 5070f8248bfSmrg <listitem> 5080f8248bfSmrg <para> 5090f8248bfSmrg connection to the X server 5100f8248bfSmrg </para> 5110f8248bfSmrg </listitem> 5120f8248bfSmrg </varlistentry> 5130f8248bfSmrg <varlistentry> 5140f8248bfSmrg <term> 5150f8248bfSmrg <parameter>device_spec</parameter> 5160f8248bfSmrg </term> 5170f8248bfSmrg <listitem> 5180f8248bfSmrg <para> 5190f8248bfSmrg device ID, or <symbol>XkbUseCoreKbd</symbol> 5200f8248bfSmrg </para> 5210f8248bfSmrg </listitem> 5220f8248bfSmrg </varlistentry> 5230f8248bfSmrg <varlistentry> 5240f8248bfSmrg <term> 5250f8248bfSmrg <parameter>affect</parameter> 5260f8248bfSmrg </term> 5270f8248bfSmrg <listitem> 5280f8248bfSmrg <para> 5290f8248bfSmrg mask of modifiers whose latch state is to change 5300f8248bfSmrg </para> 5310f8248bfSmrg </listitem> 5320f8248bfSmrg </varlistentry> 5330f8248bfSmrg <varlistentry> 5340f8248bfSmrg <term> 5350f8248bfSmrg <parameter>values</parameter> 5360f8248bfSmrg </term> 5370f8248bfSmrg <listitem> 5380f8248bfSmrg <para> 5390f8248bfSmrg 1 ⇒ latch, 0 ⇒ unlatch; only for mods selected by <parameter>affect</parameter> 5400f8248bfSmrg </para> 5410f8248bfSmrg </listitem> 5420f8248bfSmrg </varlistentry> 5430f8248bfSmrg</variablelist> 544e9fcaa8aSmrg 545e9fcaa8aSmrg<para> 5460f8248bfSmrg<function>XkbLatchModifiers</function> 5470f8248bfSmrgsends a request to the server to latch the real modifiers selected by both 5480f8248bfSmrg<parameter>affect</parameter> 5490f8248bfSmrgand 5500f8248bfSmrg<parameter>values</parameter> 5510f8248bfSmrgand to unlatch the real modifiers selected by 5520f8248bfSmrg<parameter>affect</parameter> 5530f8248bfSmrgbut not selected by 5540f8248bfSmrg<parameter>values</parameter>. 5550f8248bfSmrg<function>XkbLatchModifiers</function> 5560f8248bfSmrgdoes not wait for a reply from the server. It returns 5570f8248bfSmrg<symbol>True</symbol> 5580f8248bfSmrgif the request was sent, and 5590f8248bfSmrg<symbol>False</symbol> 5600f8248bfSmrgotherwise. 561e9fcaa8aSmrg</para> 562e9fcaa8aSmrg 563e9fcaa8aSmrg 564e9fcaa8aSmrg</sect2> 565eb411b4bSmrg<sect2 id='Changing_Groups'> 566e9fcaa8aSmrg<title>Changing Groups</title> 567e9fcaa8aSmrg 5680f8248bfSmrg<indexterm zone="Changing_Groups"> 5690f8248bfSmrg<primary>keysym groups</primary></indexterm> 5700f8248bfSmrg<indexterm zone="Changing_Groups"> 5710f8248bfSmrg<primary>group</primary><secondary>keysym</secondary></indexterm> 5720f8248bfSmrg 573e9fcaa8aSmrg<para> 574e9fcaa8aSmrgReference the keysym group indices with these symbolic constants: 575e9fcaa8aSmrg</para> 576e9fcaa8aSmrg 5770f8248bfSmrg<table id='table5.2' frame='topbot'> 578e9fcaa8aSmrg<title>Symbolic Group Names</title> 579eb411b4bSmrg<?dbfo keep-together="always" ?> 580eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 581eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 582eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/> 583e9fcaa8aSmrg<tbody> 584eb411b4bSmrg <row rowsep='1'> 585e9fcaa8aSmrg <entry>Symbolic Name</entry> 586e9fcaa8aSmrg <entry>Value</entry> 587e9fcaa8aSmrg </row> 588eb411b4bSmrg <row> 5890f8248bfSmrg <entry><symbol>XkbGroup1Index</symbol></entry> 590e9fcaa8aSmrg <entry>0</entry> 591e9fcaa8aSmrg </row> 592eb411b4bSmrg <row> 5930f8248bfSmrg <entry><symbol>XkbGroup2Index</symbol></entry> 594e9fcaa8aSmrg <entry>1</entry> 595e9fcaa8aSmrg </row> 596eb411b4bSmrg <row> 5970f8248bfSmrg <entry><symbol>XkbGroup3Index</symbol></entry> 598e9fcaa8aSmrg <entry>2</entry> 599e9fcaa8aSmrg </row> 600eb411b4bSmrg <row> 6010f8248bfSmrg <entry><symbol>XkbGroup4Index</symbol></entry> 602e9fcaa8aSmrg <entry>3</entry> 603e9fcaa8aSmrg </row> 604e9fcaa8aSmrg</tbody> 605e9fcaa8aSmrg</tgroup> 606e9fcaa8aSmrg</table> 607e9fcaa8aSmrg 608e9fcaa8aSmrg<para> 6090f8248bfSmrgTo lock the keysym group, use 6100f8248bfSmrg<function>XkbLockGroup</function>. 611e9fcaa8aSmrg</para> 612e9fcaa8aSmrg 6130f8248bfSmrg<indexterm significance="preferred" zone="XkbLockGroup"><primary><function>XkbLockGroup</function></primary></indexterm> 6140f8248bfSmrg<funcsynopsis id="XkbLockGroup"> 6150f8248bfSmrg <funcprototype> 6160f8248bfSmrg <funcdef>Bool <function>XkbLockGroup</function></funcdef> 6170f8248bfSmrg<!-- ( 6180f8248bfSmrg<parameter>display, device_spec, group</parameter> 6190f8248bfSmrg) --> 6200f8248bfSmrg 6210f8248bfSmrg <paramdef>Display *<parameter>display</parameter></paramdef> 6220f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 6230f8248bfSmrg <paramdef>unsigned int <parameter>group</parameter></paramdef> 6240f8248bfSmrg </funcprototype> 6250f8248bfSmrg</funcsynopsis> 6260f8248bfSmrg<variablelist> 6270f8248bfSmrg <varlistentry> 6280f8248bfSmrg <term> 6290f8248bfSmrg <parameter>display</parameter> 6300f8248bfSmrg </term> 6310f8248bfSmrg <listitem> 6320f8248bfSmrg <para> 6330f8248bfSmrg connection to the X server 6340f8248bfSmrg </para> 6350f8248bfSmrg </listitem> 6360f8248bfSmrg </varlistentry> 6370f8248bfSmrg <varlistentry> 6380f8248bfSmrg <term> 6390f8248bfSmrg <parameter>device_spec</parameter> 6400f8248bfSmrg </term> 6410f8248bfSmrg <listitem> 6420f8248bfSmrg <para> 6430f8248bfSmrg device ID, or <symbol>XkbUseCoreKbd</symbol> 6440f8248bfSmrg </para> 6450f8248bfSmrg </listitem> 6460f8248bfSmrg </varlistentry> 6470f8248bfSmrg <varlistentry> 6480f8248bfSmrg <term> 6490f8248bfSmrg <parameter>group</parameter> 6500f8248bfSmrg </term> 6510f8248bfSmrg <listitem> 6520f8248bfSmrg <para> 6530f8248bfSmrg index of the keysym group to lock 6540f8248bfSmrg </para> 6550f8248bfSmrg </listitem> 6560f8248bfSmrg </varlistentry> 6570f8248bfSmrg</variablelist> 658e9fcaa8aSmrg 659e9fcaa8aSmrg<para> 6600f8248bfSmrg<function>XkbLockGroup</function> 6610f8248bfSmrgsends a request to the server to lock the specified 6620f8248bfSmrg<parameter>group</parameter> 6630f8248bfSmrgand does not wait for a reply. It returns 6640f8248bfSmrg<symbol>True</symbol> 6650f8248bfSmrgif the request was sent and 6660f8248bfSmrg<symbol>False</symbol> 6670f8248bfSmrgotherwise. 668e9fcaa8aSmrg</para> 669e9fcaa8aSmrg 670e9fcaa8aSmrg 671e9fcaa8aSmrg<para> 6720f8248bfSmrgTo latch the keysym group, use 6730f8248bfSmrg<function>XkbLatchGroup</function>. 674e9fcaa8aSmrg</para> 675e9fcaa8aSmrg 676e9fcaa8aSmrg 6770f8248bfSmrg<indexterm significance="preferred" zone="XkbLatchGroup"><primary><function>XkbLatchGroup</function></primary></indexterm> 6780f8248bfSmrg<funcsynopsis id="XkbLatchGroup"> 6790f8248bfSmrg <funcprototype> 6800f8248bfSmrg <funcdef>Bool <function>XkbLatchGroup</function></funcdef> 6810f8248bfSmrg<!-- ( 6820f8248bfSmrg<parameter>display, device_spec, group</parameter> 6830f8248bfSmrg) --> 6840f8248bfSmrg 6850f8248bfSmrg <paramdef>Display *<parameter>display</parameter></paramdef> 6860f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 6870f8248bfSmrg <paramdef>unsigned int <parameter>group</parameter></paramdef> 6880f8248bfSmrg </funcprototype> 6890f8248bfSmrg</funcsynopsis> 6900f8248bfSmrg<variablelist> 6910f8248bfSmrg <varlistentry> 6920f8248bfSmrg <term> 6930f8248bfSmrg <parameter>display</parameter> 6940f8248bfSmrg </term> 6950f8248bfSmrg <listitem> 6960f8248bfSmrg <para> 6970f8248bfSmrg connection to the X server 6980f8248bfSmrg </para> 6990f8248bfSmrg </listitem> 7000f8248bfSmrg </varlistentry> 7010f8248bfSmrg <varlistentry> 7020f8248bfSmrg <term> 7030f8248bfSmrg <parameter>device_spec</parameter> 7040f8248bfSmrg </term> 7050f8248bfSmrg <listitem> 7060f8248bfSmrg <para> 7070f8248bfSmrg device ID, or <symbol>XkbUseCoreKbd</symbol> 7080f8248bfSmrg </para> 7090f8248bfSmrg </listitem> 7100f8248bfSmrg </varlistentry> 7110f8248bfSmrg <varlistentry> 7120f8248bfSmrg <term> 7130f8248bfSmrg <parameter>group</parameter> 7140f8248bfSmrg </term> 7150f8248bfSmrg <listitem> 7160f8248bfSmrg <para> 7170f8248bfSmrg index of the keysym group to latch 7180f8248bfSmrg </para> 7190f8248bfSmrg </listitem> 7200f8248bfSmrg </varlistentry> 7210f8248bfSmrg</variablelist> 722e9fcaa8aSmrg 723e9fcaa8aSmrg<para> 7240f8248bfSmrg<function>XkbLatchGroup</function> 7250f8248bfSmrgsends a request to the server to latch the specified group and does not wait for a reply. It returns 7260f8248bfSmrg<symbol>True</symbol> 7270f8248bfSmrgif the request was sent and 7280f8248bfSmrg<symbol>False</symbol> 7290f8248bfSmrgotherwise. 730e9fcaa8aSmrg</para> 731e9fcaa8aSmrg 732e9fcaa8aSmrg 733e9fcaa8aSmrg</sect2> 734e9fcaa8aSmrg</sect1> 735eb411b4bSmrg<sect1 id='Determining_Keyboard_State'> 736e9fcaa8aSmrg<title>Determining Keyboard State</title> 737e9fcaa8aSmrg 7380f8248bfSmrg<indexterm significance="preferred" zone="Determining_Keyboard_State"> 7390f8248bfSmrg<primary><structname>XkbStateRec</structname></primary></indexterm> 7400f8248bfSmrg 741e9fcaa8aSmrg<para> 7420f8248bfSmrgXkb keyboard state may be represented in an 7430f8248bfSmrg<structname>XkbStateRec</structname> 7440f8248bfSmrgstructure: 745e9fcaa8aSmrg 7460f8248bfSmrg<programlisting> 747e9fcaa8aSmrgtypedef struct { 7480f8248bfSmrg unsigned char group; /* effective group index */ 7490f8248bfSmrg unsigned char base_group; /* base group index */ 7500f8248bfSmrg unsigned char latched_group; /* latched group index */ 7510f8248bfSmrg unsigned char locked_group; /* locked group index */ 7520f8248bfSmrg unsigned char mods; /* effective modifiers */ 7530f8248bfSmrg unsigned char base_mods; /* base modifiers */ 7540f8248bfSmrg unsigned char latched_mods; /* latched modifiers */ 7550f8248bfSmrg unsigned char locked_mods; /* locked modifiers */ 7560f8248bfSmrg unsigned char compat_state; /* effective group ⇒ modifiers */ 7570f8248bfSmrg unsigned char grab_mods; /* modifiers used for grabs */ 7580f8248bfSmrg unsigned char compat_grab_mods; /* mods used for compatibility 7590f8248bfSmrg mode grabs */ 7600f8248bfSmrg unsigned char lookup_mods; /* mods used to lookup symbols */ 7610f8248bfSmrg unsigned char compat_lookup_mods; /* mods used for compatibility 7620f8248bfSmrg lookup */ 7630f8248bfSmrg unsigned short ptr_buttons; /* 1 bit ⇒ corresponding 7640f8248bfSmrg pointer btn is down */ 7650f8248bfSmrg} <structname>XkbStateRec</structname>, *XkbStatePtr; 766e9fcaa8aSmrg</programlisting></para> 767e9fcaa8aSmrg 768e9fcaa8aSmrg<para> 7690f8248bfSmrgTo obtain the keyboard state, use 7700f8248bfSmrg<function>XkbGetState</function>. 771e9fcaa8aSmrg</para> 772e9fcaa8aSmrg 7730f8248bfSmrg<indexterm significance="preferred" zone="XkbGetState"><primary><function>XkbGetState</function></primary></indexterm> 7740f8248bfSmrg<funcsynopsis id="XkbGetState"> 7750f8248bfSmrg <funcprototype> 7760f8248bfSmrg <funcdef>Status <function>XkbGetState</function></funcdef> 7770f8248bfSmrg<!-- ( 7780f8248bfSmrg<parameter>display</parameter>, 7790f8248bfSmrg<parameter>device_spec</parameter>, 7800f8248bfSmrg<parameter>state_return</parameter> 7810f8248bfSmrg) --> 7820f8248bfSmrg 7830f8248bfSmrg <paramdef>Display *<parameter>display</parameter></paramdef> 7840f8248bfSmrg <paramdef>unsigned int <parameter>device_spec</parameter></paramdef> 7850f8248bfSmrg <paramdef>XkbStatePtr <parameter>state_return</parameter></paramdef> 7860f8248bfSmrg </funcprototype> 7870f8248bfSmrg</funcsynopsis> 7880f8248bfSmrg<variablelist> 7890f8248bfSmrg <varlistentry> 7900f8248bfSmrg <term> 7910f8248bfSmrg <parameter>display</parameter> 7920f8248bfSmrg </term> 7930f8248bfSmrg <listitem> 7940f8248bfSmrg <para> 7950f8248bfSmrg connection to the X server 7960f8248bfSmrg </para> 7970f8248bfSmrg </listitem> 7980f8248bfSmrg </varlistentry> 7990f8248bfSmrg <varlistentry> 8000f8248bfSmrg <term> 8010f8248bfSmrg <parameter>device_spec</parameter> 8020f8248bfSmrg </term> 8030f8248bfSmrg <listitem> 8040f8248bfSmrg <para> 8050f8248bfSmrg device ID, or <symbol>XkbUseCoreKbd</symbol> 8060f8248bfSmrg </para> 8070f8248bfSmrg </listitem> 8080f8248bfSmrg </varlistentry> 8090f8248bfSmrg <varlistentry> 8100f8248bfSmrg <term> 8110f8248bfSmrg <parameter>state_return</parameter> 8120f8248bfSmrg </term> 8130f8248bfSmrg <listitem> 8140f8248bfSmrg <para> 8150f8248bfSmrg backfilled with Xkb state 8160f8248bfSmrg </para> 8170f8248bfSmrg </listitem> 8180f8248bfSmrg </varlistentry> 8190f8248bfSmrg</variablelist> 820e9fcaa8aSmrg 821e9fcaa8aSmrg<para> 8220f8248bfSmrgThe 8230f8248bfSmrg<function>XkbGetState</function> 8240f8248bfSmrgfunction queries the server for the current keyboard state, waits for a reply, and then backfills 8250f8248bfSmrg<parameter>state_return</parameter> 8260f8248bfSmrgwith the results. 827e9fcaa8aSmrg</para> 828e9fcaa8aSmrg 829e9fcaa8aSmrg 830e9fcaa8aSmrg<para> 831e9fcaa8aSmrgAll 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. 832e9fcaa8aSmrg</para> 833e9fcaa8aSmrg 834e9fcaa8aSmrg 835e9fcaa8aSmrg</sect1> 836eb411b4bSmrg<sect1 id='Tracking_Keyboard_State'> 837e9fcaa8aSmrg<title>Tracking Keyboard State</title> 838e9fcaa8aSmrg 8390f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Keyboard_State"> 8400f8248bfSmrg<primary>events</primary><secondary><symbol>XkbStateNotify</symbol></secondary></indexterm> 8410f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Keyboard_State"> 8420f8248bfSmrg<primary><structname>XkbStateNotifyEvent</structname></primary></indexterm> 8430f8248bfSmrg 844e9fcaa8aSmrg<para> 8450f8248bfSmrgThe Xkb extension reports 8460f8248bfSmrg<symbol>XkbStateNotify</symbol> 8470f8248bfSmrgevents 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, 8480f8248bfSmrg<symbol>XkbStateNotify</symbol> 8490f8248bfSmrgevents are reported to all interested clients without regard to the current keyboard input focus or grab state. 850e9fcaa8aSmrg</para> 851e9fcaa8aSmrg 852e9fcaa8aSmrg 853e9fcaa8aSmrg<para> 8540f8248bfSmrgThere are many different types of Xkb state changes. Xkb defines an event 8550f8248bfSmrgdetail mask corresponding to each type of change. The event detail masks are 8560f8248bfSmrglisted in <link linkend="table5.3">Table 5.3</link>. 857e9fcaa8aSmrg</para> 858e9fcaa8aSmrg 8590f8248bfSmrg<table id='table5.3' frame='topbot'> 860e9fcaa8aSmrg<title>XkbStateNotify Event Detail Masks</title> 861eb411b4bSmrg<?dbfo keep-together="always" ?> 862eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'> 863eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/> 864eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/> 865e9fcaa8aSmrg<thead> 866eb411b4bSmrg <row rowsep='1'> 867e9fcaa8aSmrg <entry>Mask</entry> 868e9fcaa8aSmrg <entry>Value</entry> 869e9fcaa8aSmrg </row> 870e9fcaa8aSmrg</thead> 871e9fcaa8aSmrg<tbody> 872eb411b4bSmrg <row> 8730f8248bfSmrg <entry><symbol>XkbModifierStateMask</symbol></entry> 874e9fcaa8aSmrg <entry>(1L << 0)</entry> 875e9fcaa8aSmrg </row> 876eb411b4bSmrg <row> 8770f8248bfSmrg <entry><symbol>XkbModifierBaseMask</symbol></entry> 878e9fcaa8aSmrg <entry>(1L << 1)</entry> 879e9fcaa8aSmrg </row> 880eb411b4bSmrg <row> 8810f8248bfSmrg <entry><symbol>XkbModifierLatchMask</symbol></entry> 882e9fcaa8aSmrg <entry>(1L << 2)</entry> 883e9fcaa8aSmrg </row> 884eb411b4bSmrg <row> 8850f8248bfSmrg <entry><symbol>XkbModifierLockMask</symbol></entry> 886e9fcaa8aSmrg <entry>(1L << 3)</entry> 887e9fcaa8aSmrg </row> 888eb411b4bSmrg <row> 8890f8248bfSmrg <entry><symbol>XkbGroupStateMask</symbol></entry> 890e9fcaa8aSmrg <entry>(1L << 4)</entry> 891e9fcaa8aSmrg </row> 892eb411b4bSmrg <row> 8930f8248bfSmrg <entry><symbol>XkbGroupBaseMask</symbol></entry> 894e9fcaa8aSmrg <entry>(1L << 5)</entry> 895e9fcaa8aSmrg </row> 896eb411b4bSmrg <row> 8970f8248bfSmrg <entry><symbol>XkbGroupLatchMask</symbol></entry> 898e9fcaa8aSmrg <entry>(1L << 6)</entry> 899e9fcaa8aSmrg </row> 900eb411b4bSmrg <row> 9010f8248bfSmrg <entry><symbol>XkbGroupLockMask</symbol></entry> 902e9fcaa8aSmrg <entry>(1L << 7)</entry> 903e9fcaa8aSmrg </row> 904eb411b4bSmrg <row> 9050f8248bfSmrg <entry><symbol>XkbCompatStateMask</symbol></entry> 906e9fcaa8aSmrg <entry>(1L << 8)</entry> 907e9fcaa8aSmrg </row> 908eb411b4bSmrg <row> 9090f8248bfSmrg <entry><symbol>XkbGrabModsMask</symbol></entry> 910e9fcaa8aSmrg <entry>(1L << 9)</entry> 911e9fcaa8aSmrg </row> 912eb411b4bSmrg <row> 9130f8248bfSmrg <entry><symbol>XkbCompatGrabModsMask</symbol></entry> 914e9fcaa8aSmrg <entry>(1L << 10)</entry> 915e9fcaa8aSmrg </row> 916eb411b4bSmrg <row> 9170f8248bfSmrg <entry><symbol>XkbLookupModsMask</symbol></entry> 918e9fcaa8aSmrg <entry>(1L << 11)</entry> 919e9fcaa8aSmrg </row> 920eb411b4bSmrg <row> 9210f8248bfSmrg <entry><symbol>XkbCompatLookupModsMask</symbol></entry> 922e9fcaa8aSmrg <entry>(1L << 12)</entry> 923e9fcaa8aSmrg </row> 924eb411b4bSmrg <row> 9250f8248bfSmrg <entry><symbol>XkbPointerButtonMask</symbol></entry> 926e9fcaa8aSmrg <entry>(1L << 13)</entry> 927e9fcaa8aSmrg </row> 928eb411b4bSmrg <row> 9290f8248bfSmrg <entry><symbol>XkbAllStateComponentsMask</symbol></entry> 930e9fcaa8aSmrg <entry>(0x3fff)</entry> 931e9fcaa8aSmrg </row> 932e9fcaa8aSmrg</tbody> 933e9fcaa8aSmrg</tgroup> 934e9fcaa8aSmrg</table> 935e9fcaa8aSmrg 936e9fcaa8aSmrg<para> 9370f8248bfSmrgTo track changes in the keyboard state for a particular device, select to receive 9380f8248bfSmrg<symbol>XkbStateNotify</symbol> 9390f8248bfSmrgevents by calling either 9400f8248bfSmrg<function>XkbSelectEvents</function> 9410f8248bfSmrgor 9420f8248bfSmrg<function>XkbSelectEventDetails</function> 9430f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>). 944e9fcaa8aSmrg</para> 945e9fcaa8aSmrg 946e9fcaa8aSmrg 947e9fcaa8aSmrg<para> 9480f8248bfSmrgTo receive 9490f8248bfSmrg<symbol>XkbStateNotify</symbol> 9500f8248bfSmrgevents under all possible conditions, use 9510f8248bfSmrg<function>XkbSelectEvents</function> 9520f8248bfSmrgand pass 9530f8248bfSmrg<symbol>XkbStateNotifyMask</symbol> 9540f8248bfSmrgin both 9550f8248bfSmrg<parameter>bits_to_change</parameter> 9560f8248bfSmrgand 9570f8248bfSmrg<parameter>values_for_bits</parameter>. 958e9fcaa8aSmrg</para> 959e9fcaa8aSmrg 960e9fcaa8aSmrg 961e9fcaa8aSmrg<para> 9620f8248bfSmrgTo receive 9630f8248bfSmrg<symbol>XkbStateNotify</symbol> 9640f8248bfSmrgevents only under certain conditions, use 9650f8248bfSmrg<function>XkbSelectEventDetails</function> 9660f8248bfSmrgusing 9670f8248bfSmrg<symbol>XkbStateNotify</symbol> 9680f8248bfSmrgas the 9690f8248bfSmrg<structfield>event_type</structfield> 9700f8248bfSmrgand specifying the desired state changes in 9710f8248bfSmrg<parameter>bits_to_change</parameter> 9720f8248bfSmrgand 9730f8248bfSmrg<parameter>values_for_bits</parameter> 9740f8248bfSmrgusing mask bits from <link linkend="table5.3">Table 5.3</link>. 975e9fcaa8aSmrg</para> 976e9fcaa8aSmrg 977e9fcaa8aSmrg 978e9fcaa8aSmrg<para> 9790f8248bfSmrgThe structure for 9800f8248bfSmrg<symbol>XkbStateNotify</symbol> 9810f8248bfSmrgevents is: 982e9fcaa8aSmrg 9830f8248bfSmrg<programlisting> 984e9fcaa8aSmrgtypedef struct { 9850f8248bfSmrg int type; /* Xkb extension base event code */ 9860f8248bfSmrg unsigned long serial; /* X server serial number for event */ 9870f8248bfSmrg Bool send_event; /* <symbol>True</symbol> ⇒ synthetically generated */ 9880f8248bfSmrg Display * display; /* server connection where event generated */ 9890f8248bfSmrg Time time; /* server time when event generated */ 9900f8248bfSmrg int xkb_type; /* <symbol>XkbStateNotify</symbol> */ 9910f8248bfSmrg int device; /* Xkb device ID, 9920f8248bfSmrg will not be <symbol>XkbUseCoreKbd</symbol> */ 9930f8248bfSmrg unsigned int changed; /* bits indicating what has changed */ 9940f8248bfSmrg int group; /* group index of effective group */ 9950f8248bfSmrg int base_group; /* group index of base group */ 9960f8248bfSmrg int latched_group; /* group index of latched group */ 9970f8248bfSmrg int locked_group; /* group index of locked group */ 9980f8248bfSmrg unsigned int mods; /* effective modifiers */ 9990f8248bfSmrg unsigned int base_mods; /* base modifiers */ 10000f8248bfSmrg unsigned int latched_mods; /* latched modifiers */ 10010f8248bfSmrg unsigned int locked_mods; /* locked modifiers */ 10020f8248bfSmrg int compat_state; /* computed compatibility state */ 10030f8248bfSmrg unsigned char grab_mods; /* modifiers used for grabs */ 10040f8248bfSmrg unsigned char compat_grab_mods; /* modifiers used for compatibility grabs */ 10050f8248bfSmrg unsigned char lookup_mods; /* modifiers used to lookup symbols */ 10060f8248bfSmrg unsigned char compat_lookup_mods; /* mods used for compatibility look up */ 10070f8248bfSmrg int ptr_buttons; /* core pointer buttons */ 10080f8248bfSmrg KeyCode keycode; /* keycode causing event, 10090f8248bfSmrg 0 if programmatic */ 10100f8248bfSmrg char event_type; /* core event if <structfield>req_major</structfield> or <structfield>req_minor</structfield> 10110f8248bfSmrg non zero */ 10120f8248bfSmrg char req_major; /* major request code if program trigger, 10130f8248bfSmrg else 0 */ 10140f8248bfSmrg char req_minor; /* minor request code if program trigger, 10150f8248bfSmrg else 0 */ 10160f8248bfSmrg} <structname>XkbStateNotifyEvent</structname>; 1017e9fcaa8aSmrg</programlisting></para> 1018e9fcaa8aSmrg 1019e9fcaa8aSmrg<para> 10200f8248bfSmrgWhen you receive an 10210f8248bfSmrg<symbol>XkbStateNotify</symbol> 10220f8248bfSmrgevent, the 10230f8248bfSmrg<structfield>changed</structfield> 10240f8248bfSmrgfield indicates which elements of keyboard state have changed. 10250f8248bfSmrgThis will be the bitwise inclusive OR of one or more of the 10260f8248bfSmrg<symbol>XkbStateNotify</symbol> 10270f8248bfSmrgevent detail masks shown in <link linkend="table5.3">Table 5.3</link>. 10280f8248bfSmrgAll fields reported in the event are valid, but only those indicated in 10290f8248bfSmrg<structfield>changed</structfield> 10300f8248bfSmrghave changed values. 1031e9fcaa8aSmrg</para> 1032e9fcaa8aSmrg 1033e9fcaa8aSmrg 1034e9fcaa8aSmrg<para> 10350f8248bfSmrgThe 10360f8248bfSmrg<structfield>group</structfield> 10370f8248bfSmrgfield is the group index of the effective keysym group. The 10380f8248bfSmrg<structfield>base_group</structfield>, 10390f8248bfSmrg<structfield>latched_group</structfield>, 10400f8248bfSmrgand 10410f8248bfSmrg<structfield>locked_group</structfield> 10420f8248bfSmrgfields are set to a group index value representing the base group, 1043e9fcaa8aSmrgthe latched group, and the locked group, respectively. The X 1044e9fcaa8aSmrgserver can set the modifier and compatibility state fields to 1045e9fcaa8aSmrga union of the core modifier mask bits; this union represents the 10460f8248bfSmrgcorresponding modifier states. The <structfield>ptr_buttons</structfield> 10470f8248bfSmrgfield gives the state of the core pointer buttons as a 1048e9fcaa8aSmrgmask composed of an inclusive OR of zero or more of the 1049e9fcaa8aSmrgcore pointer button masks. 1050e9fcaa8aSmrg</para> 1051e9fcaa8aSmrg 1052e9fcaa8aSmrg 1053e9fcaa8aSmrg<para> 1054e9fcaa8aSmrgXkb state changes can occur either in response to keyboard 1055e9fcaa8aSmrgactivity or under application control. If a key event 10560f8248bfSmrgcaused the state change, the 10570f8248bfSmrg<structfield>keycode</structfield> 10580f8248bfSmrgfield gives the keycode of the key event, and the 10590f8248bfSmrg<structfield>event_type</structfield> 10600f8248bfSmrgfield is set to either <symbol>KeyPress</symbol> 10610f8248bfSmrgor 10620f8248bfSmrg<symbol>KeyRelease</symbol>. 10630f8248bfSmrgIf a pointer button event caused the state change, the 10640f8248bfSmrg<structfield>keycode</structfield> 10650f8248bfSmrgfield is zero, and the <structfield>event_type</structfield> 10660f8248bfSmrgfield is set to either <symbol>ButtonPress</symbol> 10670f8248bfSmrgor <symbol>ButtonRelease</symbol>. 10680f8248bfSmrgOtherwise, the major and minor codes of the request that caused the 10690f8248bfSmrgstate change are given in the 10700f8248bfSmrg<structfield>req_major</structfield> 10710f8248bfSmrgand 10720f8248bfSmrg<structfield>req_minor</structfield> 10730f8248bfSmrgfields, and the 10740f8248bfSmrg<structfield>keycode</structfield> 10750f8248bfSmrgfield is zero. The 10760f8248bfSmrg<structfield>req_major</structfield> 10770f8248bfSmrgvalue is the same as the major extension opcode. 1078e9fcaa8aSmrg</para> 1079e9fcaa8aSmrg</sect1> 1080e9fcaa8aSmrg</chapter> 1081