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='Xkb_Server_Keyboard_Mapping'>
5e9fcaa8aSmrg<title>Xkb Server Keyboard Mapping</title>
6e9fcaa8aSmrg
70f8248bfSmrg<indexterm zone="Xkb_Server_Keyboard_Mapping">
80f8248bfSmrg<primary>server map</primary></indexterm>
90f8248bfSmrg<indexterm zone="Xkb_Server_Keyboard_Mapping">
100f8248bfSmrg<primary>map</primary><secondary>server</secondary></indexterm>
110f8248bfSmrg
12e9fcaa8aSmrg<para>
130f8248bfSmrgThe
140f8248bfSmrg<structfield>server</structfield>
150f8248bfSmrgfield of the complete Xkb keyboard description (see <link linkend="The_XkbDescRec_Structure">section 6.1</link>) is a pointer
16e9fcaa8aSmrgto the Xkb server map.
17e9fcaa8aSmrg</para>
18e9fcaa8aSmrg
19e9fcaa8aSmrg
20e9fcaa8aSmrg<para>
210f8248bfSmrg<link linkend="figure16.1">Figure 16.1</link> shows the relationships between elements in the server map:
22e9fcaa8aSmrg</para>
23e9fcaa8aSmrg
240f8248bfSmrg<figure id='figure16.1'>
250f8248bfSmrg  <title>Server Map Relationships</title>
260f8248bfSmrg  <mediaobject>
270f8248bfSmrg   <imageobject> <imagedata format="SVG" fileref="XKBlib-16.svg"/>
280f8248bfSmrg   </imageobject>
290f8248bfSmrg   </mediaobject>
300f8248bfSmrg</figure>
31e9fcaa8aSmrg
32e9fcaa8aSmrg
33e9fcaa8aSmrg<!--
34e9fcaa8aSmrg<H5 CLASS="Figure">
35e9fcaa8aSmrgServer Map Relationships</H5>
36e9fcaa8aSmrg-->
37e9fcaa8aSmrg
380f8248bfSmrg<para id='XkbServerMapRec'>
390f8248bfSmrg<indexterm significance="preferred" zone="XkbServerMapRec">
400f8248bfSmrg<primary><structname>XkbServerMapRec</structname></primary></indexterm>
41e9fcaa8aSmrgThe Xkb server map contains the information the server needs to interpret key
420f8248bfSmrgevents and is of type
430f8248bfSmrg<structname>XkbServerMapRec</structname>:
44e9fcaa8aSmrg
450f8248bfSmrg<programlisting>
46e9fcaa8aSmrg#define XkbNumVirtualMods            16
47e9fcaa8aSmrg
480f8248bfSmrgtypedef struct {                       /* Server Map */
490f8248bfSmrg    unsigned short     num_acts;       /* # of occupied entries in <structfield>acts</structfield> */
500f8248bfSmrg    unsigned short     size_acts;      /* # of entries in <structfield>acts</structfield> */
510f8248bfSmrg    XkbAction *        acts;           /* linear 2d tables of key actions,
520f8248bfSmrg                                          1 per keycode */
530f8248bfSmrg    XkbBehavior *      behaviors;      /* key behaviors, 1 per keycode */
540f8248bfSmrg    unsigned short *   key_acts;       /* index into <structfield>acts</structfield>, 1 per keycode */
550f8248bfSmrg    unsigned char *    explicit;       /* explicit overrides of core
560f8248bfSmrg                                          remapping, 1 per key */
570f8248bfSmrg    unsigned char      vmods[XkbNumVirtualMods];  /* real mods bound
580f8248bfSmrg                                                     to virtual mods */
590f8248bfSmrg    unsigned short *   vmodmap;        /* virtual mods bound to key,
600f8248bfSmrg                                          1 per keycode */
610f8248bfSmrg} <structname>XkbServerMapRec</structname>, *XkbServerMapPtr;
62e9fcaa8aSmrg</programlisting></para>
63e9fcaa8aSmrg
64e9fcaa8aSmrg<para>
650f8248bfSmrgThe
660f8248bfSmrg<structfield>num_acts</structfield>,
670f8248bfSmrg<structfield>size_acts</structfield>,
680f8248bfSmrg<structfield>acts</structfield>,
690f8248bfSmrgand
700f8248bfSmrg<structfield>key_acts</structfield>
710f8248bfSmrgfields specify the key actions, defined in <link linkend="Key_Actions">section 16.1</link>. The
720f8248bfSmrg<structfield>behaviors</structfield>
730f8248bfSmrgfield describes the behavior for each key and is defined in <link linkend="Key_Behavior">section 16.2</link>. The
740f8248bfSmrg<structfield>explicit</structfield>
750f8248bfSmrgfield describes the explicit components for a key and is defined in
760f8248bfSmrg<link linkend="Explicit_ComponentsAvoiding_Automatic_Remapping_by_the_Server">section 16.3</link>. The
770f8248bfSmrg<structfield>vmods</structfield>
780f8248bfSmrgand the
790f8248bfSmrg<structfield>vmodmap</structfield>
800f8248bfSmrgfields describe the virtual modifiers and the per-key virtual modifier mapping
810f8248bfSmrgand are defined in <link linkend="Virtual_Modifier_Mapping">section 16.4</link>.
82e9fcaa8aSmrg</para>
83e9fcaa8aSmrg
84eb411b4bSmrg<sect1 id='Key_Actions'>
85e9fcaa8aSmrg<title>Key Actions</title>
86e9fcaa8aSmrg
87e9fcaa8aSmrg<para>
88e9fcaa8aSmrgA key action defines the effect key presses and releases have on the internal
89e9fcaa8aSmrgstate of the server. For example, the expected key action associated with
900f8248bfSmrgpressing the
910f8248bfSmrg<symbol>Shift</symbol>
920f8248bfSmrgkey is to set the
930f8248bfSmrg<symbol>Shift</symbol>
940f8248bfSmrgmodifier. There is zero or one key action associated with each keysym bound to
95e9fcaa8aSmrgeach key.
96e9fcaa8aSmrg</para>
97e9fcaa8aSmrg
98e9fcaa8aSmrg
99e9fcaa8aSmrg<para>
100e9fcaa8aSmrgJust as the entire list of key symbols for the keyboard mapping is held in the
1010f8248bfSmrg<structfield>syms</structfield>
1020f8248bfSmrgfield of the client map, the entire list of key actions for the keyboard
1030f8248bfSmrgmapping is held in the
1040f8248bfSmrg<structfield>acts</structfield>
1050f8248bfSmrgarray of the server map. The total size of
1060f8248bfSmrg<structfield>acts</structfield>
1070f8248bfSmrgis specified by
1080f8248bfSmrg<structfield>size_acts</structfield>,
1090f8248bfSmrgand the number of entries is specified by
1100f8248bfSmrg<structfield>num_acts</structfield>.
1110f8248bfSmrg</para>
1120f8248bfSmrg
1130f8248bfSmrg
1140f8248bfSmrg<para>
1150f8248bfSmrgThe
1160f8248bfSmrg<structfield>key_acts</structfield>
1170f8248bfSmrgarray, indexed by keycode, describes the actions associated with a key. The
1180f8248bfSmrg<structfield>key_acts</structfield>
1190f8248bfSmrgarray has
1200f8248bfSmrg<structfield>min_key_code</structfield>
1210f8248bfSmrgunused entries at the start to allow direct indexing using a keycode. If a
1220f8248bfSmrg<structfield>key_acts</structfield>
1230f8248bfSmrgentry is
1240f8248bfSmrg<emphasis>zero</emphasis>,
1250f8248bfSmrgit means the key does not have any actions associated with it. If an entry is
1260f8248bfSmrgnot
1270f8248bfSmrg<emphasis>zero</emphasis>,
1280f8248bfSmrgthe entry represents an index into the
1290f8248bfSmrg<structfield>acts</structfield>
1300f8248bfSmrgfield of the server map, much as the
1310f8248bfSmrg<structfield>offset</structfield>
1320f8248bfSmrgfield of a
1330f8248bfSmrg<structname>KeySymMapRec</structname>
1340f8248bfSmrgstructure is an index into the
1350f8248bfSmrg<structfield>syms</structfield>
1360f8248bfSmrgfield of the client map.
1370f8248bfSmrg</para>
1380f8248bfSmrg
1390f8248bfSmrg<para>
1400f8248bfSmrgThe reason the
1410f8248bfSmrg<structfield>acts</structfield>
1420f8248bfSmrgfield is a linear list of
1430f8248bfSmrg<structname>XkbAction</structname>s
1440f8248bfSmrgis to reduce the memory consumption associated with a keymap. Because Xkb
145e9fcaa8aSmrgallows individual keys to have multiple shift levels and a different number of
1460f8248bfSmrggroups per key, a single two-dimensional array of
1470f8248bfSmrg<type>KeySym</type>s
1480f8248bfSmrgwould potentially be very large and sparse. Instead, Xkb provides a small
1490f8248bfSmrgtwo-dimensional array of
1500f8248bfSmrg<structname>XkbAction</structname>s
1510f8248bfSmrgfor each key. To store all of these individual arrays, Xkb concatenates each
1520f8248bfSmrgarray together in the
1530f8248bfSmrg<structfield>acts</structfield>
1540f8248bfSmrgfield of the server map.
155e9fcaa8aSmrg</para>
156e9fcaa8aSmrg
157e9fcaa8aSmrg
158e9fcaa8aSmrg<para>
159e9fcaa8aSmrgThe key action structures consist only of fields of type char or unsigned char.
160e9fcaa8aSmrgThis is done to optimize data transfer when the server sends bytes over the
161e9fcaa8aSmrgwire. If the fields are anything but bytes, the server has to sift through all
162e9fcaa8aSmrgof the actions and swap any nonbyte fields. Because they consist of nothing but
163e9fcaa8aSmrgbytes, it can just copy them out.
164e9fcaa8aSmrg</para>
165e9fcaa8aSmrg
166e9fcaa8aSmrg
167e9fcaa8aSmrg<para>
168e9fcaa8aSmrgXkb provides the following macros, to simplify accessing information pertaining
169e9fcaa8aSmrgto key actions:
170e9fcaa8aSmrg</para>
171e9fcaa8aSmrg
1720f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyHasActions"><primary><function>XkbKeyHasActions</function></primary></indexterm>
1730f8248bfSmrg<funcsynopsis id="XkbKeyHasActions">
1740f8248bfSmrg  <funcprototype>
1750f8248bfSmrg    <funcdef>Bool <function>XkbKeyHasActions</function></funcdef>
1760f8248bfSmrg<!-- (
1770f8248bfSmrg<parameter>xkb, keycode</parameter>
1780f8248bfSmrg)                              /* macro */ -->
1790f8248bfSmrg
1800f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
1810f8248bfSmrg    <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
1820f8248bfSmrg  </funcprototype>
1830f8248bfSmrg</funcsynopsis>
1840f8248bfSmrg<variablelist>
1850f8248bfSmrg  <varlistentry>
1860f8248bfSmrg    <term>
1870f8248bfSmrg      <parameter>xkb</parameter>
1880f8248bfSmrg    </term>
1890f8248bfSmrg    <listitem>
1900f8248bfSmrg      <para>
1910f8248bfSmrg        Xkb description of interest
1920f8248bfSmrg      </para>
1930f8248bfSmrg    </listitem>
1940f8248bfSmrg  </varlistentry>
1950f8248bfSmrg  <varlistentry>
1960f8248bfSmrg    <term>
1970f8248bfSmrg      <parameter>keycode</parameter>
1980f8248bfSmrg    </term>
1990f8248bfSmrg    <listitem>
2000f8248bfSmrg      <para>
2010f8248bfSmrg        keycode of interest
2020f8248bfSmrg      </para>
2030f8248bfSmrg    </listitem>
2040f8248bfSmrg  </varlistentry>
2050f8248bfSmrg</variablelist>
2060f8248bfSmrg
2070f8248bfSmrg<para>
2080f8248bfSmrg<function>XkbKeyHasActions</function>
2090f8248bfSmrgreturns
2100f8248bfSmrg<symbol>True</symbol>
2110f8248bfSmrgif the key corresponding to
2120f8248bfSmrg<parameter>keycode</parameter>
2130f8248bfSmrghas any actions associated with it; otherwise, it returns
2140f8248bfSmrg<symbol>False</symbol>.
2150f8248bfSmrg</para>
2160f8248bfSmrg
2170f8248bfSmrg
2180f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyNumActions"><primary><function>XkbKeyNumActions</function></primary></indexterm>
2190f8248bfSmrg<funcsynopsis id="XkbKeyNumActions">
2200f8248bfSmrg  <funcprototype>
2210f8248bfSmrg    <funcdef>int <function>XkbKeyNumActions</function></funcdef>
2220f8248bfSmrg<!-- (
2230f8248bfSmrg<parameter>xkb, keycode</parameter>
2240f8248bfSmrg)                              /* macro */ -->
2250f8248bfSmrg
2260f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
2270f8248bfSmrg    <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
2280f8248bfSmrg  </funcprototype>
2290f8248bfSmrg</funcsynopsis>
2300f8248bfSmrg<variablelist>
2310f8248bfSmrg  <varlistentry>
2320f8248bfSmrg    <term>
2330f8248bfSmrg      <parameter>xkb</parameter>
2340f8248bfSmrg    </term>
2350f8248bfSmrg    <listitem>
2360f8248bfSmrg      <para>
2370f8248bfSmrg        Xkb description of interest
2380f8248bfSmrg      </para>
2390f8248bfSmrg    </listitem>
2400f8248bfSmrg  </varlistentry>
2410f8248bfSmrg  <varlistentry>
2420f8248bfSmrg    <term>
2430f8248bfSmrg      <parameter>keycode</parameter>
2440f8248bfSmrg    </term>
2450f8248bfSmrg    <listitem>
2460f8248bfSmrg      <para>
2470f8248bfSmrg        keycode of interest
2480f8248bfSmrg      </para>
2490f8248bfSmrg    </listitem>
2500f8248bfSmrg  </varlistentry>
2510f8248bfSmrg</variablelist>
2520f8248bfSmrg
2530f8248bfSmrg<para>
2540f8248bfSmrg<function>XkbKeyNumActions</function>
2550f8248bfSmrgcomputes the number of actions associated with the key corresponding to
2560f8248bfSmrg<parameter>keycode</parameter>.
2570f8248bfSmrgThis should be the same value as the result of
2580f8248bfSmrg<function>XkbKeyNumSyms</function>
2590f8248bfSmrg(see <link linkend="Key_Width">section 15.3.3</link>).
2600f8248bfSmrg</para>
2610f8248bfSmrg
2620f8248bfSmrg
2630f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyActionsPtr"><primary><function>XkbKeyActionsPtr</function></primary></indexterm>
2640f8248bfSmrg<funcsynopsis id="XkbKeyActionsPtr">
2650f8248bfSmrg  <funcprototype>
2660f8248bfSmrg    <funcdef>XkbKeyActionPtr <function>XkbKeyActionsPtr</function></funcdef>
2670f8248bfSmrg<!-- (
2680f8248bfSmrg<parameter>xkb, keycode</parameter>
2690f8248bfSmrg)                              /* macro */ -->
2700f8248bfSmrg
2710f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
2720f8248bfSmrg    <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
2730f8248bfSmrg  </funcprototype>
2740f8248bfSmrg</funcsynopsis>
2750f8248bfSmrg<variablelist>
2760f8248bfSmrg  <varlistentry>
2770f8248bfSmrg    <term>
2780f8248bfSmrg      <parameter>xkb</parameter>
2790f8248bfSmrg    </term>
2800f8248bfSmrg    <listitem>
2810f8248bfSmrg      <para>
2820f8248bfSmrg        Xkb description of interest
2830f8248bfSmrg      </para>
2840f8248bfSmrg    </listitem>
2850f8248bfSmrg  </varlistentry>
2860f8248bfSmrg  <varlistentry>
2870f8248bfSmrg    <term>
2880f8248bfSmrg      <parameter>keycode</parameter>
2890f8248bfSmrg    </term>
2900f8248bfSmrg    <listitem>
2910f8248bfSmrg      <para>
2920f8248bfSmrg        keycode of interest
2930f8248bfSmrg      </para>
2940f8248bfSmrg    </listitem>
2950f8248bfSmrg  </varlistentry>
2960f8248bfSmrg</variablelist>
2970f8248bfSmrg
2980f8248bfSmrg<para>
2990f8248bfSmrg<function>XkbKeyActionsPtr</function>
3000f8248bfSmrgreturns a pointer to the two-dimensional array of key actions associated with
3010f8248bfSmrgthe key corresponding to
3020f8248bfSmrg<parameter>keycode</parameter>.
3030f8248bfSmrgUse
3040f8248bfSmrg<function>XkbKeyActionsPtr</function>
3050f8248bfSmrgonly if the key actually has some actions associated with it, that is,
3060f8248bfSmrg<function>XkbKeyNumActions</function>
307e9fcaa8aSmrg(xkb, keycode) returns something greater than zero.
308e9fcaa8aSmrg</para>
309e9fcaa8aSmrg
310e9fcaa8aSmrg
3110f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyAction"><primary><function>XkbKeyAction</function></primary></indexterm>
3120f8248bfSmrg<funcsynopsis id="XkbKeyAction">
3130f8248bfSmrg  <funcprototype>
3140f8248bfSmrg    <funcdef>XkbAction <function>XkbKeyAction</function></funcdef>
3150f8248bfSmrg<!-- (
3160f8248bfSmrg<parameter>xkb, keycode, idx</parameter>
3170f8248bfSmrg)                              /* macro */ -->
3180f8248bfSmrg
3190f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
3200f8248bfSmrg    <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
3210f8248bfSmrg    <paramdef>int <parameter>idx</parameter></paramdef>
3220f8248bfSmrg  </funcprototype>
3230f8248bfSmrg</funcsynopsis>
3240f8248bfSmrg<variablelist>
3250f8248bfSmrg  <varlistentry>
3260f8248bfSmrg    <term>
3270f8248bfSmrg      <parameter>xkb</parameter>
3280f8248bfSmrg    </term>
3290f8248bfSmrg    <listitem>
3300f8248bfSmrg      <para>
3310f8248bfSmrg        Xkb description of interest
3320f8248bfSmrg      </para>
3330f8248bfSmrg    </listitem>
3340f8248bfSmrg  </varlistentry>
3350f8248bfSmrg  <varlistentry>
3360f8248bfSmrg    <term>
3370f8248bfSmrg      <parameter>keycode</parameter>
3380f8248bfSmrg    </term>
3390f8248bfSmrg    <listitem>
3400f8248bfSmrg      <para>
3410f8248bfSmrg        keycode of interest
3420f8248bfSmrg      </para>
3430f8248bfSmrg    </listitem>
3440f8248bfSmrg  </varlistentry>
3450f8248bfSmrg  <varlistentry>
3460f8248bfSmrg    <term>
3470f8248bfSmrg      <parameter>idx</parameter>
3480f8248bfSmrg    </term>
3490f8248bfSmrg    <listitem>
3500f8248bfSmrg      <para>
3510f8248bfSmrg        index for group and shift level
3520f8248bfSmrg      </para>
3530f8248bfSmrg    </listitem>
3540f8248bfSmrg  </varlistentry>
3550f8248bfSmrg</variablelist>
356e9fcaa8aSmrg
357e9fcaa8aSmrg<para>
3580f8248bfSmrg<function>XkbKeyAction</function>
3590f8248bfSmrgreturns the key action indexed by
3600f8248bfSmrg<parameter>idx</parameter>
3610f8248bfSmrgin the two-dimensional array of key actions associated with the key
3620f8248bfSmrgcorresponding to
3630f8248bfSmrg<parameter>keycode</parameter>.
3640f8248bfSmrg<parameter>idx</parameter>
3650f8248bfSmrgmay be computed from the group and shift level of interest as follows:
366e9fcaa8aSmrg</para>
367e9fcaa8aSmrg
368e9fcaa8aSmrg<literallayout>
369e9fcaa8aSmrg     idx = group_index * key_width + shift_level
370e9fcaa8aSmrg</literallayout>
371e9fcaa8aSmrg
3720f8248bfSmrg<indexterm significance="preferred" zone="XkbKeyActionEntry"><primary><function>XkbKeyActionEntry</function></primary></indexterm>
3730f8248bfSmrg<funcsynopsis id="XkbKeyActionEntry">
3740f8248bfSmrg  <funcprototype>
3750f8248bfSmrg    <funcdef>XkbAction <function>XkbKeyActionEntry</function></funcdef>
3760f8248bfSmrg<!-- (
3770f8248bfSmrg<parameter>xkb, keycode, shift, grp</parameter>
3780f8248bfSmrg)                              /* macro */ -->
3790f8248bfSmrg
3800f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
3810f8248bfSmrg    <paramdef>KeyCode <parameter>keycode</parameter></paramdef>
3820f8248bfSmrg    <paramdef>int <parameter>shift</parameter></paramdef>
3830f8248bfSmrg    <paramdef>int <parameter>grp</parameter></paramdef>
3840f8248bfSmrg  </funcprototype>
3850f8248bfSmrg</funcsynopsis>
3860f8248bfSmrg<variablelist>
3870f8248bfSmrg  <varlistentry>
3880f8248bfSmrg    <term>
3890f8248bfSmrg      <parameter>xkb</parameter>
3900f8248bfSmrg    </term>
3910f8248bfSmrg    <listitem>
3920f8248bfSmrg      <para>
3930f8248bfSmrg        Xkb description of interest
3940f8248bfSmrg      </para>
3950f8248bfSmrg    </listitem>
3960f8248bfSmrg  </varlistentry>
3970f8248bfSmrg  <varlistentry>
3980f8248bfSmrg    <term>
3990f8248bfSmrg      <parameter>keycode</parameter>
4000f8248bfSmrg    </term>
4010f8248bfSmrg    <listitem>
4020f8248bfSmrg      <para>
4030f8248bfSmrg        keycode of interest
4040f8248bfSmrg      </para>
4050f8248bfSmrg    </listitem>
4060f8248bfSmrg  </varlistentry>
4070f8248bfSmrg  <varlistentry>
4080f8248bfSmrg    <term>
4090f8248bfSmrg      <parameter>shift</parameter>
4100f8248bfSmrg    </term>
4110f8248bfSmrg    <listitem>
4120f8248bfSmrg      <para>
4130f8248bfSmrg        shift level within group
4140f8248bfSmrg      </para>
4150f8248bfSmrg    </listitem>
4160f8248bfSmrg  </varlistentry>
4170f8248bfSmrg  <varlistentry>
4180f8248bfSmrg    <term>
4190f8248bfSmrg      <parameter>grp</parameter>
4200f8248bfSmrg    </term>
4210f8248bfSmrg    <listitem>
4220f8248bfSmrg      <para>
4230f8248bfSmrg        group index for group of interest
4240f8248bfSmrg      </para>
4250f8248bfSmrg    </listitem>
4260f8248bfSmrg  </varlistentry>
4270f8248bfSmrg</variablelist>
428e9fcaa8aSmrg
429e9fcaa8aSmrg<para>
4300f8248bfSmrg<function>XkbKeyActionEntry</function>
4310f8248bfSmrgreturns the key action corresponding to group
4320f8248bfSmrg<parameter>grp</parameter>
4330f8248bfSmrgand shift level
4340f8248bfSmrg<parameter>shift</parameter>
4350f8248bfSmrgfrom the two-dimensional table of key actions associated with the key
4360f8248bfSmrgcorresponding to
4370f8248bfSmrg<parameter>keycode</parameter>.
438e9fcaa8aSmrg</para>
439e9fcaa8aSmrg
440e9fcaa8aSmrg
441eb411b4bSmrg<sect2 id='The_XkbAction_Structure'>
442e9fcaa8aSmrg<title>The XkbAction Structure</title>
4430f8248bfSmrg<indexterm significance="preferred" zone="The_XkbAction_Structure">
4440f8248bfSmrg<primary><structname>XkbAction</structname></primary></indexterm>
445e9fcaa8aSmrg
446e9fcaa8aSmrg<para>
4470f8248bfSmrgThe description for an action is held in an
4480f8248bfSmrg<structname>XkbAction</structname>
4490f8248bfSmrgstructure, which is a union of all possible Xkb action types:
450e9fcaa8aSmrg
4510f8248bfSmrg<programlisting>
452e9fcaa8aSmrgtypedef union _XkbAction {
4530f8248bfSmrg    XkbAnyAction              any;
4540f8248bfSmrg    XkbModAction              mods;
4550f8248bfSmrg    XkbGroupAction            group;
4560f8248bfSmrg    XkbISOAction              iso;
4570f8248bfSmrg    XkbPtrAction              ptr;
4580f8248bfSmrg    XkbPtrBtnAction           btn;
4590f8248bfSmrg    XkbPtrDfltAction          dflt;
4600f8248bfSmrg    XkbSwitchScreenAction     screen;
4610f8248bfSmrg    XkbCtrlsAction            ctrls;
4620f8248bfSmrg    XkbMessageAction          msg;
4630f8248bfSmrg    XkbRedirectKeyAction      redirect;
4640f8248bfSmrg    XkbDeviceBtnAction        devbtn;
4650f8248bfSmrg    XkbDeviceValuatorAction   devval;
4660f8248bfSmrg    unsigned char             type;
4670f8248bfSmrg} <structname>XkbAction</structname>;
468e9fcaa8aSmrg</programlisting></para>
469e9fcaa8aSmrg
470e9fcaa8aSmrg<para>
4710f8248bfSmrgThe
4720f8248bfSmrg<structfield>type</structfield>
4730f8248bfSmrgfield is provided for convenience and is the same as the type field in the
474e9fcaa8aSmrgindividual structures. The following sections describe the individual
475e9fcaa8aSmrgstructures for each action in detail.
476e9fcaa8aSmrg</para>
477e9fcaa8aSmrg
478e9fcaa8aSmrg
479e9fcaa8aSmrg</sect2>
480eb411b4bSmrg<sect2 id='The_XkbAnyAction_Structure'>
481e9fcaa8aSmrg<title>The XkbAnyAction Structure</title>
4820f8248bfSmrg<indexterm significance="preferred" zone="The_XkbAnyAction_Structure">
4830f8248bfSmrg<primary><structname>XkbAnyAction</structname></primary></indexterm>
484e9fcaa8aSmrg
485e9fcaa8aSmrg<para>
4860f8248bfSmrgThe
4870f8248bfSmrg<structname>XkbAnyAction</structname>
4880f8248bfSmrgstructure is a convenience structure that refers to any of the actions:
489e9fcaa8aSmrg
4900f8248bfSmrg<programlisting>
491e9fcaa8aSmrg#define      XkbAnyActionDataSize       7
492e9fcaa8aSmrg
493e9fcaa8aSmrgtypedef struct _XkbAnyAction {
4940f8248bfSmrg    unsigned char    type;            /* type of action; determines interpretation for data */
4950f8248bfSmrg    unsigned char    data[XkbAnyActionDataSize];
4960f8248bfSmrg} <structname>XkbAnyAction</structname>;
497e9fcaa8aSmrg</programlisting></para>
498e9fcaa8aSmrg
499e9fcaa8aSmrg<para>
5000f8248bfSmrgThe
5010f8248bfSmrg<structfield>data</structfield>
5020f8248bfSmrgfield represents a structure for an action, and its interpretation depends on
5030f8248bfSmrgthe
5040f8248bfSmrg<structfield>type</structfield>
5050f8248bfSmrgfield. The valid values for the
5060f8248bfSmrg<structfield>type</structfield>
5070f8248bfSmrgfield, and the data structures associated with them are shown in
5080f8248bfSmrg<link linkend="table16.1">Table 16.1</link>:
509e9fcaa8aSmrg</para>
510e9fcaa8aSmrg
5110f8248bfSmrg<table id='table16.1' frame='topbot'>
512e9fcaa8aSmrg<title>Action Types</title>
513eb411b4bSmrg<?dbfo keep-together="always" ?>
514eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'>
515eb411b4bSmrg<colspec colname='c1' colwidth='1.8*'/>
516eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
517eb411b4bSmrg<colspec colname='c3' colwidth='1.5*'/>
518eb411b4bSmrg<colspec colname='c4' colwidth='1.0*'/>
519e9fcaa8aSmrg<thead>
520eb411b4bSmrg<row rowsep='1'>
521e9fcaa8aSmrg  <entry>Type</entry>
522e9fcaa8aSmrg  <entry>Structure for Data</entry>
523e9fcaa8aSmrg  <entry>XkbAction Union Member</entry>
524e9fcaa8aSmrg  <entry>Section</entry>
525e9fcaa8aSmrg</row>
526e9fcaa8aSmrg</thead>
527e9fcaa8aSmrg<tbody>
528eb411b4bSmrg  <row>
5290f8248bfSmrg    <entry><symbol>XkbSA_NoAction</symbol></entry>
530e9fcaa8aSmrg    <entry>
5310f8248bfSmrg<symbol>XkbSA_NoAction</symbol>
5320f8248bfSmrgmeans the server does not perform an action for the key; this action does not
533e9fcaa8aSmrghave an associated data structure.
534e9fcaa8aSmrg    </entry>
535e9fcaa8aSmrg    <entry>any</entry>
536e9fcaa8aSmrg    <entry></entry>
537e9fcaa8aSmrg  </row>
538eb411b4bSmrg  <row>
539e9fcaa8aSmrg    <entry>
5400f8248bfSmrg<para><symbol>XkbSA_SetMods</symbol></para>
5410f8248bfSmrg<para><symbol>XkbSA_LatchMods</symbol></para>
5420f8248bfSmrg<para><symbol>XkbSA_LockMods</symbol></para>
543e9fcaa8aSmrg    </entry>
5440f8248bfSmrg    <entry><para><structname>XkbModAction</structname></para></entry>
545e9fcaa8aSmrg    <entry>mods</entry>
5460f8248bfSmrg    <entry><link linkend="Actions_for_Changing_Modifiers_State">16.1.3</link></entry>
547e9fcaa8aSmrg  </row>
548eb411b4bSmrg  <row>
549e9fcaa8aSmrg    <entry>
5500f8248bfSmrg<para><symbol>XkbSA_SetGroup</symbol></para>
5510f8248bfSmrg<para><symbol>XkbSA_LatchGroup</symbol></para>
5520f8248bfSmrg<para><symbol>XkbSA_LockGroup</symbol></para>
553e9fcaa8aSmrg    </entry>
5540f8248bfSmrg    <entry><structname>XkbGroupAction</structname></entry>
555e9fcaa8aSmrg    <entry>group</entry>
5560f8248bfSmrg    <entry><link linkend="Actions_for_Changing_Group_State">16.1.4</link></entry>
557e9fcaa8aSmrg  </row>
558eb411b4bSmrg  <row>
5590f8248bfSmrg    <entry><symbol>XkbSA_MovePtr</symbol></entry>
5600f8248bfSmrg    <entry><structname>XkbPtrAction</structname></entry>
561e9fcaa8aSmrg    <entry>ptr</entry>
5620f8248bfSmrg    <entry><link linkend="Actions_for_Moving_the_Pointer">16.1.5</link></entry>
563e9fcaa8aSmrg  </row>
564eb411b4bSmrg  <row>
565e9fcaa8aSmrg    <entry>
5660f8248bfSmrg<para><symbol>XkbSA_PtrBtn</symbol></para>
5670f8248bfSmrg<para><symbol>XkbSA_LockPtrBtn</symbol></para>
568e9fcaa8aSmrg    </entry>
5690f8248bfSmrg    <entry><structname>XkbPtrBtnAction</structname></entry><entry>btn</entry>
5700f8248bfSmrg    <entry><link linkend="Actions_for_Simulating_Pointer_Button_Press_and_Release">16.1.6</link></entry>
571e9fcaa8aSmrg  </row>
572eb411b4bSmrg  <row>
5730f8248bfSmrg    <entry><symbol>XkbSA_SetPtrDflt</symbol></entry>
5740f8248bfSmrg    <entry><structname>XkbPtrDfltAction</structname></entry>
575e9fcaa8aSmrg    <entry>dflt</entry>
5760f8248bfSmrg    <entry><link linkend="Actions_for_Changing_the_Pointer_Button_Simulated">16.1.7</link></entry>
577e9fcaa8aSmrg  </row>
578eb411b4bSmrg  <row>
5790f8248bfSmrg    <entry><symbol>XkbSA_ISOLock</symbol></entry>
5800f8248bfSmrg    <entry><structname>XkbISOAction</structname></entry>
581e9fcaa8aSmrg    <entry>iso</entry>
5820f8248bfSmrg    <entry><link linkend="Actions_for_Locking_Modifiers_and_Group">16.1.8</link></entry>
583e9fcaa8aSmrg  </row>
584eb411b4bSmrg  <row>
5850f8248bfSmrg    <entry><symbol>XkbSA_SwitchScreen</symbol></entry>
5860f8248bfSmrg    <entry><structname>XkbSwitchScreenAction</structname></entry>
587e9fcaa8aSmrg    <entry>screen</entry>
5880f8248bfSmrg    <entry><link linkend="Actions_for_Changing_the_Active_Screen">16.1.9</link></entry>
589e9fcaa8aSmrg  </row>
590eb411b4bSmrg  <row>
591e9fcaa8aSmrg    <entry>
5920f8248bfSmrg<para><symbol>XkbSA_SetControls</symbol></para>
5930f8248bfSmrg<para><symbol>XkbSA_LockControls</symbol></para>
594e9fcaa8aSmrg    </entry>
5950f8248bfSmrg    <entry><structname>XkbCtrlsAction</structname></entry>
596e9fcaa8aSmrg    <entry>ctrls</entry>
5970f8248bfSmrg    <entry><link linkend="Actions_for_Changing_Boolean_Controls_State">16.1.10</link></entry>
598e9fcaa8aSmrg  </row>
599eb411b4bSmrg  <row>
6000f8248bfSmrg    <entry><symbol>XkbSA_ActionMessage</symbol></entry>
6010f8248bfSmrg    <entry><structname>XkbMessageAction</structname></entry>
602e9fcaa8aSmrg    <entry>msg</entry>
6030f8248bfSmrg    <entry><link linkend="Actions_for_Generating_Messages">16.1.11</link></entry>
604e9fcaa8aSmrg  </row>
605eb411b4bSmrg  <row>
6060f8248bfSmrg    <entry><symbol>XkbSA_RedirectKey</symbol></entry>
6070f8248bfSmrg    <entry><structname>XkbRedirectKeyAction</structname></entry>
608e9fcaa8aSmrg    <entry>redirect</entry>
6090f8248bfSmrg    <entry><link linkend="Actions_for_Generating_a_Different_Keycode">16.1.12</link></entry>
610e9fcaa8aSmrg  </row>
611eb411b4bSmrg  <row>
612e9fcaa8aSmrg    <entry>
6130f8248bfSmrg<para><symbol>XkbSA_DeviceBtn</symbol></para>
6140f8248bfSmrg<para><symbol>XkbSA_LockDeviceBtn</symbol></para>
615e9fcaa8aSmrg    </entry>
6160f8248bfSmrg    <entry><structname>XkbDeviceBtnAction</structname></entry>
617e9fcaa8aSmrg    <entry>devbtn</entry>
6180f8248bfSmrg    <entry><link linkend="Actions_for_Generating_DeviceButtonPress_and_DeviceButtonRelease">16.1.13</link></entry>
619e9fcaa8aSmrg  </row>
620eb411b4bSmrg  <row>
6210f8248bfSmrg    <entry><symbol>XkbSA_DeviceValuator</symbol></entry>
6220f8248bfSmrg    <entry><structname>XkbDeviceValuatorAction</structname></entry>
623e9fcaa8aSmrg    <entry>devval</entry>
6240f8248bfSmrg    <entry><link linkend="Actions_for_Simulating_Events_from_Device_Valuators">16.1.14</link></entry>
625e9fcaa8aSmrg  </row>
626e9fcaa8aSmrg</tbody>
627e9fcaa8aSmrg</tgroup>
628e9fcaa8aSmrg</table>
629e9fcaa8aSmrg
630e9fcaa8aSmrg</sect2>
631eb411b4bSmrg<sect2 id='Actions_for_Changing_Modifiers_State'>
632e9fcaa8aSmrg<title>Actions for Changing Modifiers’ State</title>
6330f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_Modifiers_State">
6340f8248bfSmrg<primary><structname>XkbModAction</structname></primary></indexterm>
635e9fcaa8aSmrg
636e9fcaa8aSmrg<para>
6370f8248bfSmrgActions associated with the
6380f8248bfSmrg<structname>XkbModAction</structname>
6390f8248bfSmrgstructure change the state of the modifiers when keys are pressed and released
6400f8248bfSmrg(see <xref linkend="Virtual_Modifiers" /> for a discussion of modifiers):
641e9fcaa8aSmrg
6420f8248bfSmrg<programlisting>
643e9fcaa8aSmrgtypedef struct _XkbModAction {
6440f8248bfSmrg    unsigned char     type;         /* <symbol>XkbSA_{Set|Latch|Lock}Mods</symbol> */
6450f8248bfSmrg    unsigned char     flags;        /* with <structfield>type</structfield>, controls the effect
6460f8248bfSmrg                                       on modifiers */
6470f8248bfSmrg    unsigned char     mask;         /* same as <structfield>mask</structfield> field of
6480f8248bfSmrg                                       a modifier description */
6490f8248bfSmrg    unsigned char     real_mods;    /* same as <structfield>real_mods</structfield> field of
6500f8248bfSmrg                                       a modifier description */
6510f8248bfSmrg    unsigned char     vmods1;       /* derived from <structfield>vmods</structfield> field of
6520f8248bfSmrg                                       a modifier description */
6530f8248bfSmrg    unsigned char     vmods2;       /* derived from <structfield>vmods</structfield> field of
6540f8248bfSmrg                                       a modifier description */
6550f8248bfSmrg} <structname>XkbModAction</structname>;
656e9fcaa8aSmrg</programlisting></para>
657e9fcaa8aSmrg
658e9fcaa8aSmrg<para>
6590f8248bfSmrgIn the following description, the term
6600f8248bfSmrg<firstterm>action modifiers</firstterm>
6610f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_Modifiers_State">
6620f8248bfSmrg<primary>action modifiers</primary></indexterm>
6630f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_Modifiers_State">
6640f8248bfSmrg<primary>modifiers</primary><secondary>action</secondary></indexterm>
6650f8248bfSmrgmeans the real modifier bits associated with this action. Depending on the
6660f8248bfSmrgvalue of
6670f8248bfSmrg<structfield>flags</structfield>
6680f8248bfSmrg(see <link linkend="table16.3">Table 16.3</link>),
6690f8248bfSmrgthese are designated either in the
6700f8248bfSmrg<structfield>mask</structfield>
6710f8248bfSmrgfield of the
6720f8248bfSmrg<structname>XkbModAction</structname>
6730f8248bfSmrgstructure itself or the real modifiers bound to the key for which the action
6740f8248bfSmrgis being used. In the latter case, this is the client
6750f8248bfSmrg<structfield>map</structfield>-&gt;<structfield>modmap</structfield>
6760f8248bfSmrg[
6770f8248bfSmrg<parameter>keycode</parameter>
678e9fcaa8aSmrg] field.
679e9fcaa8aSmrg</para>
680e9fcaa8aSmrg
681e9fcaa8aSmrg
682e9fcaa8aSmrg<para>
6830f8248bfSmrgThe
6840f8248bfSmrg<structfield>type</structfield>
6850f8248bfSmrgfield can have any of the values shown in
6860f8248bfSmrg<link linkend="table16.2">Table 16.2</link>.
687e9fcaa8aSmrg</para>
688e9fcaa8aSmrg
6890f8248bfSmrg<table id='table16.2' frame='topbot'>
690e9fcaa8aSmrg<title>Modifier Action Types</title>
691eb411b4bSmrg<?dbfo keep-together="always" ?>
692eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
693eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
694eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
695e9fcaa8aSmrg<thead>
696eb411b4bSmrg<row rowsep='1'>
697e9fcaa8aSmrg  <entry>Type</entry>
698e9fcaa8aSmrg  <entry>Effect</entry>
699e9fcaa8aSmrg</row>
700e9fcaa8aSmrg</thead>
701e9fcaa8aSmrg<tbody>
702eb411b4bSmrg  <row>
7030f8248bfSmrg    <entry><symbol>XkbSA_SetMods</symbol></entry>
704e9fcaa8aSmrg    <entry>
705e9fcaa8aSmrg<itemizedlist>
706e9fcaa8aSmrg  <listitem>
707e9fcaa8aSmrg    <para>
708e9fcaa8aSmrgA key press adds any action modifiers to the keyboard’s base modifiers.
709e9fcaa8aSmrg    </para>
710e9fcaa8aSmrg  </listitem>
711e9fcaa8aSmrg  <listitem>
712e9fcaa8aSmrg    <para>
713e9fcaa8aSmrgA key release clears any action modifiers in the keyboard’s base modifiers,
714e9fcaa8aSmrgprovided no other key affecting the same modifiers is logically down.
715e9fcaa8aSmrg    </para>
716e9fcaa8aSmrg  </listitem>
717e9fcaa8aSmrg  <listitem>
718e9fcaa8aSmrg    <para>
719e9fcaa8aSmrgIf no other keys are physically depressed when this key is released, and
7200f8248bfSmrg<symbol>XkbSA_ClearLocks</symbol>
7210f8248bfSmrgis set in the
7220f8248bfSmrg<structfield>flags</structfield>
7230f8248bfSmrgfield, the key release unlocks any action modifiers.
724e9fcaa8aSmrg    </para>
725e9fcaa8aSmrg  </listitem>
726e9fcaa8aSmrg</itemizedlist>
727e9fcaa8aSmrg    </entry>
728e9fcaa8aSmrg  </row>
729eb411b4bSmrg  <row>
7300f8248bfSmrg    <entry><symbol>XkbSA_LatchMods</symbol></entry>
731e9fcaa8aSmrg    <entry>
732e9fcaa8aSmrg<itemizedlist>
733e9fcaa8aSmrg  <listitem>
734e9fcaa8aSmrg    <para>
7350f8248bfSmrgKey press and key release events have the same effect as for
7360f8248bfSmrg<symbol>XkbSA_SetMods</symbol>;
7370f8248bfSmrgif no keys are physically depressed when this key is released, key release
738e9fcaa8aSmrgevents have the following additional effects:
739e9fcaa8aSmrg    </para>
740e9fcaa8aSmrg  </listitem>
741e9fcaa8aSmrg  <listitem>
742e9fcaa8aSmrg    <para>
7430f8248bfSmrgModifiers unlocked due to
7440f8248bfSmrg<symbol>XkbSA_ClearLocks</symbol>
7450f8248bfSmrghave no further effect.
746e9fcaa8aSmrg    </para>
747e9fcaa8aSmrg  </listitem>
748e9fcaa8aSmrg  <listitem>
749e9fcaa8aSmrg    <para>
7500f8248bfSmrgIf
7510f8248bfSmrg<symbol>XkbSA_LatchToLock</symbol>
7520f8248bfSmrgis set in the
7530f8248bfSmrg<structfield>flags</structfield>
7540f8248bfSmrgfield, a key release locks and then unlatches any remaining action modifiers
755e9fcaa8aSmrgthat are already latched.
756e9fcaa8aSmrg    </para>
757e9fcaa8aSmrg  </listitem>
758e9fcaa8aSmrg  <listitem>
759e9fcaa8aSmrg    <para>
7600f8248bfSmrgA key release latches any action modifiers not used by the
7610f8248bfSmrg<symbol>XkbSA_ClearLocks</symbol>
7620f8248bfSmrgand
7630f8248bfSmrg<symbol>XkbSA_LatchToLock</symbol>
7640f8248bfSmrgflags.
765e9fcaa8aSmrg    </para>
766e9fcaa8aSmrg  </listitem>
767e9fcaa8aSmrg  </itemizedlist>
768e9fcaa8aSmrg    </entry>
769e9fcaa8aSmrg  </row>
770eb411b4bSmrg  <row>
7710f8248bfSmrg    <entry><symbol>XkbSA_LockMods</symbol></entry>
772e9fcaa8aSmrg    <entry>
773e9fcaa8aSmrg<itemizedlist>
774e9fcaa8aSmrg  <listitem>
775e9fcaa8aSmrg    <para>
7760f8248bfSmrgA key press sets the base state of any action modifiers. If
7770f8248bfSmrg<symbol>XkbSA_LockNoLock</symbol>
7780f8248bfSmrgis set in the
7790f8248bfSmrg<structfield>flags</structfield>
7800f8248bfSmrgfield, a key press also sets the locked state of any action modifiers.
781e9fcaa8aSmrg    </para>
782e9fcaa8aSmrg  </listitem>
783e9fcaa8aSmrg  <listitem>
784e9fcaa8aSmrg    <para>
785e9fcaa8aSmrgA key release clears any action modifiers in the keyboard’s base modifiers,
7860f8248bfSmrgprovided no other key that affects the same modifiers is down. If
7870f8248bfSmrg<symbol>XkbSA_LockNoUnlock</symbol>
7880f8248bfSmrgis not set in the
7890f8248bfSmrg<structfield>flags</structfield>
7900f8248bfSmrgfield, and any of the action modifiers were locked before the corresponding
791e9fcaa8aSmrgkey press occurred, a key release unlocks them.
792e9fcaa8aSmrg    </para>
793e9fcaa8aSmrg  </listitem>
794e9fcaa8aSmrg</itemizedlist>
795e9fcaa8aSmrg    </entry>
796e9fcaa8aSmrg  </row>
797e9fcaa8aSmrg</tbody>
798e9fcaa8aSmrg</tgroup>
799e9fcaa8aSmrg</table>
800e9fcaa8aSmrg
801e9fcaa8aSmrg<para>
8020f8248bfSmrgThe
8030f8248bfSmrg<structfield>flags</structfield>
8040f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
8050f8248bfSmrg<link linkend="table16.3">Table 16.3</link>.
8060f8248bfSmrgA general meaning is given in the table, but the exact meaning depends on
8070f8248bfSmrgthe action <structfield>type</structfield>.
808e9fcaa8aSmrg</para>
809e9fcaa8aSmrg
8100f8248bfSmrg<table id='table16.3' frame='topbot'>
811e9fcaa8aSmrg<title>Modifier Action Flags</title>
812eb411b4bSmrg<?dbfo keep-together="always" ?>
813eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
814eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
815eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
816e9fcaa8aSmrg<thead>
817eb411b4bSmrg<row rowsep='1'>
818e9fcaa8aSmrg  <entry>Flag</entry>
819e9fcaa8aSmrg  <entry>Meaning</entry>
820e9fcaa8aSmrg</row>
821e9fcaa8aSmrg</thead>
822e9fcaa8aSmrg<tbody>
823eb411b4bSmrg  <row>
8240f8248bfSmrg    <entry><symbol>XkbSA_UseModMapMods</symbol></entry>
825e9fcaa8aSmrg    <entry>
826e9fcaa8aSmrgIf set, the action modifiers are determined by the modifiers bound by the
827e9fcaa8aSmrgmodifier mapping of the key. Otherwise, the action modifiers are set to the
8280f8248bfSmrgmodifiers specified by the
8290f8248bfSmrg<structfield>mask</structfield>,
8300f8248bfSmrg<structfield>real_mods</structfield>,
8310f8248bfSmrg<structfield>vmods1</structfield>,
8320f8248bfSmrgand
8330f8248bfSmrg<structfield>vmods2</structfield>
8340f8248bfSmrgfields.
835e9fcaa8aSmrg    </entry>
836e9fcaa8aSmrg  </row>
837eb411b4bSmrg  <row>
8380f8248bfSmrg    <entry><symbol>XkbSA_ClearLocks</symbol></entry>
839e9fcaa8aSmrg    <entry>
840e9fcaa8aSmrgIf set and no keys are physically depressed when this key transition
841e9fcaa8aSmrgoccurs, the server unlocks any action modifiers.
842e9fcaa8aSmrg   </entry>
843e9fcaa8aSmrg  </row>
844eb411b4bSmrg  <row>
8450f8248bfSmrg    <entry><symbol>XkbSA_LatchToLock</symbol></entry>
846e9fcaa8aSmrg    <entry>
8470f8248bfSmrgIf set, and the action type is
8480f8248bfSmrg<symbol>XkbSA_LatchMods</symbol>,
8490f8248bfSmrgthe server locks the action modifiers if they are already latched.
850e9fcaa8aSmrg    </entry>
851e9fcaa8aSmrg  </row>
852eb411b4bSmrg  <row>
8530f8248bfSmrg    <entry><symbol>XkbSA_LockNoLock</symbol></entry>
854e9fcaa8aSmrg    <entry>
8550f8248bfSmrgIf set, and the action type is
8560f8248bfSmrg<symbol>XkbSA_LockMods</symbol>,
8570f8248bfSmrgthe server only unlocks the action modifiers.
858e9fcaa8aSmrg    </entry>
859e9fcaa8aSmrg  </row>
860eb411b4bSmrg  <row>
8610f8248bfSmrg    <entry><symbol>XkbSA_LockNoUnlock</symbol></entry>
862e9fcaa8aSmrg    <entry>
8630f8248bfSmrgIf set, and the action is
8640f8248bfSmrg<symbol>XkbSA_LockMods</symbol>,
8650f8248bfSmrgthe server only locks the action modifiers.
866e9fcaa8aSmrg    </entry>
867e9fcaa8aSmrg  </row>
868e9fcaa8aSmrg</tbody>
869e9fcaa8aSmrg</tgroup>
870e9fcaa8aSmrg</table>
871e9fcaa8aSmrg
872e9fcaa8aSmrg<para>
8730f8248bfSmrgIf
8740f8248bfSmrg<symbol>XkbSA_UseModMapMods</symbol>
8750f8248bfSmrgis not set in the
8760f8248bfSmrg<structfield>flags</structfield>
8770f8248bfSmrgfield, the
8780f8248bfSmrg<structfield>mask</structfield>,
8790f8248bfSmrg<structfield>real_mods</structfield>,
8800f8248bfSmrg<structfield>vmods1</structfield>,
8810f8248bfSmrgand
8820f8248bfSmrg<structfield>vmods2</structfield>
883e9fcaa8aSmrgfields are used to determine the action modifiers. Otherwise they are ignored
8840f8248bfSmrgand the modifiers bound to the key (client
8850f8248bfSmrg<structfield>map</structfield>-&gt;<structfield>modmap</structfield>
8860f8248bfSmrg[
8870f8248bfSmrg<parameter>keycode</parameter>
888e9fcaa8aSmrg]) are used instead.
889e9fcaa8aSmrg</para>
890e9fcaa8aSmrg
891e9fcaa8aSmrg
892e9fcaa8aSmrg<para>
8930f8248bfSmrgThe
8940f8248bfSmrg<structfield>mask</structfield>,
8950f8248bfSmrg<structfield>real_mods</structfield>,
8960f8248bfSmrg<structfield>vmods1</structfield>,
8970f8248bfSmrgand
8980f8248bfSmrg<structfield>vmods2</structfield>
8990f8248bfSmrgfields represent the components of an Xkb modifier description
9000f8248bfSmrg(see <link linkend="Modifier_Definitions">section 7.2</link>). While the
9010f8248bfSmrg<structfield>mask</structfield>
9020f8248bfSmrgand
9030f8248bfSmrg<structfield>real_mods</structfield>
9040f8248bfSmrgfields correspond directly to the
9050f8248bfSmrg<structfield>mask</structfield>
9060f8248bfSmrgand
9070f8248bfSmrg<structfield>real_mods</structfield>
9080f8248bfSmrgfields of an Xkb modifier description, the
9090f8248bfSmrg<structfield>vmods1</structfield>
9100f8248bfSmrgand
9110f8248bfSmrg<structfield>vmods2</structfield>
9120f8248bfSmrgfields are combined to correspond to the
9130f8248bfSmrg<structfield>vmods</structfield>
9140f8248bfSmrgfield of an Xkb modifier description. Xkb provides the following macros, to
915e9fcaa8aSmrgconvert between the two formats:
916e9fcaa8aSmrg</para>
917e9fcaa8aSmrg
9180f8248bfSmrg<indexterm significance="preferred" zone="XkbModActionVMods"><primary><function>XkbModActionVMods</function></primary></indexterm>
9190f8248bfSmrg<funcsynopsis id="XkbModActionVMods">
9200f8248bfSmrg  <funcprototype>
9210f8248bfSmrg    <funcdef>unsigned short <function>XkbModActionVMods</function></funcdef>
9220f8248bfSmrg<!-- (
9230f8248bfSmrg<parameter>act</parameter>
9240f8248bfSmrg)                              /* macro */ -->
9250f8248bfSmrg
9260f8248bfSmrg    <paramdef>XkbAction <parameter>act</parameter></paramdef>
9270f8248bfSmrg  </funcprototype>
9280f8248bfSmrg</funcsynopsis>
9290f8248bfSmrg<variablelist>
9300f8248bfSmrg  <varlistentry>
9310f8248bfSmrg    <term>
9320f8248bfSmrg      <parameter>act</parameter>
9330f8248bfSmrg    </term>
9340f8248bfSmrg    <listitem>
9350f8248bfSmrg      <para>
9360f8248bfSmrg        action from which to extract virtual mods
9370f8248bfSmrg      </para>
9380f8248bfSmrg    </listitem>
9390f8248bfSmrg  </varlistentry>
9400f8248bfSmrg</variablelist>
9410f8248bfSmrg
9420f8248bfSmrg<para>
9430f8248bfSmrg<function>XkbModActionVMods</function>
9440f8248bfSmrgreturns the
9450f8248bfSmrg<structfield>vmods1</structfield>
9460f8248bfSmrgand
9470f8248bfSmrg<structfield>vmods2</structfield>
9480f8248bfSmrgfields of
9490f8248bfSmrg<parameter>act</parameter>
9500f8248bfSmrgconverted to the
9510f8248bfSmrg<structfield>vmods</structfield>
9520f8248bfSmrgformat of an Xkb modifier description.
9530f8248bfSmrg</para>
9540f8248bfSmrg
9550f8248bfSmrg
9560f8248bfSmrg<indexterm significance="preferred" zone="XkbSetModActionVMods"><primary><function>XkbSetModActionVMods</function></primary></indexterm>
9570f8248bfSmrg<funcsynopsis id="XkbSetModActionVMods">
9580f8248bfSmrg  <funcprototype>
9590f8248bfSmrg    <funcdef>void <function>XkbSetModActionVMods</function></funcdef>
9600f8248bfSmrg<!-- (
9610f8248bfSmrg<parameter>act, vmods</parameter>
9620f8248bfSmrg)                              /* macro */ -->
9630f8248bfSmrg
9640f8248bfSmrg    <paramdef>XkbAction <parameter>act</parameter></paramdef>
9650f8248bfSmrg    <paramdef>unsigned short <parameter>vmods</parameter></paramdef>
9660f8248bfSmrg  </funcprototype>
9670f8248bfSmrg</funcsynopsis>
9680f8248bfSmrg<variablelist>
9690f8248bfSmrg  <varlistentry>
9700f8248bfSmrg    <term>
9710f8248bfSmrg      <parameter>act</parameter>
9720f8248bfSmrg    </term>
9730f8248bfSmrg    <listitem>
9740f8248bfSmrg      <para>
9750f8248bfSmrg        action in which to set vmods
9760f8248bfSmrg      </para>
9770f8248bfSmrg    </listitem>
9780f8248bfSmrg  </varlistentry>
9790f8248bfSmrg  <varlistentry>
9800f8248bfSmrg    <term>
9810f8248bfSmrg      <parameter>vmods</parameter>
9820f8248bfSmrg    </term>
9830f8248bfSmrg    <listitem>
9840f8248bfSmrg      <para>
9850f8248bfSmrg        virtual mods to set
9860f8248bfSmrg      </para>
9870f8248bfSmrg    </listitem>
9880f8248bfSmrg  </varlistentry>
9890f8248bfSmrg</variablelist>
990e9fcaa8aSmrg
991e9fcaa8aSmrg<para>
9920f8248bfSmrg<function>XkbSetModActionVMods</function>
9930f8248bfSmrgsets the
9940f8248bfSmrg<structfield>vmods1</structfield>
9950f8248bfSmrgand
9960f8248bfSmrg<structfield>vmods2</structfield>
9970f8248bfSmrgfields of
9980f8248bfSmrg<parameter>act</parameter>
9990f8248bfSmrgusing the
10000f8248bfSmrg<parameter>vmods</parameter>
10010f8248bfSmrgformat of an Xkb modifier description.
1002e9fcaa8aSmrg</para>
1003e9fcaa8aSmrg
1004e9fcaa8aSmrg<note><para>Despite the fact that the first parameter of these two macros is of
10050f8248bfSmrgtype XkbAction, these macros may be used only with Actions of type
10060f8248bfSmrg<structname>XkbModAction</structname>
10070f8248bfSmrgand
10080f8248bfSmrg<structname>XkbISOAction</structname>.
10090f8248bfSmrg</para></note>
1010e9fcaa8aSmrg
1011e9fcaa8aSmrg
1012e9fcaa8aSmrg</sect2>
1013eb411b4bSmrg<sect2 id='Actions_for_Changing_Group_State'>
1014e9fcaa8aSmrg<title>Actions for Changing Group State</title>
10150f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_Group_State">
10160f8248bfSmrg<primary><structname>XkbGroupAction</structname></primary></indexterm>
1017e9fcaa8aSmrg
1018e9fcaa8aSmrg<para>
10190f8248bfSmrgActions associated with the
10200f8248bfSmrg<structname>XkbGroupAction</structname>
10210f8248bfSmrgstructure change the current group state when keys are pressed and released
10220f8248bfSmrg(see <xref linkend="Keyboard_State" /> for a description of groups and keyboard state):
1023e9fcaa8aSmrg
10240f8248bfSmrg<programlisting>
1025e9fcaa8aSmrgtypedef struct _XkbGroupAction {
10260f8248bfSmrg    unsigned char   type;       /* <symbol>XkbSA_{Set|Latch|Lock}Group</symbol> */
10270f8248bfSmrg    unsigned char   flags;      /* with <structfield>type</structfield> , controls the effect on groups */
10280f8248bfSmrg    char            group_XXX;  /* represents a group index or delta */
10290f8248bfSmrg} <structname>XkbGroupAction</structname>;
1030e9fcaa8aSmrg</programlisting></para>
1031e9fcaa8aSmrg
1032e9fcaa8aSmrg<para>
10330f8248bfSmrgThe
10340f8248bfSmrg<structfield>type</structfield>
10350f8248bfSmrgfield can have any of the following values:
1036e9fcaa8aSmrg</para>
1037e9fcaa8aSmrg
10380f8248bfSmrg<table id='table16.4' frame='topbot'>
1039e9fcaa8aSmrg<title>Group Action Types</title>
1040eb411b4bSmrg<?dbfo keep-together="always" ?>
1041eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1042eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1043eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1044e9fcaa8aSmrg<thead>
1045eb411b4bSmrg<row rowsep='1'>
1046e9fcaa8aSmrg  <entry>Type</entry>
1047e9fcaa8aSmrg  <entry>Effect</entry>
1048e9fcaa8aSmrg</row>
1049e9fcaa8aSmrg</thead>
1050e9fcaa8aSmrg<tbody>
1051eb411b4bSmrg  <row>
10520f8248bfSmrg    <entry><symbol>XkbSA_SetGroup</symbol></entry>
1053e9fcaa8aSmrg    <entry>
1054e9fcaa8aSmrg<itemizedlist>
1055e9fcaa8aSmrg  <listitem>
1056e9fcaa8aSmrg    <para>
10570f8248bfSmrgIf the
10580f8248bfSmrg<symbol>XkbSA_GroupAbsolute</symbol>
10590f8248bfSmrgbit is set in the
10600f8248bfSmrg<structfield>flags</structfield>
10610f8248bfSmrgfield, key press events change the base keyboard group to the group specified
10620f8248bfSmrgby the
10630f8248bfSmrg<structfield>group_XXX</structfield>
10640f8248bfSmrgfield. Otherwise, key press events change the base keyboard group by adding
10650f8248bfSmrgthe
10660f8248bfSmrg<structfield>group_XXX</structfield>
10670f8248bfSmrgfield to the base keyboard group. In either case, the resulting effective
1068e9fcaa8aSmrgkeyboard group is brought back into range depending on the value of the
10690f8248bfSmrg<structfield>groups_wrap</structfield>
10700f8248bfSmrgfield of the controls structure (see <link linkend="The_GroupsWrap_Control">section 10.7.1</link>).
1071e9fcaa8aSmrg    </para>
1072e9fcaa8aSmrg  </listitem>
1073e9fcaa8aSmrg  <listitem>
1074e9fcaa8aSmrg    <para>
10750f8248bfSmrgIf a key with an
10760f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
10770f8248bfSmrgaction (see <link linkend="Actions_for_Locking_Modifiers_and_Group">section 16.1.8</link>) is pressed while this key is down, the key release
1078e9fcaa8aSmrgof this key has no effect. Otherwise, the key release cancels the effects of
1079e9fcaa8aSmrgthe key press.
1080e9fcaa8aSmrg    </para>
1081e9fcaa8aSmrg  </listitem>
1082e9fcaa8aSmrg  <listitem>
1083e9fcaa8aSmrg    <para>
10840f8248bfSmrgIf the
10850f8248bfSmrg<symbol>XkbSA_ClearLocks</symbol>
10860f8248bfSmrgbit is set in the flags field, and no keys are physically depressed when this
1087e9fcaa8aSmrgkey is released, the key release also sets the locked keyboard group to
10880f8248bfSmrg<emphasis>Group1</emphasis>.
10890f8248bfSmrg</para>
1090e9fcaa8aSmrg  </listitem>
1091e9fcaa8aSmrg</itemizedlist>
1092e9fcaa8aSmrg    </entry>
1093e9fcaa8aSmrg  </row>
1094eb411b4bSmrg  <row>
10950f8248bfSmrg    <entry><symbol>XkbSA_LatchGroup</symbol></entry>
1096e9fcaa8aSmrg    <entry>
1097e9fcaa8aSmrg<itemizedlist>
1098e9fcaa8aSmrg  <listitem>
1099e9fcaa8aSmrg    <para>
11000f8248bfSmrgKey press and key release events have the same effect as for
11010f8248bfSmrg<symbol>XkbSA_SetGroup</symbol>;
11020f8248bfSmrgif no keys are physically depressed when this key is released, key release
1103e9fcaa8aSmrgevents have the following additional effects.
1104e9fcaa8aSmrg    </para>
1105e9fcaa8aSmrg  </listitem>
1106e9fcaa8aSmrg  <listitem>
1107e9fcaa8aSmrg    <para>
11080f8248bfSmrgIf the
11090f8248bfSmrg<symbol>XkbSA_LatchToLock</symbol>
11100f8248bfSmrgbit is set in the
11110f8248bfSmrg<structfield>flags</structfield>
11120f8248bfSmrgfield and the latched keyboard group index is nonzero, the key release adds
1113e9fcaa8aSmrgthe delta applied by the corresponding key press to the locked keyboard group
1114e9fcaa8aSmrgand subtracts it from the latched keyboard group. The locked and effective
1115e9fcaa8aSmrgkeyboard group are brought back into range according to the value of the
11160f8248bfSmrg<structfield>groups_wrap</structfield>
11170f8248bfSmrgfield of the controls structure.
1118e9fcaa8aSmrg    </para>
1119e9fcaa8aSmrg  </listitem>
1120e9fcaa8aSmrg  <listitem>
1121e9fcaa8aSmrg    <para>
1122e9fcaa8aSmrgOtherwise, the key press adds the key press delta to the latched keyboard group.
1123e9fcaa8aSmrg    </para>
1124e9fcaa8aSmrg  </listitem>
1125e9fcaa8aSmrg</itemizedlist>
1126e9fcaa8aSmrg    </entry>
1127e9fcaa8aSmrg  </row>
1128eb411b4bSmrg  <row>
11290f8248bfSmrg    <entry><symbol>XkbSA_LockGroup</symbol></entry>
1130e9fcaa8aSmrg    <entry>
1131e9fcaa8aSmrg<itemizedlist>
1132e9fcaa8aSmrg  <listitem>
1133e9fcaa8aSmrg    <para>
11340f8248bfSmrgIf the
11350f8248bfSmrg<symbol>XkbSA_GroupAbsolute</symbol>
11360f8248bfSmrgis set in the
11370f8248bfSmrg<structfield>flags</structfield>
11380f8248bfSmrgfield, key press events set the locked keyboard group to the group specified
11390f8248bfSmrgby the
11400f8248bfSmrg<structfield>group_XXX</structfield>
11410f8248bfSmrgfield. Otherwise, key press events add the group specified by the
11420f8248bfSmrg<structfield>group_XXX</structfield>
11430f8248bfSmrgfield to the locked keyboard group. In either case, the resulting locked and
1144e9fcaa8aSmrgeffective keyboard groups are brought back into range depending on the value of
11450f8248bfSmrgthe
11460f8248bfSmrg<structfield>groups_wrap</structfield>
11470f8248bfSmrgfield of the controls structure.
1148e9fcaa8aSmrg    </para>
1149e9fcaa8aSmrg  </listitem>
1150e9fcaa8aSmrg  <listitem>
1151e9fcaa8aSmrg    <para>
1152e9fcaa8aSmrgA key release has no effect.
1153e9fcaa8aSmrg    </para>
1154e9fcaa8aSmrg  </listitem>
1155e9fcaa8aSmrg</itemizedlist>
1156e9fcaa8aSmrg    </entry>
1157e9fcaa8aSmrg  </row>
1158e9fcaa8aSmrg</tbody>
1159e9fcaa8aSmrg</tgroup>
1160e9fcaa8aSmrg</table>
1161e9fcaa8aSmrg
1162e9fcaa8aSmrg<para>
11630f8248bfSmrgThe
11640f8248bfSmrg<structfield>flags</structfield>
11650f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
11660f8248bfSmrg<link linkend="table16.5">Table 16.5</link>.
11670f8248bfSmrgA general meaning is given in the table, but the exact meaning depends on
11680f8248bfSmrgthe action
11690f8248bfSmrg<structfield>type</structfield>.
1170e9fcaa8aSmrg</para>
1171e9fcaa8aSmrg
11720f8248bfSmrg<table id='table16.5' frame='topbot'>
1173e9fcaa8aSmrg<title>Group Action Flags</title>
1174eb411b4bSmrg<?dbfo keep-together="always" ?>
1175eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1176eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1177eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1178e9fcaa8aSmrg<thead>
1179eb411b4bSmrg<row rowsep='1'>
1180e9fcaa8aSmrg  <entry>Flag</entry>
1181e9fcaa8aSmrg  <entry>Meaning</entry>
1182e9fcaa8aSmrg</row>
1183e9fcaa8aSmrg</thead>
1184e9fcaa8aSmrg<tbody>
1185eb411b4bSmrg  <row>
11860f8248bfSmrg    <entry><symbol>XkbSA_ClearLocks</symbol></entry>
1187e9fcaa8aSmrg    <entry>
1188e9fcaa8aSmrgIf set and no keys are physically depressed when this key transition occurs,
11890f8248bfSmrgthe server sets the locked keyboard group to
11900f8248bfSmrg<emphasis>Group1</emphasis>
11910f8248bfSmrgon a key release.
1192e9fcaa8aSmrg    </entry>
1193e9fcaa8aSmrg  </row>
1194eb411b4bSmrg  <row>
11950f8248bfSmrg    <entry><symbol>XkbSA_LatchToLock</symbol></entry>
1196e9fcaa8aSmrg    <entry>
11970f8248bfSmrgIf set, and the action type is
11980f8248bfSmrg<symbol>XkbSA_LatchGroup</symbol>,
11990f8248bfSmrgthe server locks the action group if it is already latched.
1200e9fcaa8aSmrg    </entry>
1201e9fcaa8aSmrg  </row>
1202eb411b4bSmrg  <row>
12030f8248bfSmrg    <entry><symbol>XkbSA_GroupAbsolute</symbol></entry>
1204e9fcaa8aSmrg    <entry>
12050f8248bfSmrgIf set, the
12060f8248bfSmrg<structfield>group_XXX</structfield>
12070f8248bfSmrgfield represents an absolute group number. Otherwise, it represents a group
1208e9fcaa8aSmrgdelta to be added to the current group to determine the new group number.
1209e9fcaa8aSmrg    </entry>
1210e9fcaa8aSmrg  </row>
1211e9fcaa8aSmrg</tbody>
1212e9fcaa8aSmrg</tgroup>
1213e9fcaa8aSmrg</table>
1214e9fcaa8aSmrg
1215e9fcaa8aSmrg<para>
12160f8248bfSmrgThe
12170f8248bfSmrg<structfield>group_XXX</structfield>
12180f8248bfSmrgfield represents a signed character. Xkb provides the following macros to
1219e9fcaa8aSmrgconvert between a signed integer value and a signed character:
1220e9fcaa8aSmrg</para>
1221e9fcaa8aSmrg
12220f8248bfSmrg<indexterm significance="preferred" zone="XkbSAGroup"><primary><function>XkbSAGroup</function></primary></indexterm>
12230f8248bfSmrg<funcsynopsis id="XkbSAGroup">
12240f8248bfSmrg  <funcprototype>
12250f8248bfSmrg    <funcdef>int <function>XkbSAGroup</function></funcdef>
12260f8248bfSmrg<!-- (
12270f8248bfSmrg<parameter>act</parameter>
12280f8248bfSmrg)                              /* macro */ -->
12290f8248bfSmrg
12300f8248bfSmrg    <paramdef>XkbAction <parameter>act</parameter></paramdef>
12310f8248bfSmrg  </funcprototype>
12320f8248bfSmrg</funcsynopsis>
12330f8248bfSmrg<variablelist>
12340f8248bfSmrg  <varlistentry>
12350f8248bfSmrg    <term>
12360f8248bfSmrg      <parameter>act</parameter>
12370f8248bfSmrg    </term>
12380f8248bfSmrg    <listitem>
12390f8248bfSmrg      <para>
12400f8248bfSmrg        action from which to extract group
12410f8248bfSmrg      </para>
12420f8248bfSmrg    </listitem>
12430f8248bfSmrg  </varlistentry>
12440f8248bfSmrg</variablelist>
12450f8248bfSmrg
12460f8248bfSmrg<para>
12470f8248bfSmrg<function>XkbSAGroup</function>
12480f8248bfSmrgreturns the
12490f8248bfSmrg<structfield>group_XXX</structfield>
12500f8248bfSmrgfield of
12510f8248bfSmrg<parameter>act</parameter>
12520f8248bfSmrgconverted to a signed int.
12530f8248bfSmrg</para>
12540f8248bfSmrg
12550f8248bfSmrg
12560f8248bfSmrg<indexterm significance="preferred" zone="XkbSASetGroup"><primary><function>XkbSASetGroup</function></primary></indexterm>
12570f8248bfSmrg<funcsynopsis id="XkbSASetGroup">
12580f8248bfSmrg  <funcprototype>
12590f8248bfSmrg    <funcdef>void <function>XkbSASetGroup</function></funcdef>
12600f8248bfSmrg<!-- (
12610f8248bfSmrg<parameter>act, grp</parameter>
12620f8248bfSmrg)                              /* macro */ -->
12630f8248bfSmrg
12640f8248bfSmrg    <paramdef>XkbAction <parameter>act</parameter></paramdef>
12650f8248bfSmrg    <paramdef>int <parameter>grp</parameter></paramdef>
12660f8248bfSmrg  </funcprototype>
12670f8248bfSmrg</funcsynopsis>
12680f8248bfSmrg<variablelist>
12690f8248bfSmrg  <varlistentry>
12700f8248bfSmrg    <term>
12710f8248bfSmrg      <parameter>act</parameter>
12720f8248bfSmrg    </term>
12730f8248bfSmrg    <listitem>
12740f8248bfSmrg      <para>
12750f8248bfSmrg        action from which to set group
12760f8248bfSmrg      </para>
12770f8248bfSmrg    </listitem>
12780f8248bfSmrg  </varlistentry>
12790f8248bfSmrg  <varlistentry>
12800f8248bfSmrg    <term>
12810f8248bfSmrg      <parameter>grp</parameter>
12820f8248bfSmrg    </term>
12830f8248bfSmrg    <listitem>
12840f8248bfSmrg      <para>
12850f8248bfSmrg        group index to set in <structfield>group_XXX</structfield>
12860f8248bfSmrg      </para>
12870f8248bfSmrg    </listitem>
12880f8248bfSmrg  </varlistentry>
12890f8248bfSmrg</variablelist>
1290e9fcaa8aSmrg
1291e9fcaa8aSmrg<para>
12920f8248bfSmrg<function>XkbSASetGroup</function>
12930f8248bfSmrgsets the
12940f8248bfSmrg<structfield>group_XXX</structfield>
12950f8248bfSmrgfield of
12960f8248bfSmrg<parameter>act</parameter>
12970f8248bfSmrgfrom the group index
12980f8248bfSmrg<parameter>grp</parameter>.
1299e9fcaa8aSmrg</para>
1300e9fcaa8aSmrg
1301e9fcaa8aSmrg<note><para>Despite the fact that the first parameter of these two macros is of
13020f8248bfSmrgtype XkbAction, these macros may only be used with Actions of type
13030f8248bfSmrg<structname>XkbGroupAction</structname>
13040f8248bfSmrgand
13050f8248bfSmrg<structname>XkbISOAction</structname>.
13060f8248bfSmrg</para></note>
1307e9fcaa8aSmrg
1308e9fcaa8aSmrg
1309e9fcaa8aSmrg</sect2>
1310eb411b4bSmrg<sect2 id='Actions_for_Moving_the_Pointer'>
1311e9fcaa8aSmrg<title>Actions for Moving the Pointer</title>
13120f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Moving_the_Pointer">
13130f8248bfSmrg<primary><structname>XkbPtrAction</structname></primary></indexterm>
1314e9fcaa8aSmrg
1315e9fcaa8aSmrg<para>
13160f8248bfSmrgActions associated with the
13170f8248bfSmrg<structname>XkbPtrAction</structname>
13180f8248bfSmrgstructure move the pointer when keys are pressed and released:
1319e9fcaa8aSmrg
13200f8248bfSmrg<programlisting>
1321e9fcaa8aSmrgtypedef struct _XkbPtrAction {
13220f8248bfSmrg    unsigned char      type;      /* <symbol>XkbSA_MovePtr</symbol> */
13230f8248bfSmrg    unsigned char      flags;     /* determines type of pointer motion */
13240f8248bfSmrg    unsigned char      high_XXX;  /* x coordinate, high bits */
13250f8248bfSmrg    unsigned char      low_XXX;   /* y coordinate, low bits */
13260f8248bfSmrg    unsigned char      high_YYY;  /* x coordinate, high bits */
13270f8248bfSmrg    unsigned char      low_YYY;   /* y coordinate, low bits */
13280f8248bfSmrg} <structname>XkbPtrAction</structname>;
1329e9fcaa8aSmrg</programlisting></para>
1330e9fcaa8aSmrg
1331e9fcaa8aSmrg<para>
13320f8248bfSmrgIf the
13330f8248bfSmrg<emphasis>MouseKeys</emphasis>
13340f8248bfSmrgcontrol is not enabled (see <link linkend="The_MouseKeys_Control">section 10.5.1</link>),
13350f8248bfSmrg<symbol>KeyPress</symbol>
13360f8248bfSmrgand
13370f8248bfSmrg<symbol>KeyRelease</symbol>
13380f8248bfSmrgevents are treated as though the action is
13390f8248bfSmrg<symbol>XkbSA_NoAction</symbol>.
1340e9fcaa8aSmrg</para>
1341e9fcaa8aSmrg
1342e9fcaa8aSmrg<para>
13430f8248bfSmrgIf the
13440f8248bfSmrg<emphasis>MouseKeys</emphasis>
13450f8248bfSmrgcontrol is enabled, a server action of type
13460f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13470f8248bfSmrginstructs the server to generate core pointer
13480f8248bfSmrg<symbol>MotionNotify</symbol>
13490f8248bfSmrgevents rather than the usual
13500f8248bfSmrg<symbol>KeyPress</symbol>
13510f8248bfSmrgevent, and the corresponding
13520f8248bfSmrg<symbol>KeyRelease</symbol>
13530f8248bfSmrgevent disables any mouse keys timers that were created as a result of handling
13540f8248bfSmrgthe
13550f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13560f8248bfSmrgaction.
1357e9fcaa8aSmrg</para>
1358e9fcaa8aSmrg
1359e9fcaa8aSmrg
1360e9fcaa8aSmrg<para>
13610f8248bfSmrgThe
13620f8248bfSmrg<structfield>type</structfield>
13630f8248bfSmrgfield of the
13640f8248bfSmrg<structname>XkbPtrAction</structname>
13650f8248bfSmrgstructure is always
13660f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>.
1367e9fcaa8aSmrg</para>
1368e9fcaa8aSmrg
1369e9fcaa8aSmrg
1370e9fcaa8aSmrg<para>
13710f8248bfSmrgThe
13720f8248bfSmrg<structfield>flags</structfield>
13730f8248bfSmrgfield is a bitwise inclusive OR of the masks shown in
13740f8248bfSmrg<link linkend="table16.6">Table 16.6</link>.
1375e9fcaa8aSmrg</para>
1376e9fcaa8aSmrg
13770f8248bfSmrg<table id='table16.6' frame='topbot'>
1378e9fcaa8aSmrg<title>Pointer Action Types</title>
1379eb411b4bSmrg<?dbfo keep-together="always" ?>
1380eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1381eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1382eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1383e9fcaa8aSmrg<thead>
1384eb411b4bSmrg<row rowsep='1'>
1385e9fcaa8aSmrg  <entry>Action Type</entry>
1386e9fcaa8aSmrg  <entry>Meaning</entry>
1387e9fcaa8aSmrg</row>
1388e9fcaa8aSmrg</thead>
1389e9fcaa8aSmrg<tbody>
1390eb411b4bSmrg  <row>
13910f8248bfSmrg    <entry><symbol>XkbSA_NoAcceleration</symbol></entry>
1392e9fcaa8aSmrg    <entry>
13930f8248bfSmrgIf not set, and the
13940f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
13950f8248bfSmrgcontrol is enabled (see <link linkend="The_MouseKeysAccel_Control">section 10.5.2</link>), the
13960f8248bfSmrg<symbol>KeyPress</symbol>
13970f8248bfSmrginitiates a mouse keys timer for this key; every time the timer expires, the
1398e9fcaa8aSmrgcursor moves.
1399e9fcaa8aSmrg    </entry>
1400e9fcaa8aSmrg  </row>
1401eb411b4bSmrg  <row>
14020f8248bfSmrg    <entry><symbol>XkbSA_MoveAbsoluteX</symbol></entry>
1403e9fcaa8aSmrg    <entry>If set, the X portion of the structure specifies the new pointer X
1404e9fcaa8aSmrgcoordinate. Otherwise, the X portion is added to the current pointer X
1405e9fcaa8aSmrgcoordinate to determine the new pointer X coordinate.
1406e9fcaa8aSmrg    </entry>
1407e9fcaa8aSmrg  </row>
1408eb411b4bSmrg  <row>
14090f8248bfSmrg    <entry><symbol>XkbSA_MoveAbsoluteY</symbol></entry>
1410e9fcaa8aSmrg    <entry>
1411e9fcaa8aSmrgIf set, the Y portion of the structure specifies the new
1412e9fcaa8aSmrgpointer Y coordinate. Otherwise, the Y portion is added
1413e9fcaa8aSmrgto the current pointer Y coordinate to determine the new pointer Y coordinate.
1414e9fcaa8aSmrg    </entry>
1415e9fcaa8aSmrg  </row>
1416e9fcaa8aSmrg</tbody>
1417e9fcaa8aSmrg</tgroup>
1418e9fcaa8aSmrg</table>
1419e9fcaa8aSmrg
1420e9fcaa8aSmrg<para>
14210f8248bfSmrgEach of the X and Y coordinates of the
14220f8248bfSmrg<structname>XkbPtrAction</structname>
14230f8248bfSmrgstructure is composed of two signed 16-bit values, that is, the X coordinate
14240f8248bfSmrgis composed of
14250f8248bfSmrg<structfield>high_XXX</structfield>
14260f8248bfSmrgand
14270f8248bfSmrg<structfield>low_XXX</structfield>,
14280f8248bfSmrgand similarly for the Y coordinate. Xkb provides the following macros, to
14290f8248bfSmrgconvert between a signed integer and two signed 16-bit values in
14300f8248bfSmrg<structname>XkbPtrAction</structname>
14310f8248bfSmrgstructures:
14320f8248bfSmrg</para>
14330f8248bfSmrg
14340f8248bfSmrg<indexterm significance="preferred" zone="XkbPtrActionX"><primary><function>XkbPtrActionX</function></primary></indexterm>
14350f8248bfSmrg<funcsynopsis id="XkbPtrActionX">
14360f8248bfSmrg  <funcprototype>
14370f8248bfSmrg    <funcdef>int <function>XkbPtrActionX</function></funcdef>
14380f8248bfSmrg<!-- (
14390f8248bfSmrg<parameter>act</parameter>
14400f8248bfSmrg)                              /* macro */ -->
14410f8248bfSmrg
14420f8248bfSmrg    <paramdef>XkbPtrAction <parameter>act</parameter></paramdef>
14430f8248bfSmrg  </funcprototype>
14440f8248bfSmrg</funcsynopsis>
14450f8248bfSmrg<variablelist>
14460f8248bfSmrg  <varlistentry>
14470f8248bfSmrg    <term>
14480f8248bfSmrg      <parameter>act</parameter>
14490f8248bfSmrg    </term>
14500f8248bfSmrg    <listitem>
14510f8248bfSmrg      <para>
14520f8248bfSmrg        action from which to extract X
14530f8248bfSmrg      </para>
14540f8248bfSmrg    </listitem>
14550f8248bfSmrg  </varlistentry>
14560f8248bfSmrg</variablelist>
14570f8248bfSmrg
14580f8248bfSmrg<para>
14590f8248bfSmrg<function>XkbPtrActionX</function>
14600f8248bfSmrgreturns the
14610f8248bfSmrg<structfield>high_XXX</structfield>
14620f8248bfSmrgand
14630f8248bfSmrg<structfield>low_XXX</structfield>
14640f8248bfSmrgfields of
14650f8248bfSmrg<parameter>act</parameter>
14660f8248bfSmrgconverted to a signed int.
14670f8248bfSmrg</para>
14680f8248bfSmrg
14690f8248bfSmrg
14700f8248bfSmrg<indexterm significance="preferred" zone="XkbPtrActionY"><primary><function>XkbPtrActionY</function></primary></indexterm>
14710f8248bfSmrg<funcsynopsis id="XkbPtrActionY">
14720f8248bfSmrg  <funcprototype>
14730f8248bfSmrg    <funcdef>int <function>XkbPtrActionY</function></funcdef>
14740f8248bfSmrg<!-- (
14750f8248bfSmrg<parameter>act</parameter>
14760f8248bfSmrg)                              /* macro */ -->
14770f8248bfSmrg
14780f8248bfSmrg    <paramdef>XkbPtrAction <parameter>act</parameter></paramdef>
14790f8248bfSmrg  </funcprototype>
14800f8248bfSmrg</funcsynopsis>
14810f8248bfSmrg<variablelist>
14820f8248bfSmrg  <varlistentry>
14830f8248bfSmrg    <term>
14840f8248bfSmrg      <parameter>act</parameter>
14850f8248bfSmrg    </term>
14860f8248bfSmrg    <listitem>
14870f8248bfSmrg      <para>
14880f8248bfSmrg        action from which to extract Y
14890f8248bfSmrg      </para>
14900f8248bfSmrg    </listitem>
14910f8248bfSmrg  </varlistentry>
14920f8248bfSmrg</variablelist>
14930f8248bfSmrg
14940f8248bfSmrg<para>
14950f8248bfSmrg<function>XkbPtrActionY</function>
14960f8248bfSmrgreturns the
14970f8248bfSmrg<structfield>high_YYY</structfield>
14980f8248bfSmrgand
14990f8248bfSmrg<structfield>low_YYY</structfield>
15000f8248bfSmrgfields of
15010f8248bfSmrg<parameter>act</parameter>
15020f8248bfSmrgconverted to a signed int.
15030f8248bfSmrg</para>
15040f8248bfSmrg
15050f8248bfSmrg
15060f8248bfSmrg<indexterm significance="preferred" zone="XkbSetPtrActionX"><primary><function>XkbSetPtrActionX</function></primary></indexterm>
15070f8248bfSmrg<funcsynopsis id="XkbSetPtrActionX">
15080f8248bfSmrg  <funcprototype>
15090f8248bfSmrg    <funcdef>void <function>XkbSetPtrActionX</function></funcdef>
15100f8248bfSmrg<!-- (
15110f8248bfSmrg<parameter>act</parameter>,
15120f8248bfSmrg<parameter>x</parameter>
15130f8248bfSmrg)                              /* macro */ -->
15140f8248bfSmrg
15150f8248bfSmrg    <paramdef>XkbPtrAction <parameter>act</parameter></paramdef>
15160f8248bfSmrg    <paramdef>int <parameter>x</parameter></paramdef>
15170f8248bfSmrg  </funcprototype>
15180f8248bfSmrg</funcsynopsis>
15190f8248bfSmrg<variablelist>
15200f8248bfSmrg  <varlistentry>
15210f8248bfSmrg    <term>
15220f8248bfSmrg      <parameter>act</parameter>
15230f8248bfSmrg    </term>
15240f8248bfSmrg    <listitem>
15250f8248bfSmrg      <para>
15260f8248bfSmrg        action in which to set X
15270f8248bfSmrg      </para>
15280f8248bfSmrg    </listitem>
15290f8248bfSmrg  </varlistentry>
15300f8248bfSmrg  <varlistentry>
15310f8248bfSmrg    <term>
15320f8248bfSmrg      <parameter>x</parameter>
15330f8248bfSmrg    </term>
15340f8248bfSmrg    <listitem>
15350f8248bfSmrg      <para>
15360f8248bfSmrg        new value to set
15370f8248bfSmrg      </para>
15380f8248bfSmrg    </listitem>
15390f8248bfSmrg  </varlistentry>
15400f8248bfSmrg</variablelist>
15410f8248bfSmrg
15420f8248bfSmrg<para>
15430f8248bfSmrg<function>XkbSetPtrActionX</function>
15440f8248bfSmrgsets the
15450f8248bfSmrg<structfield>high_XXX</structfield>
15460f8248bfSmrgand
15470f8248bfSmrg<structfield>low_XXX</structfield>
15480f8248bfSmrgfields of
15490f8248bfSmrg<parameter>act</parameter>
15500f8248bfSmrgfrom the signed integer value
15510f8248bfSmrg<parameter>x</parameter>.
15520f8248bfSmrg</para>
15530f8248bfSmrg
15540f8248bfSmrg
15550f8248bfSmrg<indexterm significance="preferred" zone="XkbSetPtrActionY"><primary><function>XkbSetPtrActionY</function></primary></indexterm>
15560f8248bfSmrg<funcsynopsis id="XkbSetPtrActionY">
15570f8248bfSmrg  <funcprototype>
15580f8248bfSmrg    <funcdef>void <function>XkbSetPtrActionY</function></funcdef>
15590f8248bfSmrg<!-- (
15600f8248bfSmrg<parameter>act, y</parameter>
15610f8248bfSmrg)                              /* macro */ -->
15620f8248bfSmrg
15630f8248bfSmrg    <paramdef>XkbPtrAction <parameter>act</parameter></paramdef>
15640f8248bfSmrg    <paramdef>int <parameter>y</parameter></paramdef>
15650f8248bfSmrg  </funcprototype>
15660f8248bfSmrg</funcsynopsis>
15670f8248bfSmrg<variablelist>
15680f8248bfSmrg  <varlistentry>
15690f8248bfSmrg    <term>
15700f8248bfSmrg      <parameter>act</parameter>
15710f8248bfSmrg    </term>
15720f8248bfSmrg    <listitem>
15730f8248bfSmrg      <para>
15740f8248bfSmrg        action in which to set Y
15750f8248bfSmrg      </para>
15760f8248bfSmrg    </listitem>
15770f8248bfSmrg  </varlistentry>
15780f8248bfSmrg  <varlistentry>
15790f8248bfSmrg    <term>
15800f8248bfSmrg      <parameter>y</parameter>
15810f8248bfSmrg    </term>
15820f8248bfSmrg    <listitem>
15830f8248bfSmrg      <para>
15840f8248bfSmrg        new value to set
15850f8248bfSmrg      </para>
15860f8248bfSmrg    </listitem>
15870f8248bfSmrg  </varlistentry>
15880f8248bfSmrg</variablelist>
15890f8248bfSmrg
15900f8248bfSmrg<para>
15910f8248bfSmrg<function>XkbSetPtrActionX</function>
15920f8248bfSmrgsets the
15930f8248bfSmrg<structfield>high_YYY</structfield>
15940f8248bfSmrgand
15950f8248bfSmrg<structfield>low_YYY</structfield>
15960f8248bfSmrgfields of
15970f8248bfSmrg<parameter>act</parameter>
15980f8248bfSmrgfrom the signed integer value
15990f8248bfSmrg<parameter>y</parameter>.
1600e9fcaa8aSmrg</para>
1601e9fcaa8aSmrg
16020f8248bfSmrg
16030f8248bfSmrg</sect2>
16040f8248bfSmrg<sect2 id='Actions_for_Simulating_Pointer_Button_Press_and_Release'>
16050f8248bfSmrg<title>Actions for Simulating Pointer Button Press and Release</title>
16060f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Simulating_Pointer_Button_Press_and_Release">
16070f8248bfSmrg<primary><structname>XkbPtrBtnAction</structname></primary></indexterm>
16080f8248bfSmrg
16090f8248bfSmrg<para>
16100f8248bfSmrgActions associated with the
16110f8248bfSmrg<structname>XkbPtrBtnAction</structname>
16120f8248bfSmrgstructure simulate the press and release of pointer buttons when keys are
16130f8248bfSmrgpressed and released:
16140f8248bfSmrg
16150f8248bfSmrg<programlisting>
16160f8248bfSmrgtypedef struct _XkbPtrBtnAction {
16170f8248bfSmrg    unsigned char   type;     /* <symbol>XkbSA_PtrBtn</symbol>, <symbol>XkbSA_LockPtrBtn</symbol> */
16180f8248bfSmrg    unsigned char   flags;    /* with <structfield>type</structfield>, controls the effect
16190f8248bfSmrg                                 on pointer buttons */
16200f8248bfSmrg    unsigned char   count;    /* controls number of ButtonPress and
16210f8248bfSmrg                                 ButtonRelease events */
16220f8248bfSmrg    unsigned char   button;   /* pointer button to simulate */
16230f8248bfSmrg} <structname>XkbPtrBtnAction</structname>;
16240f8248bfSmrg</programlisting></para>
1625e9fcaa8aSmrg
1626e9fcaa8aSmrg<para>
16270f8248bfSmrgIf the
16280f8248bfSmrg<emphasis>MouseKeys</emphasis>
16290f8248bfSmrg(see <link linkend="The_MouseKeys_Control">section 10.5.1</link>) control is not enabled,
16300f8248bfSmrg<symbol>KeyPress</symbol>
16310f8248bfSmrgand
16320f8248bfSmrg<symbol>KeyRelease</symbol>
16330f8248bfSmrgevents are treated as though the action is
16340f8248bfSmrg<symbol>XkbSA_NoAction</symbol>.
1635e9fcaa8aSmrg</para>
1636e9fcaa8aSmrg
1637e9fcaa8aSmrg
16380f8248bfSmrg<para>
16390f8248bfSmrgThe
16400f8248bfSmrg<structfield>type</structfield>
16410f8248bfSmrgfield can have any one of the values shown in
16420f8248bfSmrg<link linkend="table16.7">Table 16.7</link>.
16430f8248bfSmrg</para>
16440f8248bfSmrg
16450f8248bfSmrg<table id='table16.7' frame='topbot'>
16460f8248bfSmrg<title>Pointer Button Action Types</title>
1647eb411b4bSmrg<?dbfo keep-together="always" ?>
16480f8248bfSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1649eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
16500f8248bfSmrg<colspec colname='c2' colwidth='2.0*'/>
16510f8248bfSmrg<thead>
16520f8248bfSmrg<row rowsep='1'>
16530f8248bfSmrg  <entry>Type</entry>
16540f8248bfSmrg  <entry>Effect</entry>
16550f8248bfSmrg</row>
16560f8248bfSmrg</thead>
1657e9fcaa8aSmrg<tbody>
1658eb411b4bSmrg  <row>
16590f8248bfSmrg    <entry><symbol>XkbSA_PtrBtn</symbol></entry>
1660e9fcaa8aSmrg    <entry>
1661e9fcaa8aSmrg<itemizedlist>
1662e9fcaa8aSmrg  <listitem>
1663e9fcaa8aSmrg    <para>
16640f8248bfSmrgIf
16650f8248bfSmrg<symbol>XkbSA_UseDfltButton</symbol>
16660f8248bfSmrgis set in the
16670f8248bfSmrg<structfield>flags</structfield>
16680f8248bfSmrgfield, the event is generated for the pointer button specified by the
16690f8248bfSmrg<structfield>mk_dflt_btn</structfield>
16700f8248bfSmrgattribute of the
16710f8248bfSmrg<emphasis>MouseKeys</emphasis>
16720f8248bfSmrgcontrol (see <link linkend="The_MouseKeys_Control">section 10.5.1</link>). Otherwise, the event is generated for the button
16730f8248bfSmrgspecified by the
16740f8248bfSmrg<structfield>button</structfield>
16750f8248bfSmrgfield.
1676e9fcaa8aSmrg    </para>
1677e9fcaa8aSmrg  </listitem>
1678e9fcaa8aSmrg  <listitem>
1679e9fcaa8aSmrg    <para>
1680e9fcaa8aSmrgIf the mouse button specified for this action is logically down, the key press
1681e9fcaa8aSmrgand corresponding key release are ignored and have no effect. Otherwise, a key
1682e9fcaa8aSmrgpress causes one or more core pointer button events instead of the usual
16830f8248bfSmrg<symbol>KeyPress</symbol>
16840f8248bfSmrgevent. If
16850f8248bfSmrg<structfield>count</structfield>
16860f8248bfSmrgis
16870f8248bfSmrg<emphasis>zero</emphasis>,
16880f8248bfSmrga key press generates a single
16890f8248bfSmrg<symbol>ButtonPress</symbol>
16900f8248bfSmrgevent; if
16910f8248bfSmrg<structfield>count</structfield>
16920f8248bfSmrgis greater than
16930f8248bfSmrg<emphasis>zero</emphasis>,
16940f8248bfSmrga key press generates
16950f8248bfSmrg<structfield>count</structfield>
16960f8248bfSmrgpairs of
16970f8248bfSmrg<symbol>ButtonPress</symbol>
16980f8248bfSmrgand
16990f8248bfSmrg<symbol>ButtonRelease</symbol>
17000f8248bfSmrgevents.
1701e9fcaa8aSmrg    </para>
1702e9fcaa8aSmrg  </listitem>
1703e9fcaa8aSmrg  <listitem>
1704e9fcaa8aSmrg    <para>
17050f8248bfSmrgIf
17060f8248bfSmrg<structfield>count</structfield>
17070f8248bfSmrgis
17080f8248bfSmrg<emphasis>zero</emphasis>,
17090f8248bfSmrga key release generates a core pointer
17100f8248bfSmrg<symbol>ButtonRelease</symbol>
17110f8248bfSmrgthat matches the event generated by the corresponding
17120f8248bfSmrg<symbol>KeyPress</symbol>;
17130f8248bfSmrgif
17140f8248bfSmrg<structfield>count</structfield>
17150f8248bfSmrgis nonzero, a key release does not cause a
17160f8248bfSmrg<symbol>ButtonRelease</symbol>
17170f8248bfSmrgevent. A key release never generates a key
17180f8248bfSmrg<symbol>KeyRelease</symbol>
17190f8248bfSmrgevent.
1720e9fcaa8aSmrg    </para>
1721e9fcaa8aSmrg  </listitem>
1722e9fcaa8aSmrg</itemizedlist>
1723e9fcaa8aSmrg    </entry>
1724e9fcaa8aSmrg  </row>
1725eb411b4bSmrg  <row>
17260f8248bfSmrg    <entry><symbol>XkbSA_LockPtrBtn</symbol></entry>
1727e9fcaa8aSmrg    <entry>
1728e9fcaa8aSmrg<itemizedlist>
1729e9fcaa8aSmrg  <listitem>
1730e9fcaa8aSmrg    <para>
17310f8248bfSmrgIf the button specified by the
17320f8248bfSmrg<emphasis>MouseKeys</emphasis>
17330f8248bfSmrgdefault button
17340f8248bfSmrgor
17350f8248bfSmrg<structfield>button</structfield>
17360f8248bfSmrgis not locked, a key press causes a
17370f8248bfSmrg<symbol>ButtonPress</symbol>
17380f8248bfSmrgevent instead of a
17390f8248bfSmrg<symbol>KeyPress</symbol>
17400f8248bfSmrgevent and locks the button. If the button is already locked or if
17410f8248bfSmrg<symbol>XkbSA_LockNoUnlock</symbol>
17420f8248bfSmrgis set in the
17430f8248bfSmrg<structfield>flags</structfield>
17440f8248bfSmrgfield, a key press is ignored and has no effect.
1745e9fcaa8aSmrg    </para>
1746e9fcaa8aSmrg  </listitem>
1747e9fcaa8aSmrg  <listitem>
1748e9fcaa8aSmrg    <para>
17490f8248bfSmrgIf the corresponding key press was ignored, and if
17500f8248bfSmrg<symbol>XkbSA_LockNoLock</symbol>
17510f8248bfSmrgis not set in the
17520f8248bfSmrg<structfield>flags</structfield>
17530f8248bfSmrgfield, a key release generates a
17540f8248bfSmrg<symbol>ButtonRelease</symbol>
17550f8248bfSmrgevent instead of a
17560f8248bfSmrg<symbol>KeyRelease</symbol>
17570f8248bfSmrgevent and unlocks the specified button. If the corresponding key press locked
1758e9fcaa8aSmrga button, the key release is ignored and has no effect.
1759e9fcaa8aSmrg    </para>
1760e9fcaa8aSmrg  </listitem>
1761e9fcaa8aSmrg</itemizedlist>
1762e9fcaa8aSmrg    </entry>
1763e9fcaa8aSmrg  </row>
1764e9fcaa8aSmrg</tbody>
1765e9fcaa8aSmrg</tgroup>
1766e9fcaa8aSmrg</table>
1767e9fcaa8aSmrg
1768e9fcaa8aSmrg<para>
17690f8248bfSmrgThe
17700f8248bfSmrg<structfield>flags</structfield>
17710f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
17720f8248bfSmrg<link linkend="table16.8">Table 16.8</link>.
17730f8248bfSmrgA general meaning is given in the table, but the exact meaning depends on
17740f8248bfSmrgthe action
17750f8248bfSmrg<structfield>type</structfield>:
1776e9fcaa8aSmrg</para>
1777e9fcaa8aSmrg
17780f8248bfSmrg<table id='table16.8' frame='topbot'>
1779e9fcaa8aSmrg<title>Pointer Button Action Flags</title>
1780eb411b4bSmrg<?dbfo keep-together="always" ?>
1781eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1782eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1783eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1784e9fcaa8aSmrg<thead>
1785eb411b4bSmrg<row rowsep='1'>
1786e9fcaa8aSmrg  <entry>Flag</entry>
1787e9fcaa8aSmrg  <entry>Meaning</entry>
1788e9fcaa8aSmrg</row>
1789e9fcaa8aSmrg</thead>
1790e9fcaa8aSmrg<tbody>
1791eb411b4bSmrg  <row>
17920f8248bfSmrg    <entry><symbol>XkbSA_UseDfltButton</symbol></entry>
1793e9fcaa8aSmrg    <entry>
17940f8248bfSmrgIf set, the action uses the pointer button specified by the
17950f8248bfSmrg<structfield>mk_dflt_btn</structfield>
17960f8248bfSmrgattribute of the
17970f8248bfSmrg<emphasis>MouseKeys</emphasis>
17980f8248bfSmrgcontrol (see <link linkend="The_MouseKeys_Control">section 10.5.1</link>). Otherwise, the action uses the pointer button
17990f8248bfSmrgspecified by the
18000f8248bfSmrg<structfield>button</structfield>
1801e9fcaa8aSmrgfield.
1802e9fcaa8aSmrg    </entry>
1803e9fcaa8aSmrg  </row>
1804eb411b4bSmrg  <row>
18050f8248bfSmrg    <entry><symbol>XkbSA_LockNoLock</symbol></entry>
1806e9fcaa8aSmrg    <entry>
18070f8248bfSmrgIf set, and the action type is
18080f8248bfSmrg<symbol>XkbSA_LockPtrBtn</symbol>,
18090f8248bfSmrgthe server only unlocks the pointer button.
1810e9fcaa8aSmrg    </entry>
1811e9fcaa8aSmrg  </row>
1812eb411b4bSmrg  <row>
18130f8248bfSmrg    <entry><symbol>XkbSA_LockNoUnlock</symbol></entry>
1814e9fcaa8aSmrg    <entry>
18150f8248bfSmrgIf set, and the action type is
18160f8248bfSmrg<symbol>XkbSA_LockPtrBtn</symbol>,
18170f8248bfSmrgthe server only locks the pointer button.
1818e9fcaa8aSmrg    </entry>
1819e9fcaa8aSmrg  </row>
1820e9fcaa8aSmrg</tbody>
1821e9fcaa8aSmrg</tgroup>
1822e9fcaa8aSmrg</table>
1823e9fcaa8aSmrg
1824e9fcaa8aSmrg</sect2>
1825eb411b4bSmrg<sect2 id='Actions_for_Changing_the_Pointer_Button_Simulated'>
1826e9fcaa8aSmrg<title>Actions for Changing the Pointer Button Simulated</title>
18270f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_the_Pointer_Button_Simulated">
18280f8248bfSmrg<primary><structname>XkbPtrDfltAction</structname></primary></indexterm>
1829e9fcaa8aSmrg
1830e9fcaa8aSmrg<para>
18310f8248bfSmrgActions associated with the
18320f8248bfSmrg<structname>XkbPtrDfltAction</structname>
18330f8248bfSmrgstructure change the
18340f8248bfSmrg<structfield>mk_dflt_btn</structfield>
18350f8248bfSmrgattribute of the
18360f8248bfSmrg<emphasis>MouseKeys</emphasis>
18370f8248bfSmrgcontrol (see <link linkend="The_MouseKeys_Control">section 10.5.1</link>):
1838e9fcaa8aSmrg
18390f8248bfSmrg<programlisting>
1840e9fcaa8aSmrgtypedef struct _XkbPtrDfltAction {
18410f8248bfSmrg    unsigned char   type;      /* <symbol>XkbSA_SetPtrDflt</symbol> */
18420f8248bfSmrg    unsigned char   flags;     /* controls the pointer button number */
18430f8248bfSmrg    unsigned char   affect;    /* <symbol>XkbSA_AffectDfltBtn</symbol> */
18440f8248bfSmrg    char            valueXXX;  /* new default button member */
18450f8248bfSmrg} <structname>XkbPtrDfltAction</structname>;
1846e9fcaa8aSmrg</programlisting></para>
1847e9fcaa8aSmrg
1848e9fcaa8aSmrg<para>
18490f8248bfSmrgIf the
18500f8248bfSmrg<emphasis>MouseKeys</emphasis>
18510f8248bfSmrgcontrol is not enabled,
18520f8248bfSmrg<symbol>KeyPress</symbol>
18530f8248bfSmrgand
18540f8248bfSmrg<symbol>KeyRelease</symbol>
18550f8248bfSmrgevents are treated as though the action is
18560f8248bfSmrg<symbol>XkbSA_NoAction</symbol>.
18570f8248bfSmrgOtherwise, this action changes the
18580f8248bfSmrg<structfield>mk_dflt_btn</structfield>
18590f8248bfSmrgattribute of the
18600f8248bfSmrg<emphasis>MouseKeys</emphasis>
18610f8248bfSmrgcontrol.
1862e9fcaa8aSmrg</para>
1863e9fcaa8aSmrg
1864e9fcaa8aSmrg
1865e9fcaa8aSmrg<para>
18660f8248bfSmrgThe
18670f8248bfSmrg<structfield>type</structfield>
18680f8248bfSmrgfield of the
18690f8248bfSmrg<structname>XkbPtrDfltAction</structname>
18700f8248bfSmrgstructure should always be
18710f8248bfSmrg<symbol>XkbSA_SetPtrDflt</symbol>.
1872e9fcaa8aSmrg</para>
1873e9fcaa8aSmrg
1874e9fcaa8aSmrg
1875e9fcaa8aSmrg<para>
18760f8248bfSmrgThe
18770f8248bfSmrg<structfield>flags</structfield>
18780f8248bfSmrgfield is composed of the bitwise inclusive OR of the values shown in
18790f8248bfSmrg<link linkend="table16.9">Table 16.9</link>
18800f8248bfSmrg(currently there is only one value defined).
1881e9fcaa8aSmrg</para>
1882e9fcaa8aSmrg
18830f8248bfSmrg<table id='table16.9' frame='topbot'>
1884e9fcaa8aSmrg<title>Pointer Default Flags</title>
1885eb411b4bSmrg<?dbfo keep-together="always" ?>
1886eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1887eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1888eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1889e9fcaa8aSmrg<thead>
1890eb411b4bSmrg<row rowsep='1'>
1891e9fcaa8aSmrg  <entry>Flag</entry>
1892e9fcaa8aSmrg  <entry>Meaning</entry>
1893e9fcaa8aSmrg</row>
1894e9fcaa8aSmrg</thead>
1895e9fcaa8aSmrg<tbody>
1896eb411b4bSmrg  <row>
18970f8248bfSmrg    <entry><symbol>XkbSA_DfltBtnAbsolute</symbol></entry>
1898e9fcaa8aSmrg    <entry>
18990f8248bfSmrgIf set, the
19000f8248bfSmrg<structfield>value</structfield>
19010f8248bfSmrgfield represents an absolute pointer button. Otherwise, the
19020f8248bfSmrg<structfield>value</structfield>
19030f8248bfSmrgfield represents the amount to be added to the current default button.
1904e9fcaa8aSmrg    </entry>
1905e9fcaa8aSmrg  </row>
1906e9fcaa8aSmrg</tbody>
1907e9fcaa8aSmrg</tgroup>
1908e9fcaa8aSmrg</table>
1909e9fcaa8aSmrg
1910e9fcaa8aSmrg<para>
19110f8248bfSmrgThe
19120f8248bfSmrg<structfield>affect</structfield>
19130f8248bfSmrgfield specifies what changes as a result of this action. The only valid value
19140f8248bfSmrgfor the
19150f8248bfSmrg<structfield>affect</structfield>
19160f8248bfSmrgfield is <symbol>XkbSA_AffectDfltBtn</symbol>.
19170f8248bfSmrg</para>
19180f8248bfSmrg
19190f8248bfSmrg<para>
19200f8248bfSmrgThe
19210f8248bfSmrg<structfield>valueXXX</structfield>
19220f8248bfSmrgfield is a signed character that represents the new button value for the
19230f8248bfSmrg<structfield>mk_dflt_btn</structfield>
19240f8248bfSmrgattribute of the
19250f8248bfSmrg<emphasis>MouseKeys</emphasis>
19260f8248bfSmrgcontrol (see <link linkend="The_MouseKeys_Control">section 10.5.1</link>). If
19270f8248bfSmrg<symbol>XkbSA_DfltBtnAbsolute</symbol>
19280f8248bfSmrgis set in
19290f8248bfSmrg<structfield>flags</structfield>,
19300f8248bfSmrg<structfield>valueXXX</structfield>
19310f8248bfSmrgspecifies the button to be used; otherwise,
19320f8248bfSmrg<structfield>valueXXX</structfield>
19330f8248bfSmrgspecifies the amount to be added to the current default button. In either
1934e9fcaa8aSmrgcase, illegal button choices are wrapped back around into range. Xkb provides
1935e9fcaa8aSmrgthe following macros, to convert between the integer and signed character
19360f8248bfSmrgvalues in
19370f8248bfSmrg<structname>XkbPtrDfltAction</structname>
19380f8248bfSmrgstructures:
19390f8248bfSmrg</para>
19400f8248bfSmrg
19410f8248bfSmrg<indexterm significance="preferred" zone="XkbSAPtrDfltValue"><primary><function>XkbSAPtrDfltValue</function></primary></indexterm>
19420f8248bfSmrg<funcsynopsis id="XkbSAPtrDfltValue">
19430f8248bfSmrg  <funcprototype>
19440f8248bfSmrg    <funcdef>int <function>XkbSAPtrDfltValue</function></funcdef>
19450f8248bfSmrg<!-- (
19460f8248bfSmrg<parameter>act</parameter>
19470f8248bfSmrg)                              /* macro */ -->
19480f8248bfSmrg
19490f8248bfSmrg    <paramdef>XkbAction <parameter>act</parameter></paramdef>
19500f8248bfSmrg  </funcprototype>
19510f8248bfSmrg</funcsynopsis>
19520f8248bfSmrg<variablelist>
19530f8248bfSmrg  <varlistentry>
19540f8248bfSmrg    <term>
19550f8248bfSmrg      <parameter>act</parameter>
19560f8248bfSmrg    </term>
19570f8248bfSmrg    <listitem>
19580f8248bfSmrg      <para>
19590f8248bfSmrg        action from which to extract group
19600f8248bfSmrg      </para>
19610f8248bfSmrg    </listitem>
19620f8248bfSmrg  </varlistentry>
19630f8248bfSmrg</variablelist>
19640f8248bfSmrg
19650f8248bfSmrg<para>
19660f8248bfSmrg<function>XkbSAPtrDfltValue</function>
19670f8248bfSmrgreturns the
19680f8248bfSmrg<structfield>valueXXX</structfield>
19690f8248bfSmrgfield of
19700f8248bfSmrg<parameter>act</parameter>
19710f8248bfSmrgconverted to a signed int.
19720f8248bfSmrg</para>
19730f8248bfSmrg
19740f8248bfSmrg
19750f8248bfSmrg<indexterm significance="preferred" zone="XkbSASetPtrDfltValue"><primary><function>XkbSASetPtrDfltValue</function></primary></indexterm>
19760f8248bfSmrg<funcsynopsis id="XkbSASetPtrDfltValue">
19770f8248bfSmrg  <funcprototype>
19780f8248bfSmrg    <funcdef>void <function>XkbSASetPtrDfltValue</function></funcdef>
19790f8248bfSmrg<!-- (
19800f8248bfSmrg<parameter>act, val</parameter>
19810f8248bfSmrg)                              /* macro */ -->
19820f8248bfSmrg
19830f8248bfSmrg    <paramdef>XkbPtrDfltAction <parameter>act</parameter></paramdef>
19840f8248bfSmrg    <paramdef>int <parameter>val</parameter></paramdef>
19850f8248bfSmrg  </funcprototype>
19860f8248bfSmrg</funcsynopsis>
19870f8248bfSmrg<variablelist>
19880f8248bfSmrg  <varlistentry>
19890f8248bfSmrg    <term>
19900f8248bfSmrg      <parameter>act</parameter>
19910f8248bfSmrg    </term>
19920f8248bfSmrg    <listitem>
19930f8248bfSmrg      <para>
19940f8248bfSmrg        action in which to set <structfield>valueXXX</structfield>
19950f8248bfSmrg      </para>
19960f8248bfSmrg    </listitem>
19970f8248bfSmrg  </varlistentry>
19980f8248bfSmrg  <varlistentry>
19990f8248bfSmrg    <term>
20000f8248bfSmrg      <parameter>val</parameter>
20010f8248bfSmrg    </term>
20020f8248bfSmrg    <listitem>
20030f8248bfSmrg      <para>
20040f8248bfSmrg        value to set in <structfield>valueXXX</structfield>
20050f8248bfSmrg      </para>
20060f8248bfSmrg    </listitem>
20070f8248bfSmrg  </varlistentry>
20080f8248bfSmrg</variablelist>
2009e9fcaa8aSmrg
2010e9fcaa8aSmrg<para>
20110f8248bfSmrg<function>XkbSASetPtrDfltValue</function>
20120f8248bfSmrgsets the
20130f8248bfSmrg<structfield>valueXXX</structfield>
20140f8248bfSmrgfield of
20150f8248bfSmrg<parameter>act</parameter>
20160f8248bfSmrgfrom
20170f8248bfSmrg<parameter>val</parameter>.
2018e9fcaa8aSmrg</para>
2019e9fcaa8aSmrg
2020e9fcaa8aSmrg
2021e9fcaa8aSmrg</sect2>
2022eb411b4bSmrg<sect2 id='Actions_for_Locking_Modifiers_and_Group'>
2023e9fcaa8aSmrg<title>Actions for Locking Modifiers and Group</title>
20240f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Locking_Modifiers_and_Group">
20250f8248bfSmrg<primary><structname>XkbISOAction</structname></primary></indexterm>
2026e9fcaa8aSmrg
2027e9fcaa8aSmrg<para>
20280f8248bfSmrgActions associated with the
20290f8248bfSmrg<structname>XkbISOAction</structname>
20300f8248bfSmrgstructure lock modifiers and the group according to the ISO9995 specification.
2031e9fcaa8aSmrg</para>
2032e9fcaa8aSmrg
2033e9fcaa8aSmrg
2034e9fcaa8aSmrg<para>
20350f8248bfSmrgOperated by itself, the
20360f8248bfSmrg<structname>XkbISOAction</structname>
20370f8248bfSmrgis just a caps lock. Operated simultaneously with another modifier key, it
20380f8248bfSmrgtransforms the other key into a locking key. For example, press
20390f8248bfSmrg<keysym>ISO_Lock</keysym>,
20400f8248bfSmrgpress and release
20410f8248bfSmrg<keysym>Control_L</keysym>,
20420f8248bfSmrgrelease
20430f8248bfSmrg<keysym>ISO_Lock</keysym>
20440f8248bfSmrgends up locking the
20450f8248bfSmrg<symbol>Control</symbol>
20460f8248bfSmrgmodifier.
2047e9fcaa8aSmrg</para>
2048e9fcaa8aSmrg
2049e9fcaa8aSmrg
2050e9fcaa8aSmrg<para>
2051e9fcaa8aSmrgThe default behavior is to convert:
2052e9fcaa8aSmrg
20530f8248bfSmrg<simplelist type='vert' columns='1'>
20540f8248bfSmrg  <member>{Set,Latch}Mods to: LockMods</member>
20550f8248bfSmrg  <member>{Set,Latch}Group to: LockGroup</member>
20560f8248bfSmrg  <member>SetPtrBtn to: LockPtrBtn</member>
20570f8248bfSmrg  <member>SetControls to: LockControls</member>
20580f8248bfSmrg</simplelist>
20590f8248bfSmrg</para>
2060e9fcaa8aSmrg
2061e9fcaa8aSmrg<para>
20620f8248bfSmrgThe
20630f8248bfSmrg<emphasis>affects</emphasis>
20640f8248bfSmrgfield allows you to turn those effects on or off individually. Set
20650f8248bfSmrg<symbol>XkbSA_ISONoAffectMods</symbol>
20660f8248bfSmrgto disable the first,
20670f8248bfSmrg<symbol>XkbSA_ISONoAffectGroup</symbol>
20680f8248bfSmrgto disable the second, and so forth.
2069e9fcaa8aSmrg</para>
2070e9fcaa8aSmrg
2071e9fcaa8aSmrg<para><programlisting>
2072e9fcaa8aSmrgtypedef struct _XkbISOAction {
20730f8248bfSmrg    unsigned char   type;        /* <symbol>XkbSA_ISOLock</symbol> */
20740f8248bfSmrg    unsigned char   flags;       /* controls changes to group or
20750f8248bfSmrg                                    modifier state */
20760f8248bfSmrg    unsigned char   mask;        /* same as <structfield>mask</structfield> field of
20770f8248bfSmrg                                    a modifier description */
20780f8248bfSmrg    unsigned char   real_mods;   /* same as <structfield>real_mods</structfield> field of
20790f8248bfSmrg                                    a modifier description */
20800f8248bfSmrg    char            group_XXX;   /* group index or delta group */
20810f8248bfSmrg    unsigned char   affect;      /* specifies whether to affect
20820f8248bfSmrg                                    mods, group, ptrbtn, or controls */
20830f8248bfSmrg    unsigned char   vmods1;      /* derived from <structfield>vmods</structfield> field of
20840f8248bfSmrg                                    a modifier description */
20850f8248bfSmrg    unsigned char   vmods2;      /* derived from <structfield>vmods</structfield> field of
20860f8248bfSmrg                                    a modifier description */
20870f8248bfSmrg} <structname>XkbISOAction</structname>;
2088e9fcaa8aSmrg</programlisting></para>
2089e9fcaa8aSmrg
2090e9fcaa8aSmrg<para>
20910f8248bfSmrgThe
20920f8248bfSmrg<structfield>type</structfield>
20930f8248bfSmrgfield of the
20940f8248bfSmrg<structname>XkbISOAction</structname>
20950f8248bfSmrgstructure should always be
20960f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>.
2097e9fcaa8aSmrg</para>
2098e9fcaa8aSmrg
2099e9fcaa8aSmrg
2100e9fcaa8aSmrg<para>
21010f8248bfSmrgThe interpretation of the
21020f8248bfSmrg<structfield>flags</structfield>
21030f8248bfSmrgfield depends on whether the
21040f8248bfSmrg<symbol>XkbSA_ISODfltIsGroup</symbol>
21050f8248bfSmrgis set in the
21060f8248bfSmrg<structfield>flags</structfield>
21070f8248bfSmrgfield or not.
2108e9fcaa8aSmrg</para>
2109e9fcaa8aSmrg
2110e9fcaa8aSmrg
2111e9fcaa8aSmrg<para>
21120f8248bfSmrgIf the
21130f8248bfSmrg<symbol>XkbSA_ISODfltIsGroup</symbol>
21140f8248bfSmrgis set in the
21150f8248bfSmrg<structfield>flags</structfield>
21160f8248bfSmrgfield, the action is used to change the group state. The remaining valid bits
21170f8248bfSmrgof the
21180f8248bfSmrg<structfield>flags</structfield>
21190f8248bfSmrgfield are composed of a bitwise inclusive OR using the masks shown in
21200f8248bfSmrg<link linkend="table16.10">Table 16.10</link>.
2121e9fcaa8aSmrg</para>
2122e9fcaa8aSmrg
21230f8248bfSmrg<table id='table16.10' frame='topbot'>
2124e9fcaa8aSmrg<title>ISO Action Flags when XkbSA_ISODfltIsGroup is Set</title>
2125eb411b4bSmrg<?dbfo keep-together="always" ?>
2126eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2127eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2128eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2129e9fcaa8aSmrg<thead>
2130eb411b4bSmrg<row rowsep='1'>
2131e9fcaa8aSmrg  <entry>Flag</entry>
2132e9fcaa8aSmrg  <entry>Meaning</entry>
2133e9fcaa8aSmrg</row>
2134e9fcaa8aSmrg</thead>
2135e9fcaa8aSmrg<tbody>
2136eb411b4bSmrg  <row>
21370f8248bfSmrg    <entry><symbol>XkbSA_ISODfltIsGroup</symbol></entry>
2138e9fcaa8aSmrg    <entry>
2139e9fcaa8aSmrg      <para>
2140e9fcaa8aSmrgIf set, the action is used to change the base group state. Must be set for the
2141e9fcaa8aSmrgremaining bits in this table to carry their interpretations.
2142e9fcaa8aSmrg      </para>
2143e9fcaa8aSmrg      <para>
21440f8248bfSmrgA key press sets the base group as specified by the
21450f8248bfSmrg<structfield>group_XXX</structfield>
21460f8248bfSmrgfield and the
21470f8248bfSmrg<symbol>XkbSA_GroupAbsolute</symbol>
21480f8248bfSmrgbit of the
21490f8248bfSmrg<structfield>flags</structfield>
21500f8248bfSmrgfield (see section Note). If no other actions are transformed by the
21510f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
21520f8248bfSmrgaction, a key release locks the group. Otherwise, a key release clears group
2153e9fcaa8aSmrgset by the key press.
2154e9fcaa8aSmrg      </para>
2155e9fcaa8aSmrg    </entry>
2156e9fcaa8aSmrg  </row>
2157eb411b4bSmrg  <row>
21580f8248bfSmrg    <entry><symbol>XkbSA_GroupAbsolute</symbol></entry>
2159e9fcaa8aSmrg    <entry>
21600f8248bfSmrgIf set, the
21610f8248bfSmrg<structfield>group_XXX</structfield>
21620f8248bfSmrgfield represents an absolute group number. Otherwise, it represents a group
2163e9fcaa8aSmrgdelta to be added to the current group to determine the new group number.
2164e9fcaa8aSmrg    </entry>
2165e9fcaa8aSmrg  </row>
2166eb411b4bSmrg  <row>
21670f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectMods</symbol></entry>
2168e9fcaa8aSmrg    <entry>
21690f8248bfSmrgIf not set, any
21700f8248bfSmrg<symbol>XkbSA_SetMods</symbol>
21710f8248bfSmrgor
21720f8248bfSmrg<symbol>XkbSA_LatchMods</symbol>
21730f8248bfSmrgactions that occur simultaneously with the
21740f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
21750f8248bfSmrgaction are treated as
21760f8248bfSmrg<symbol>XkbSA_LockMods</symbol>
21770f8248bfSmrgactions instead.
2178e9fcaa8aSmrg    </entry>
2179e9fcaa8aSmrg  </row>
2180eb411b4bSmrg  <row>
21810f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectGroup</symbol></entry>
2182e9fcaa8aSmrg    <entry>
21830f8248bfSmrgIf not set, any
21840f8248bfSmrg<symbol>XkbSA_SetGroup</symbol>
21850f8248bfSmrgor
21860f8248bfSmrg<symbol>XkbSA_LatchGroup</symbol>
21870f8248bfSmrgactions that occur simultaneously with the
21880f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
21890f8248bfSmrgaction are treated as
21900f8248bfSmrg<symbol>XkbSA_LockGroup</symbol>
21910f8248bfSmrgactions instead.
2192e9fcaa8aSmrg    </entry>
2193e9fcaa8aSmrg  </row>
2194eb411b4bSmrg  <row>
21950f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectPtr</symbol></entry>
2196e9fcaa8aSmrg    <entry>
21970f8248bfSmrgIf not set, any
21980f8248bfSmrg<symbol>XkbSA_PtrBtn</symbol>
21990f8248bfSmrgactions that occur simultaneously with the
22000f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
22010f8248bfSmrgaction are treated as
22020f8248bfSmrg<symbol>XkbSA_LockPtrBtn</symbol>
22030f8248bfSmrgactions instead.
2204e9fcaa8aSmrg    </entry>
2205e9fcaa8aSmrg  </row>
2206eb411b4bSmrg  <row>
22070f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectCtrls</symbol></entry>
2208e9fcaa8aSmrg    <entry>
22090f8248bfSmrgIf not set, any
22100f8248bfSmrg<symbol>XkbSA_SetControls</symbol>
22110f8248bfSmrgactions that occur simultaneously with the
22120f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
22130f8248bfSmrgaction are treated as
22140f8248bfSmrg<symbol>XkbSA_LockControls</symbol>
22150f8248bfSmrgactions instead.
2216e9fcaa8aSmrg    </entry>
2217e9fcaa8aSmrg  </row>
2218e9fcaa8aSmrg</tbody>
2219e9fcaa8aSmrg</tgroup>
2220e9fcaa8aSmrg</table>
2221e9fcaa8aSmrg
2222e9fcaa8aSmrg<para>
22230f8248bfSmrgIf the
22240f8248bfSmrg<symbol>XkbSA_ISODfltIsGroup</symbol>
22250f8248bfSmrgis not set in the
22260f8248bfSmrg<structfield>flags</structfield>
22270f8248bfSmrgfield, the action is used to change the modifier state and the remaining valid
22280f8248bfSmrgbits of the
22290f8248bfSmrg<structfield>flags</structfield>
22300f8248bfSmrgfield are composed of a bitwise inclusive OR using the masks shown in
22310f8248bfSmrg<link linkend="table16.11">Table 16.11</link>.
2232e9fcaa8aSmrg</para>
2233e9fcaa8aSmrg
22340f8248bfSmrg<table id='table16.11' frame='topbot'>
2235e9fcaa8aSmrg<title>ISO Action Flags when XkbSA_ISODfltIsGroup is Not Set</title>
2236eb411b4bSmrg<?dbfo keep-together="always" ?>
2237eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2238eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2239eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2240e9fcaa8aSmrg<thead>
2241eb411b4bSmrg<row rowsep='1'>
2242e9fcaa8aSmrg  <entry>Flag</entry>
2243e9fcaa8aSmrg  <entry>Meaning</entry>
2244e9fcaa8aSmrg</row>
2245e9fcaa8aSmrg</thead>
2246e9fcaa8aSmrg<tbody>
2247eb411b4bSmrg  <row>
22480f8248bfSmrg    <entry><symbol>XkbSA_ISODfltIsGroup</symbol> </entry>
2249e9fcaa8aSmrg    <entry>
2250e9fcaa8aSmrg      <para>
2251e9fcaa8aSmrgIf not set, action is used to change the base modifier state. Must not be set
2252e9fcaa8aSmrgfor the remaining bits in this table to carry their interpretations.
2253e9fcaa8aSmrg      </para>
2254e9fcaa8aSmrg      <para>
2255e9fcaa8aSmrgA key press sets the action modifiers in the keyboard’s base modifiers using
22560f8248bfSmrgthe
22570f8248bfSmrg<structfield>mask</structfield>,
22580f8248bfSmrg<structfield>real_mods</structfield>,
22590f8248bfSmrg<structfield>vmods1</structfield>,
22600f8248bfSmrgand
22610f8248bfSmrg<structfield>vmods2</structfield>
22620f8248bfSmrgfields (see <link linkend="Actions_for_Changing_Modifiers_State">section 16.1.3</link>). If no other actions are transformed by the
22630f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
22640f8248bfSmrgaction, a key release locks the action modifiers. Otherwise, a key release
2265e9fcaa8aSmrgclears the base modifiers set by the key press.
2266e9fcaa8aSmrg      </para>
2267e9fcaa8aSmrg    </entry>
2268e9fcaa8aSmrg  </row>
2269eb411b4bSmrg  <row>
22700f8248bfSmrg    <entry><symbol>XkbSA_UseModMapMods</symbol></entry>
2271e9fcaa8aSmrg    <entry>
2272e9fcaa8aSmrgIf set, the action modifiers are determined by the modifiers bound by the
2273e9fcaa8aSmrgmodifier mapping of the key. Otherwise, the action modifiers are set to the
22740f8248bfSmrgmodifiers specified by the
22750f8248bfSmrg<structfield>mask</structfield>,
22760f8248bfSmrg<structfield>real_mods</structfield>,
22770f8248bfSmrg<structfield>vmods1</structfield>,
22780f8248bfSmrgand
22790f8248bfSmrg<structfield>vmods2</structfield>
22800f8248bfSmrgfields.
2281e9fcaa8aSmrg    </entry>
2282e9fcaa8aSmrg  </row>
2283eb411b4bSmrg  <row>
22840f8248bfSmrg    <entry><symbol>XkbSA_LockNoLock</symbol></entry>
2285e9fcaa8aSmrg    <entry>If set, the server only unlocks the action modifiers.</entry>
2286e9fcaa8aSmrg  </row>
2287eb411b4bSmrg  <row>
22880f8248bfSmrg    <entry><symbol>XkbSA_LockNoUnlock</symbol></entry>
2289e9fcaa8aSmrg    <entry>If set, the server only locks the action modifiers. </entry>
2290e9fcaa8aSmrg  </row>
2291eb411b4bSmrg  <row>
22920f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectMods</symbol></entry>
2293e9fcaa8aSmrg    <entry>
22940f8248bfSmrgIf not set, any
22950f8248bfSmrg<symbol>XkbSA_SetMods</symbol>
22960f8248bfSmrgor
22970f8248bfSmrg<symbol>XkbSA_LatchMods</symbol>
22980f8248bfSmrgactions that occur simultaneously with the
22990f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
23000f8248bfSmrgaction are treated as
23010f8248bfSmrg<symbol>XkbSA_LockMods</symbol>
23020f8248bfSmrgactions instead.
2303e9fcaa8aSmrg    </entry>
2304e9fcaa8aSmrg  </row>
2305eb411b4bSmrg  <row>
23060f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectGroup</symbol></entry>
2307e9fcaa8aSmrg    <entry>
23080f8248bfSmrgIf not set, any
23090f8248bfSmrg<symbol>XkbSA_SetGroup</symbol>
23100f8248bfSmrgor
23110f8248bfSmrg<symbol>XkbSA_LatchGroup</symbol>
23120f8248bfSmrgactions that occur simultaneously with the
23130f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
23140f8248bfSmrgaction are treated as
23150f8248bfSmrg<symbol>XkbSA_LockGroup</symbol>
23160f8248bfSmrgactions instead.
2317e9fcaa8aSmrg    </entry>
2318e9fcaa8aSmrg  </row>
2319eb411b4bSmrg  <row>
23200f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectPtr</symbol></entry>
2321e9fcaa8aSmrg    <entry>
23220f8248bfSmrgIf not set, any
23230f8248bfSmrg<symbol>XkbSA_PtrBtn</symbol>
23240f8248bfSmrgactions that occur simultaneously with the
23250f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
23260f8248bfSmrgaction are treated as
23270f8248bfSmrg<symbol>XkbSA_LockPtrBtn</symbol>
23280f8248bfSmrgactions instead.
2329e9fcaa8aSmrg    </entry>
2330e9fcaa8aSmrg  </row>
2331eb411b4bSmrg  <row>
23320f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectCtrls</symbol></entry>
2333e9fcaa8aSmrg    <entry>
23340f8248bfSmrgIf not set, any
23350f8248bfSmrg<symbol>XkbSA_SetControls</symbol>
23360f8248bfSmrgactions that occur simultaneously with the
23370f8248bfSmrg<symbol>XkbSA_ISOLock</symbol>
23380f8248bfSmrgaction are treated as
23390f8248bfSmrg<symbol>XkbSA_LockControls</symbol>
23400f8248bfSmrgactions instead.
2341e9fcaa8aSmrg    </entry>
2342e9fcaa8aSmrg  </row>
2343e9fcaa8aSmrg</tbody>
2344e9fcaa8aSmrg</tgroup>
2345e9fcaa8aSmrg</table>
2346e9fcaa8aSmrg
2347e9fcaa8aSmrg<para>
23480f8248bfSmrgThe
23490f8248bfSmrg<structfield>group_XXX</structfield>
23500f8248bfSmrgfield represents a signed character. Xkb provides macros to convert between a
2351e9fcaa8aSmrgsigned integer value and a signed character as shown in section Note.
2352e9fcaa8aSmrg</para>
2353e9fcaa8aSmrg
2354e9fcaa8aSmrg
2355e9fcaa8aSmrg<para>
23560f8248bfSmrgThe
23570f8248bfSmrg<structfield>mask</structfield>,
23580f8248bfSmrg<structfield>real_mods</structfield>,
23590f8248bfSmrg<structfield>vmods1</structfield>,
23600f8248bfSmrgand
23610f8248bfSmrg<structfield>vmods2</structfield>
23620f8248bfSmrgfields represent the components of an Xkb modifier description
23630f8248bfSmrg(see <link linkend="Modifier_Definitions">section 7.2</link>). While the
23640f8248bfSmrg<structfield>mask</structfield>
23650f8248bfSmrgand
23660f8248bfSmrg<structfield>real_mods</structfield>
23670f8248bfSmrgfields correspond directly to the
23680f8248bfSmrg<structfield>mask</structfield>
23690f8248bfSmrgand
23700f8248bfSmrg<structfield>real_mods</structfield>
23710f8248bfSmrgfields of an Xkb modifier description, the
23720f8248bfSmrg<structfield>vmods1</structfield>
23730f8248bfSmrgand
23740f8248bfSmrg<structfield>vmods2</structfield>
23750f8248bfSmrgfields are combined to correspond to the
23760f8248bfSmrg<structfield>vmods</structfield>
23770f8248bfSmrgfield of an Xkb modifier description. Xkb provides macros to convert between
23780f8248bfSmrgthe two formats as shown in <link linkend="Actions_for_Changing_Modifiers_State">section 16.1.3</link>.
2379e9fcaa8aSmrg</para>
2380e9fcaa8aSmrg
2381e9fcaa8aSmrg
2382e9fcaa8aSmrg<para>
23830f8248bfSmrgThe
23840f8248bfSmrg<structfield>affect</structfield>
23850f8248bfSmrgfield is composed of a bitwise inclusive OR using the masks shown in
23860f8248bfSmrg<link linkend="table16.11">Table 16.11</link>.
2387e9fcaa8aSmrg</para>
2388e9fcaa8aSmrg
23890f8248bfSmrg<table id='table16.12' frame='topbot'>
2390e9fcaa8aSmrg<title>ISO Action Affect Field Values</title>
2391eb411b4bSmrg<?dbfo keep-together="always" ?>
2392eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2393eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2394eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2395e9fcaa8aSmrg<thead>
2396eb411b4bSmrg<row rowsep='1'>
2397e9fcaa8aSmrg  <entry>Affect</entry>
2398e9fcaa8aSmrg  <entry>Meaning</entry>
2399e9fcaa8aSmrg</row>
2400e9fcaa8aSmrg</thead>
2401e9fcaa8aSmrg<tbody>
2402eb411b4bSmrg  <row>
24030f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectMods</symbol></entry>
2404e9fcaa8aSmrg    <entry>
24050f8248bfSmrgIf
24060f8248bfSmrg<symbol>XkbSA_ISONoAffectMods</symbol>
24070f8248bfSmrgis not set, any
24080f8248bfSmrg<emphasis>SA_SetMods</emphasis>
24090f8248bfSmrgor
24100f8248bfSmrg<emphasis>SA_LatchMods</emphasis>
24110f8248bfSmrgactions occurring simultaneously with the
24120f8248bfSmrg<structname>XkbISOAction</structname>
24130f8248bfSmrgare treated as
24140f8248bfSmrg<emphasis>SA_LockMods</emphasis>
24150f8248bfSmrginstead.
2416e9fcaa8aSmrg    </entry>
2417e9fcaa8aSmrg  </row>
2418eb411b4bSmrg  <row>
24190f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectGroup</symbol></entry>
2420e9fcaa8aSmrg    <entry>
24210f8248bfSmrgIf
24220f8248bfSmrg<symbol>XkbSA_ISONoAffectGroup</symbol>
24230f8248bfSmrgis not set, any
24240f8248bfSmrg<emphasis>SA_SetGroup</emphasis>
24250f8248bfSmrgor
24260f8248bfSmrg<emphasis>SA_LatchGroup</emphasis>
24270f8248bfSmrgactions occurring simultaneously with the
24280f8248bfSmrg<structname>XkbISOAction</structname>
24290f8248bfSmrgare treated as
24300f8248bfSmrg<emphasis>SA_LockGroup</emphasis>
24310f8248bfSmrginstead.
2432e9fcaa8aSmrg    </entry>
2433e9fcaa8aSmrg  </row>
2434eb411b4bSmrg  <row>
24350f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectPtr</symbol></entry>
2436e9fcaa8aSmrg    <entry>
24370f8248bfSmrgIf
24380f8248bfSmrg<symbol>XkbSA_ISONoAffectPtr</symbol>
24390f8248bfSmrgis not set, any
24400f8248bfSmrg<emphasis>SA_PtrBtn</emphasis>
24410f8248bfSmrgactions occurring simultaneously with the
24420f8248bfSmrg<structname>XkbISOAction</structname>
24430f8248bfSmrgare treated as
24440f8248bfSmrg<emphasis>SA_LockPtrBtn</emphasis>
24450f8248bfSmrginstead.
2446e9fcaa8aSmrg    </entry>
2447e9fcaa8aSmrg  </row>
2448eb411b4bSmrg  <row>
24490f8248bfSmrg    <entry><symbol>XkbSA_ISONoAffectCtrls</symbol></entry>
2450e9fcaa8aSmrg    <entry>
24510f8248bfSmrgIf
24520f8248bfSmrg<symbol>XkbSA_ISONoAffectCtrls</symbol>
24530f8248bfSmrgis not set, any
24540f8248bfSmrg<emphasis>SA_SetControls</emphasis>
24550f8248bfSmrgactions occurring simultaneously with the
24560f8248bfSmrg<structname>XkbISOAction</structname>
24570f8248bfSmrgare treated as
24580f8248bfSmrg<emphasis>SA_LockControls</emphasis>
24590f8248bfSmrginstead.
2460e9fcaa8aSmrg    </entry>
2461e9fcaa8aSmrg  </row>
2462e9fcaa8aSmrg</tbody>
2463e9fcaa8aSmrg</tgroup>
2464e9fcaa8aSmrg</table>
2465e9fcaa8aSmrg
2466e9fcaa8aSmrg</sect2>
2467eb411b4bSmrg<sect2 id='Actions_for_Changing_the_Active_Screen'>
2468e9fcaa8aSmrg<title>Actions for Changing the Active Screen</title>
24690f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_the_Active_Screen">
24700f8248bfSmrg<primary><structname>XkbSwitchScreenAction</structname></primary></indexterm>
2471e9fcaa8aSmrg
2472e9fcaa8aSmrg<para>
24730f8248bfSmrgActions associated with the
24740f8248bfSmrg<structname>XkbSwitchScreenAction</structname>
24750f8248bfSmrgaction structure change the active screen on a multiscreen display:
2476e9fcaa8aSmrg</para>
2477e9fcaa8aSmrg
2478e9fcaa8aSmrg<note><para>This action is optional. Servers are free to ignore the action or
2479e9fcaa8aSmrgany of its flags if they do not support the requested behavior. If the action
24800f8248bfSmrgis ignored, it behaves like
24810f8248bfSmrg<symbol>XkbSA_NoAction</symbol>.
24820f8248bfSmrgOtherwise, key press and key release events do not generate an event.
2483e9fcaa8aSmrg</para></note>
2484e9fcaa8aSmrg
2485e9fcaa8aSmrg<para><programlisting>
2486e9fcaa8aSmrgtypedef struct _XkbSwitchScreenAction {
24870f8248bfSmrg    unsigned char   type;        /* <symbol>XkbSA_SwitchScreen</symbol> */
24880f8248bfSmrg    unsigned char   flags;       /* controls screen switching */
24890f8248bfSmrg    char            screenXXX;   /* screen number or delta */
24900f8248bfSmrg} <structname>XkbSwitchScreenAction</structname>;
2491e9fcaa8aSmrg</programlisting></para>
2492e9fcaa8aSmrg
2493e9fcaa8aSmrg<para>
24940f8248bfSmrgThe
24950f8248bfSmrg<structfield>type</structfield>
24960f8248bfSmrgfield of the
24970f8248bfSmrg<structname>XkbSwitchScreenAction</structname>
24980f8248bfSmrgstructure should always be
24990f8248bfSmrg<symbol>XkbSA_SwitchScreen</symbol>.
2500e9fcaa8aSmrg</para>
2501e9fcaa8aSmrg
2502e9fcaa8aSmrg
2503e9fcaa8aSmrg<para>
25040f8248bfSmrgThe
25050f8248bfSmrg<structfield>flags</structfield>
25060f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
25070f8248bfSmrg<link linkend="table16.13">Table 16.13</link>.
2508e9fcaa8aSmrg</para>
2509e9fcaa8aSmrg
25100f8248bfSmrg<table id='table16.13' frame='topbot'>
2511e9fcaa8aSmrg<title>Switch Screen Action Flags</title>
2512eb411b4bSmrg<?dbfo keep-together="always" ?>
2513eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2514eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2515eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2516e9fcaa8aSmrg<thead>
2517eb411b4bSmrg<row rowsep='1'>
2518e9fcaa8aSmrg  <entry>Flag</entry>
2519e9fcaa8aSmrg  <entry>Meaning</entry>
2520e9fcaa8aSmrg</row>
2521e9fcaa8aSmrg</thead>
2522e9fcaa8aSmrg<tbody>
2523eb411b4bSmrg  <row>
25240f8248bfSmrg    <entry><symbol>XkbSA_SwitchAbsolute</symbol></entry>
2525e9fcaa8aSmrg    <entry>
25260f8248bfSmrgIf set, the
25270f8248bfSmrg<structfield>screenXXX</structfield>
25280f8248bfSmrgfield represents the index of the new screen. Otherwise, it represents an
2529e9fcaa8aSmrgoffset from the current screen to the new screen.
2530e9fcaa8aSmrg    </entry>
2531e9fcaa8aSmrg  </row>
2532eb411b4bSmrg  <row>
25330f8248bfSmrg    <entry><symbol>XkbSA_SwitchApplication</symbol></entry>
2534e9fcaa8aSmrg    <entry>
2535e9fcaa8aSmrgIf not set, the action should switch to another screen on the same
2536e9fcaa8aSmrgserver. Otherwise, it should switch to another X server or application that
2537e9fcaa8aSmrgshares the same physical display.
2538e9fcaa8aSmrg    </entry>
2539e9fcaa8aSmrg  </row>
2540e9fcaa8aSmrg</tbody>
2541e9fcaa8aSmrg</tgroup>
2542e9fcaa8aSmrg</table>
2543e9fcaa8aSmrg
2544e9fcaa8aSmrg<para>
25450f8248bfSmrgThe
25460f8248bfSmrg<structfield>screenXXX</structfield>
25470f8248bfSmrgfield is a signed character value that represents either the relative or
25480f8248bfSmrgabsolute screen index, depending on the state of the
25490f8248bfSmrg<symbol>XkbSA_SwitchAbsolute</symbol>
25500f8248bfSmrgbit in the
25510f8248bfSmrg<structfield>flags</structfield>
25520f8248bfSmrgfield. Xkb provides the following macros to convert between the integer and
25530f8248bfSmrgsigned character value for screen numbers in
25540f8248bfSmrg<structname>XkbSwitchScreenAction</structname>
25550f8248bfSmrgstructures:
25560f8248bfSmrg</para>
25570f8248bfSmrg
25580f8248bfSmrg<indexterm significance="preferred" zone="XkbSAScreen"><primary><function>XkbSAScreen</function></primary></indexterm>
25590f8248bfSmrg<funcsynopsis id="XkbSAScreen">
25600f8248bfSmrg  <funcprototype>
25610f8248bfSmrg    <funcdef>int <function>XkbSAScreen</function></funcdef>
25620f8248bfSmrg<!-- (
25630f8248bfSmrg<parameter>act</parameter>
25640f8248bfSmrg)                        /* macro */ -->
25650f8248bfSmrg
25660f8248bfSmrg    <paramdef>XkbSwitchScreenAction <parameter>act</parameter></paramdef>
25670f8248bfSmrg  </funcprototype>
25680f8248bfSmrg</funcsynopsis>
25690f8248bfSmrg<variablelist>
25700f8248bfSmrg  <varlistentry>
25710f8248bfSmrg    <term>
25720f8248bfSmrg      <parameter>act</parameter>
25730f8248bfSmrg    </term>
25740f8248bfSmrg    <listitem>
25750f8248bfSmrg      <para>
25760f8248bfSmrg        action from which to extract screen
25770f8248bfSmrg      </para>
25780f8248bfSmrg    </listitem>
25790f8248bfSmrg  </varlistentry>
25800f8248bfSmrg</variablelist>
25810f8248bfSmrg
25820f8248bfSmrg<para>
25830f8248bfSmrg<function>XkbSAScreen</function>
25840f8248bfSmrgreturns the
25850f8248bfSmrg<structfield>screenXXX</structfield>
25860f8248bfSmrgfield of
25870f8248bfSmrg<parameter>act</parameter>
25880f8248bfSmrgconverted to a signed int.
25890f8248bfSmrg</para>
25900f8248bfSmrg
25910f8248bfSmrg
25920f8248bfSmrg<indexterm significance="preferred" zone="XkbSASetScreen"><primary><function>XkbSASetScreen</function></primary></indexterm>
25930f8248bfSmrg<funcsynopsis id="XkbSASetScreen">
25940f8248bfSmrg  <funcprototype>
25950f8248bfSmrg    <funcdef>void <function>XkbSASetScreen</function></funcdef>
25960f8248bfSmrg<!-- (
25970f8248bfSmrg<parameter>act, s</parameter>
25980f8248bfSmrg)                        /* macro */ -->
25990f8248bfSmrg
26000f8248bfSmrg    <paramdef>XkbSwitchScreenAction <parameter>act</parameter></paramdef>
26010f8248bfSmrg    <paramdef>int <parameter>s</parameter></paramdef>
26020f8248bfSmrg  </funcprototype>
26030f8248bfSmrg</funcsynopsis>
26040f8248bfSmrg<variablelist>
26050f8248bfSmrg  <varlistentry>
26060f8248bfSmrg    <term>
26070f8248bfSmrg      <parameter>act</parameter>
26080f8248bfSmrg    </term>
26090f8248bfSmrg    <listitem>
26100f8248bfSmrg      <para>
26110f8248bfSmrg        action in which to set <structfield>screenXXX</structfield>
26120f8248bfSmrg      </para>
26130f8248bfSmrg    </listitem>
26140f8248bfSmrg  </varlistentry>
26150f8248bfSmrg  <varlistentry>
26160f8248bfSmrg    <term>
26170f8248bfSmrg      <parameter>s</parameter>
26180f8248bfSmrg    </term>
26190f8248bfSmrg    <listitem>
26200f8248bfSmrg      <para>
26210f8248bfSmrg        value to set in <structfield>screenXXX</structfield>
26220f8248bfSmrg      </para>
26230f8248bfSmrg    </listitem>
26240f8248bfSmrg  </varlistentry>
26250f8248bfSmrg</variablelist>
2626e9fcaa8aSmrg
2627e9fcaa8aSmrg<para>
26280f8248bfSmrg<function>XkbSASetScreen</function>
26290f8248bfSmrgsets the
26300f8248bfSmrg<structfield>screenXXX</structfield>
26310f8248bfSmrgfield of
26320f8248bfSmrg<parameter>act</parameter>
26330f8248bfSmrgfrom
26340f8248bfSmrg<parameter>s</parameter>.
2635e9fcaa8aSmrg</para>
2636e9fcaa8aSmrg
2637e9fcaa8aSmrg
2638e9fcaa8aSmrg</sect2>
2639eb411b4bSmrg<sect2 id='Actions_for_Changing_Boolean_Controls_State'>
2640e9fcaa8aSmrg<title>Actions for Changing Boolean Controls State</title>
26410f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Changing_Boolean_Controls_State">
26420f8248bfSmrg<primary><structname>XkbCtrlsAction</structname></primary></indexterm>
2643e9fcaa8aSmrg
2644e9fcaa8aSmrg<para>
26450f8248bfSmrgActions associated with the
26460f8248bfSmrg<structname>XkbCtrlsAction</structname>
26470f8248bfSmrgstructure change the state of the boolean controls (see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>):
2648e9fcaa8aSmrg
26490f8248bfSmrg<programlisting>
2650e9fcaa8aSmrgtypedef struct _XkbCtrlsAction {
26510f8248bfSmrg    unsigned char     type;        /* <symbol>XkbSA_SetControls</symbol>,
26520f8248bfSmrg                                      <symbol>XkbSA_LockControls</symbol> */
26530f8248bfSmrg    unsigned char     flags;       /* with <structfield>type</structfield>, controls enabling
26540f8248bfSmrg                                      and disabling of controls */
26550f8248bfSmrg    unsigned char     ctrls3;      /* <structfield>ctrls0</structfield> through <structfield>ctrls3</structfield>
26560f8248bfSmrg                                      represent the boolean controls */
26570f8248bfSmrg    unsigned char     ctrls2;      /* <structfield>ctrls0</structfield> through <structfield>ctrls3</structfield>
26580f8248bfSmrg                                      represent the boolean controls */
26590f8248bfSmrg    unsigned char     ctrls1;      /* <structfield>ctrls0</structfield> through <structfield>ctrls3</structfield>
26600f8248bfSmrg                                      represent the boolean controls */
26610f8248bfSmrg    unsigned char     ctrls0;      /* <structfield>ctrls0</structfield> through <structfield>ctrls3</structfield>
26620f8248bfSmrg                                      represent the boolean controls */
26630f8248bfSmrg} <structname>XkbCtrlsAction</structname>;
2664e9fcaa8aSmrg</programlisting></para>
2665e9fcaa8aSmrg
2666e9fcaa8aSmrg<para>
26670f8248bfSmrgThe
26680f8248bfSmrg<structfield>type</structfield>
26690f8248bfSmrgfield can have any one of the values shown in
26700f8248bfSmrg<link linkend="table16.14">Table 16.14</link>.
2671e9fcaa8aSmrg</para>
2672e9fcaa8aSmrg
26730f8248bfSmrg<table id='table16.14' frame='topbot'>
2674e9fcaa8aSmrg<title>Controls Action Types</title>
2675eb411b4bSmrg<?dbfo keep-together="always" ?>
2676eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2677eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2678eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2679e9fcaa8aSmrg<thead>
2680eb411b4bSmrg<row rowsep='1'>
2681e9fcaa8aSmrg  <entry>Type</entry>
2682e9fcaa8aSmrg  <entry>Effect</entry>
2683e9fcaa8aSmrg</row>
2684e9fcaa8aSmrg</thead>
2685e9fcaa8aSmrg<tbody>
2686eb411b4bSmrg  <row>
26870f8248bfSmrg    <entry><symbol>XkbSA_SetControls</symbol></entry>
2688e9fcaa8aSmrg    <entry>
2689e9fcaa8aSmrg<itemizedlist>
2690e9fcaa8aSmrg  <listitem>
2691e9fcaa8aSmrg    <para>
26920f8248bfSmrgA key press enables any boolean controls specified in the
26930f8248bfSmrg<structfield>ctrls</structfield>
26940f8248bfSmrgfields that were not already enabled at the time of the key press.
2695e9fcaa8aSmrg    </para>
2696e9fcaa8aSmrg  </listitem>
2697e9fcaa8aSmrg  <listitem>
2698e9fcaa8aSmrg    <para>
2699e9fcaa8aSmrgA key release disables any controls enabled by the key press.
2700e9fcaa8aSmrg    </para>
2701e9fcaa8aSmrg  </listitem>
2702e9fcaa8aSmrg  <listitem>
2703e9fcaa8aSmrg    <para>
27040f8248bfSmrgThis action can cause
27050f8248bfSmrg<symbol>XkbControlsNotify</symbol>
27060f8248bfSmrgevents (see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>).
2707e9fcaa8aSmrg    </para>
2708e9fcaa8aSmrg  </listitem>
2709e9fcaa8aSmrg</itemizedlist>
2710e9fcaa8aSmrg    </entry>
2711e9fcaa8aSmrg  </row>
2712eb411b4bSmrg  <row>
27130f8248bfSmrg    <entry><symbol>XkbSA_LockControls</symbol></entry>
2714e9fcaa8aSmrg    <entry>
2715e9fcaa8aSmrg<itemizedlist>
2716e9fcaa8aSmrg  <listitem>
2717e9fcaa8aSmrg    <para>
27180f8248bfSmrgIf the
27190f8248bfSmrg<symbol>XkbSA_LockNoLock</symbol>
27200f8248bfSmrgbit is not set in the
27210f8248bfSmrg<structfield>flags</structfield>
27220f8248bfSmrgfield, a key press enables any controls specified in the
27230f8248bfSmrg<structfield>ctrls</structfield>
27240f8248bfSmrgfields that were not already enabled at the time of the key press.
2725e9fcaa8aSmrg    </para>
2726e9fcaa8aSmrg  </listitem>
2727e9fcaa8aSmrg  <listitem>
2728e9fcaa8aSmrg    <para>
27290f8248bfSmrgIf the
27300f8248bfSmrg<symbol>XkbSA_LockNoUnlock</symbol>
27310f8248bfSmrgbit is not set in the
27320f8248bfSmrg<structfield>flags</structfield>
27330f8248bfSmrgfield, a key release disables any controls specified in the
27340f8248bfSmrg<structfield>ctrls</structfield>
27350f8248bfSmrgfields that were not already disabled at the time of the key press.
2736e9fcaa8aSmrg    </para>
2737e9fcaa8aSmrg  </listitem>
2738e9fcaa8aSmrg  <listitem>
2739e9fcaa8aSmrg    <para>
27400f8248bfSmrgThis action can cause
27410f8248bfSmrg<symbol>XkbControlsNotify</symbol>
27420f8248bfSmrgevents (see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>).
2743e9fcaa8aSmrg    </para>
2744e9fcaa8aSmrg  </listitem>
2745e9fcaa8aSmrg</itemizedlist>
2746e9fcaa8aSmrg    </entry>
2747e9fcaa8aSmrg  </row>
2748e9fcaa8aSmrg</tbody>
2749e9fcaa8aSmrg</tgroup>
2750e9fcaa8aSmrg</table>
2751e9fcaa8aSmrg
2752e9fcaa8aSmrg<para>
27530f8248bfSmrgThe
27540f8248bfSmrg<structfield>flags</structfield>
27550f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
27560f8248bfSmrg<link linkend="table16.15">Table 16.15</link>.
2757e9fcaa8aSmrg</para>
2758e9fcaa8aSmrg
27590f8248bfSmrg<table id='table16.15' frame='topbot'>
2760e9fcaa8aSmrg<title>Control Action Flags</title>
2761eb411b4bSmrg<?dbfo keep-together="always" ?>
2762eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2763eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2764eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2765e9fcaa8aSmrg<thead>
2766eb411b4bSmrg<row rowsep='1'>
2767e9fcaa8aSmrg  <entry>Flag</entry>
2768e9fcaa8aSmrg  <entry>Meaning</entry>
2769e9fcaa8aSmrg</row>
2770e9fcaa8aSmrg</thead>
2771e9fcaa8aSmrg<tbody>
2772eb411b4bSmrg  <row>
27730f8248bfSmrg    <entry><symbol>XkbSA_LockNoLock</symbol></entry>
2774e9fcaa8aSmrg    <entry>
27750f8248bfSmrgIf set, and the action type is
27760f8248bfSmrg<symbol>XkbSA_LockControls</symbol>,
27770f8248bfSmrgthe server only disables controls.
2778e9fcaa8aSmrg    </entry>
2779e9fcaa8aSmrg  </row>
2780eb411b4bSmrg  <row>
27810f8248bfSmrg    <entry><symbol>XkbSA_LockNoUnlock</symbol></entry>
2782e9fcaa8aSmrg    <entry>
27830f8248bfSmrgIf set, and the action type is
27840f8248bfSmrg<symbol>XkbSA_LockControls</symbol>,
27850f8248bfSmrgthe server only enables controls.
2786e9fcaa8aSmrg    </entry>
2787e9fcaa8aSmrg  </row>
2788e9fcaa8aSmrg</tbody>
2789e9fcaa8aSmrg</tgroup>
2790e9fcaa8aSmrg</table>
2791e9fcaa8aSmrg
2792e9fcaa8aSmrg<para>
27930f8248bfSmrgThe
27940f8248bfSmrg<symbol>XkbSA_SetControls</symbol>
27950f8248bfSmrgaction implements a key that enables a boolean control when pressed and
27960f8248bfSmrgdisables it when released. The
27970f8248bfSmrg<symbol>XkbSA_LockControls</symbol>
27980f8248bfSmrgaction is used to implement a key that toggles the state of a boolean control
27990f8248bfSmrgeach time it is pressed and released. The
28000f8248bfSmrg<symbol>XkbSA_LockNoLock</symbol>
28010f8248bfSmrgand
28020f8248bfSmrg<symbol>XkbSA_LockNoUnlock</symbol>
28030f8248bfSmrgflags allow modifying the toggling behavior to only unlock or only lock the
2804e9fcaa8aSmrgboolean control.
2805e9fcaa8aSmrg</para>
2806e9fcaa8aSmrg
2807e9fcaa8aSmrg
2808e9fcaa8aSmrg<para>
28090f8248bfSmrgThe
28100f8248bfSmrg<structfield>ctrls0</structfield>,
28110f8248bfSmrg<structfield>ctrls1</structfield>,
28120f8248bfSmrg<structfield>ctrls2</structfield>,
28130f8248bfSmrgand
28140f8248bfSmrg<structfield>ctrls3</structfield>
28150f8248bfSmrgfields represent the boolean controls in the
28160f8248bfSmrg<structfield>enabled_ctrls</structfield>
28170f8248bfSmrgfield of the controls structure (see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>). Xkb provides the following
2818e9fcaa8aSmrgmacros, to convert between the two formats:
2819e9fcaa8aSmrg</para>
2820e9fcaa8aSmrg
28210f8248bfSmrg<indexterm significance="preferred" zone="XkbActionCtrls"><primary><function>XkbActionCtrls</function></primary></indexterm>
28220f8248bfSmrg<funcsynopsis id="XkbActionCtrls">
28230f8248bfSmrg  <funcprototype>
28240f8248bfSmrg    <funcdef>unsigned int <function>XkbActionCtrls</function></funcdef>
28250f8248bfSmrg<!-- (
28260f8248bfSmrg<parameter>act</parameter>
28270f8248bfSmrg)                        /* macro */ -->
28280f8248bfSmrg
28290f8248bfSmrg    <paramdef>XkbCtrlsAction <parameter>act</parameter></paramdef>
28300f8248bfSmrg  </funcprototype>
28310f8248bfSmrg</funcsynopsis>
28320f8248bfSmrg<variablelist>
28330f8248bfSmrg  <varlistentry>
28340f8248bfSmrg    <term>
28350f8248bfSmrg      <parameter>act</parameter>
28360f8248bfSmrg    </term>
28370f8248bfSmrg    <listitem>
28380f8248bfSmrg      <para>
28390f8248bfSmrg        action from which to extract controls
28400f8248bfSmrg      </para>
28410f8248bfSmrg    </listitem>
28420f8248bfSmrg  </varlistentry>
28430f8248bfSmrg</variablelist>
28440f8248bfSmrg
28450f8248bfSmrg<para>
28460f8248bfSmrg<function>XkbActionCtrls</function>
28470f8248bfSmrgreturns the
28480f8248bfSmrg<structfield>ctrls</structfield>
28490f8248bfSmrgfields of
28500f8248bfSmrg<parameter>act</parameter>
28510f8248bfSmrgconverted to an unsigned int.
28520f8248bfSmrg</para>
28530f8248bfSmrg
28540f8248bfSmrg
2855cbfda780Smrg<indexterm significance="preferred" zone="XkbActionSetCtrls"><primary><function>XkbActionSetCtrls</function></primary></indexterm>
2856cbfda780Smrg<funcsynopsis id="XkbActionSetCtrls">
28570f8248bfSmrg  <funcprototype>
2858cbfda780Smrg    <funcdef>void <function>XkbActionSetCtrls</function></funcdef>
28590f8248bfSmrg<!-- (
28600f8248bfSmrg<parameter>act, ctrls</parameter>
28610f8248bfSmrg)                        /* macro */ -->
28620f8248bfSmrg
28630f8248bfSmrg    <paramdef>XkbCtrlsAction <parameter>act</parameter></paramdef>
28640f8248bfSmrg    <paramdef>unsigned int <parameter>ctrls</parameter></paramdef>
28650f8248bfSmrg  </funcprototype>
28660f8248bfSmrg</funcsynopsis>
28670f8248bfSmrg<variablelist>
28680f8248bfSmrg  <varlistentry>
28690f8248bfSmrg    <term>
28700f8248bfSmrg      <parameter>act</parameter>
28710f8248bfSmrg    </term>
28720f8248bfSmrg    <listitem>
28730f8248bfSmrg      <para>
28740f8248bfSmrg        action in which to set ctrls0-ctrls3
28750f8248bfSmrg      </para>
28760f8248bfSmrg    </listitem>
28770f8248bfSmrg  </varlistentry>
28780f8248bfSmrg  <varlistentry>
28790f8248bfSmrg    <term>
28800f8248bfSmrg      <parameter>ctrls</parameter>
28810f8248bfSmrg    </term>
28820f8248bfSmrg    <listitem>
28830f8248bfSmrg      <para>
28840f8248bfSmrg        value to set in ctrls0-ctrls3
28850f8248bfSmrg      </para>
28860f8248bfSmrg    </listitem>
28870f8248bfSmrg  </varlistentry>
28880f8248bfSmrg</variablelist>
2889e9fcaa8aSmrg
2890e9fcaa8aSmrg<para>
2891cbfda780Smrg<function>XkbActionSetCtrls</function>
28920f8248bfSmrgsets the
28930f8248bfSmrg<structfield>ctrls0</structfield>
28940f8248bfSmrgthrough
28950f8248bfSmrg<structfield>ctrls3</structfield>
28960f8248bfSmrgfields of
28970f8248bfSmrg<parameter>act</parameter>
28980f8248bfSmrgfrom
28990f8248bfSmrg<parameter>ctrls</parameter>.
2900e9fcaa8aSmrg</para>
2901e9fcaa8aSmrg
2902e9fcaa8aSmrg
2903e9fcaa8aSmrg</sect2>
2904eb411b4bSmrg<sect2 id='Actions_for_Generating_Messages'>
2905e9fcaa8aSmrg<title>Actions for Generating Messages</title>
29060f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Generating_Messages">
29070f8248bfSmrg<primary><structname>XkbMessageAction</structname></primary></indexterm>
2908e9fcaa8aSmrg
2909e9fcaa8aSmrg<para>
29100f8248bfSmrgActions associated with the
29110f8248bfSmrg<structname>XkbMessageAction</structname>
29120f8248bfSmrgstructure generate
29130f8248bfSmrg<symbol>XkbActionMessage</symbol>
29140f8248bfSmrgevents:
29150f8248bfSmrg
29160f8248bfSmrg<programlisting>
29170f8248bfSmrg#define             XkbActionMessageLength                  6
2918e9fcaa8aSmrg
2919e9fcaa8aSmrgtypedef struct _XkbMessageAction {
29200f8248bfSmrg    unsigned char   type;             /* <symbol>XkbSA_ActionMessage</symbol> */
29210f8248bfSmrg    unsigned char   flags;            /* controls event generation via
29220f8248bfSmrg                                         key presses and releases */
29230f8248bfSmrg    unsigned char   message[XkbActionMessageLength];    /* message */
29240f8248bfSmrg} <structname>XkbMessageAction</structname>;
2925e9fcaa8aSmrg</programlisting></para>
2926e9fcaa8aSmrg
2927e9fcaa8aSmrg<para>
29280f8248bfSmrgThe
29290f8248bfSmrg<structfield>type</structfield>
29300f8248bfSmrgfield of the
29310f8248bfSmrg<structname>XkbMessageAction</structname>
29320f8248bfSmrgstructure should always be
29330f8248bfSmrg<symbol>XkbSA_ActionMessage</symbol>.
2934e9fcaa8aSmrg</para>
2935e9fcaa8aSmrg
2936e9fcaa8aSmrg
2937e9fcaa8aSmrg<para>
29380f8248bfSmrgThe
29390f8248bfSmrg<structfield>flags</structfield>
29400f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
29410f8248bfSmrg<link linkend="table16.16">Table 16.16</link>.
2942e9fcaa8aSmrg</para>
2943e9fcaa8aSmrg
29440f8248bfSmrg<table id='table16.16' frame='topbot'>
2945e9fcaa8aSmrg<title>Message Action Flags</title>
2946eb411b4bSmrg<?dbfo keep-together="always" ?>
2947eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
2948eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
2949eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
2950e9fcaa8aSmrg<thead>
2951eb411b4bSmrg<row rowsep='1'>
2952e9fcaa8aSmrg  <entry>Flag</entry>
2953e9fcaa8aSmrg  <entry>Meaning</entry>
2954e9fcaa8aSmrg</row>
2955e9fcaa8aSmrg</thead>
2956e9fcaa8aSmrg<tbody>
2957eb411b4bSmrg  <row>
29580f8248bfSmrg    <entry><symbol>XkbSA_MessageOnPress</symbol></entry>
2959e9fcaa8aSmrg    <entry>
29600f8248bfSmrgIf set, key press events generate an
29610f8248bfSmrg<symbol>XkbActionMessage</symbol>
29620f8248bfSmrgevent that reports the keycode, event type, and contents of the
29630f8248bfSmrg<structfield>message</structfield>
29640f8248bfSmrgfield.
2965e9fcaa8aSmrg    </entry>
2966e9fcaa8aSmrg  </row>
2967eb411b4bSmrg  <row>
29680f8248bfSmrg    <entry><symbol>XkbSA_MessageOnRelease</symbol></entry>
2969e9fcaa8aSmrg    <entry>
29700f8248bfSmrgIf set, key release events generate an
29710f8248bfSmrg<symbol>XkbActionMessage</symbol>
29720f8248bfSmrgevent that reports the keycode, event type, and contents of the
29730f8248bfSmrg<structfield>message</structfield>
29740f8248bfSmrgfield.
2975e9fcaa8aSmrg    </entry>
2976e9fcaa8aSmrg  </row>
2977eb411b4bSmrg  <row>
29780f8248bfSmrg    <entry><symbol>XkbSA_MessageGenKeyEvent</symbol></entry>
2979e9fcaa8aSmrg    <entry>
29800f8248bfSmrgIf set, key press and key release events generate
29810f8248bfSmrg<symbol>KeyPress</symbol>
29820f8248bfSmrgand
29830f8248bfSmrg<symbol>KeyRelease</symbol>
29840f8248bfSmrgevents, regardless of whether they generate
29850f8248bfSmrg<symbol>XkbActionMessage</symbol>
29860f8248bfSmrgevents.
2987e9fcaa8aSmrg    </entry>
2988e9fcaa8aSmrg  </row>
2989e9fcaa8aSmrg</tbody>
2990e9fcaa8aSmrg</tgroup>
2991e9fcaa8aSmrg</table>
2992e9fcaa8aSmrg
2993e9fcaa8aSmrg<para>
29940f8248bfSmrgThe
29950f8248bfSmrg<structfield>message</structfield>
29960f8248bfSmrgfield is an array of
29970f8248bfSmrg<symbol>XkbActionMessageLength</symbol>
29980f8248bfSmrgunsigned characters and may be set to anything the keymap designer wishes.
2999e9fcaa8aSmrg</para>
3000e9fcaa8aSmrg
3001eb411b4bSmrg<sect3 id='Detecting_Key_Action_Messages'>
3002e9fcaa8aSmrg<title>Detecting Key Action Messages</title>
30030f8248bfSmrg<indexterm significance="preferred" zone="Detecting_Key_Action_Messages">
30040f8248bfSmrg<primary>events</primary><secondary><symbol>XkbActionMessage</symbol></secondary></indexterm>
30050f8248bfSmrg<indexterm significance="preferred" zone="Detecting_Key_Action_Messages">
30060f8248bfSmrg<primary><structname>XkbActionMessageEvent</structname></primary></indexterm>
3007e9fcaa8aSmrg
3008e9fcaa8aSmrg<para>
30090f8248bfSmrgTo receive
30100f8248bfSmrg<symbol>XkbActionMessage</symbol>
30110f8248bfSmrgevents by calling either
30120f8248bfSmrg<function>XkbSelectEvents</function>
30130f8248bfSmrgor
30140f8248bfSmrg<function>XkbSelectEventDetails</function>
30150f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>).
3016e9fcaa8aSmrg</para>
3017e9fcaa8aSmrg
3018e9fcaa8aSmrg
3019e9fcaa8aSmrg<para>
30200f8248bfSmrgTo receive
30210f8248bfSmrg<symbol>XkbActionMessage</symbol>
30220f8248bfSmrgevents under all possible conditions, use
30230f8248bfSmrg<function>XkbSelectEvents</function>
30240f8248bfSmrgand pass
30250f8248bfSmrg<symbol>XkbActionMessageMask</symbol>
30260f8248bfSmrgin both
30270f8248bfSmrg<parameter>bits_to_change</parameter>
30280f8248bfSmrgand
30290f8248bfSmrg<parameter>values_for_bits</parameter>.
3030e9fcaa8aSmrg</para>
3031e9fcaa8aSmrg
3032e9fcaa8aSmrg
3033e9fcaa8aSmrg<para>
30340f8248bfSmrgThe
30350f8248bfSmrg<symbol>XkbActionMessage</symbol>
30360f8248bfSmrgevent has no event details. However, you can call
30370f8248bfSmrg<function>XkbSelectEventDetails</function>
30380f8248bfSmrgusing
30390f8248bfSmrg<symbol>XkbActionMessage</symbol>
30400f8248bfSmrgas the
30410f8248bfSmrg<structfield>event_type</structfield>
30420f8248bfSmrgand specifying
30430f8248bfSmrg<symbol>XkbAllActionMessagesMask</symbol>
30440f8248bfSmrgin
30450f8248bfSmrg<parameter>bits_to_change</parameter>
30460f8248bfSmrgand
30470f8248bfSmrg<parameter>values_for_bits</parameter>.
30480f8248bfSmrgThis has the same effect as a call to
30490f8248bfSmrg<function>XkbSelectEvents</function>.
3050e9fcaa8aSmrg</para>
3051e9fcaa8aSmrg
3052e9fcaa8aSmrg
3053e9fcaa8aSmrg<para>
30540f8248bfSmrgThe structure for the
30550f8248bfSmrg<symbol>XkbActionMessage</symbol>
30560f8248bfSmrgevent is defined as follows:
3057e9fcaa8aSmrg
30580f8248bfSmrg<programlisting>
3059e9fcaa8aSmrgtypedef struct _XkbActionMessage {
30600f8248bfSmrg    int            type;             /* Xkb extension base event code */
30610f8248bfSmrg    unsigned long  serial;           /* X server serial number for event */
30620f8248bfSmrg    Bool           send_event;       /* <symbol>True</symbol> &rArr; synthetically generated */
30630f8248bfSmrg    Display *      display;          /* server connection where event generated */
30640f8248bfSmrg    Time           time;             /* server time when event generated */
30650f8248bfSmrg    int            xkb_type;         /* <symbol>XkbActionMessage</symbol> */
30660f8248bfSmrg    int            device;           /* Xkb device ID,
30670f8248bfSmrg                                        will not be <symbol>XkbUseCoreKbd</symbol> */
30680f8248bfSmrg    KeyCode        keycode;          /* keycode of key triggering event */
30690f8248bfSmrg    Bool           press;            /* <symbol>True</symbol> &rArr; key press,
30700f8248bfSmrg                                        <symbol>False</symbol> &rArr; release */
30710f8248bfSmrg    Bool           key_event_follows;/* <symbol>True</symbol> &rArr; KeyPress/KeyRelease follows */
30720f8248bfSmrg    char           message[XkbActionMessageLength+1];  /* message text */
30730f8248bfSmrg} <structname>XkbActionMessageEvent</structname>;
3074e9fcaa8aSmrg</programlisting></para>
3075e9fcaa8aSmrg
3076e9fcaa8aSmrg<para>
30770f8248bfSmrgThe
30780f8248bfSmrg<structfield>keycode</structfield>
30790f8248bfSmrgis the keycode of the key that was pressed or released. The
30800f8248bfSmrg<structfield>press</structfield>
30810f8248bfSmrgfield specifies whether the event was the result of a key press or key
3082e9fcaa8aSmrgrelease.
3083e9fcaa8aSmrg</para>
3084e9fcaa8aSmrg
3085e9fcaa8aSmrg
3086e9fcaa8aSmrg<para>
30870f8248bfSmrgThe
30880f8248bfSmrg<structfield>key_event_follows</structfield>
30890f8248bfSmrgspecifies whether a
30900f8248bfSmrg<symbol>KeyPress</symbol>
30910f8248bfSmrg(if
30920f8248bfSmrg<structfield>press</structfield>
30930f8248bfSmrgis
30940f8248bfSmrg<symbol>True</symbol>)
30950f8248bfSmrgor
30960f8248bfSmrg<symbol>KeyRelease</symbol>
30970f8248bfSmrg(if
30980f8248bfSmrg<structfield>press</structfield>
30990f8248bfSmrgis
31000f8248bfSmrg<symbol>False</symbol>)
31010f8248bfSmrgevent is also sent to the client. As with all other Xkb events,
31020f8248bfSmrg<structname>XkbActionMessageEvent</structname>s
31030f8248bfSmrgare delivered to all clients requesting them, regardless of the current
31040f8248bfSmrgkeyboard focus. However, the
31050f8248bfSmrg<symbol>KeyPress</symbol>
31060f8248bfSmrgor
31070f8248bfSmrg<symbol>KeyRelease</symbol>
31080f8248bfSmrgevent that conditionally follows an
31090f8248bfSmrg<structname>XkbActionMessageEvent</structname>
31100f8248bfSmrgis sent only to the client selected by the current keyboard focus.
31110f8248bfSmrg<structfield>key_event_follows</structfield>
31120f8248bfSmrgis
31130f8248bfSmrg<symbol>True</symbol>
31140f8248bfSmrgonly for the client that is actually sent the following
31150f8248bfSmrg<symbol>KeyPress</symbol>
31160f8248bfSmrgor
31170f8248bfSmrg<symbol>KeyRelease</symbol>
31180f8248bfSmrgevent.
31190f8248bfSmrg</para>
31200f8248bfSmrg
31210f8248bfSmrg
31220f8248bfSmrg<para>
31230f8248bfSmrgThe
31240f8248bfSmrg<structfield>message</structfield>
31250f8248bfSmrgfield is set to the message specified in the action and is guaranteed to be
31260f8248bfSmrg<symbol>NULL</symbol>
31270f8248bfSmrg-terminated; the Xkb extension forces a
31280f8248bfSmrg<symbol>NULL</symbol>
31290f8248bfSmrginto
31300f8248bfSmrg<structfield>message</structfield>
31310f8248bfSmrg[
31320f8248bfSmrg<symbol>XkbActionMessageLength</symbol>
3133e9fcaa8aSmrg].
3134e9fcaa8aSmrg</para>
3135e9fcaa8aSmrg
3136e9fcaa8aSmrg
3137e9fcaa8aSmrg</sect3>
3138e9fcaa8aSmrg</sect2>
3139eb411b4bSmrg<sect2 id='Actions_for_Generating_a_Different_Keycode'>
3140e9fcaa8aSmrg<title>Actions for Generating a Different Keycode</title>
31410f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Generating_a_Different_Keycode">
31420f8248bfSmrg<primary><structname>XkbRedirectKeyAction</structname></primary></indexterm>
3143e9fcaa8aSmrg
3144e9fcaa8aSmrg<para>
31450f8248bfSmrgActions associated with the
31460f8248bfSmrg<structname>XkbRedirectKeyAction</structname>
31470f8248bfSmrgstructure generate
31480f8248bfSmrg<symbol>KeyPress</symbol>
31490f8248bfSmrgand
31500f8248bfSmrg<symbol>KeyRelease</symbol>
31510f8248bfSmrgevents containing a keycode different from the key that was pressed or
3152e9fcaa8aSmrgreleased:
3153e9fcaa8aSmrg
31540f8248bfSmrg<programlisting>
3155e9fcaa8aSmrgtypedef struct      _XkbRedirectKeyAction {
31560f8248bfSmrg    unsigned char      type;          /* <symbol>XkbSA_RedirectKey</symbol> */
31570f8248bfSmrg    unsigned char      new_key;       /* keycode to be put in event */
31580f8248bfSmrg    unsigned char      mods_mask;     /* mask of real mods to be reset */
31590f8248bfSmrg    unsigned char      mods;          /* mask of real mods to take values from */
31600f8248bfSmrg    unsigned char      vmods_mask0;   /* first half of mask of virtual mods
31610f8248bfSmrg                                         to be reset */
31620f8248bfSmrg    unsigned char      vmods_mask1;   /* other half of mask of virtual mods
31630f8248bfSmrg                                         to be reset */
31640f8248bfSmrg    unsigned char      vmods0;        /* first half of mask of virtual mods
31650f8248bfSmrg                                         to take values from */
31660f8248bfSmrg    unsigned char      vmods1;        /* other half of mask of virtual mods
31670f8248bfSmrg                                         to take values from */
31680f8248bfSmrg} <structname>XkbRedirectKeyAction</structname>;
3169e9fcaa8aSmrg</programlisting></para>
3170e9fcaa8aSmrg
3171e9fcaa8aSmrg<para>
31720f8248bfSmrgThe
31730f8248bfSmrg<structfield>type</structfield>
31740f8248bfSmrgfield for the
31750f8248bfSmrg<structname>XkbRedirectKeyAction</structname>
31760f8248bfSmrgstructure should always be
31770f8248bfSmrg<symbol>XkbSA_RedirectKey</symbol>.
3178e9fcaa8aSmrg</para>
3179e9fcaa8aSmrg
3180e9fcaa8aSmrg
3181e9fcaa8aSmrg<para>
31820f8248bfSmrgKey presses cause a
31830f8248bfSmrg<symbol>KeyPress</symbol>
31840f8248bfSmrgevent for the key specified by the
31850f8248bfSmrg<structfield>new_key</structfield>
31860f8248bfSmrgfield instead of the actual key. The state reported in this event reports the
3187e9fcaa8aSmrgcurrent effective modifiers changed as follows: any real modifiers selected by
31880f8248bfSmrgthe
31890f8248bfSmrg<structfield>mods_mask</structfield>
31900f8248bfSmrgfield are set to corresponding values from the
31910f8248bfSmrg<structfield>mods</structfield>
31920f8248bfSmrgfield. Any real modifiers bound to the virtual modifiers specified by the
31930f8248bfSmrg<structfield>vmods_mask0</structfield>
31940f8248bfSmrgand
31950f8248bfSmrg<structfield>vmods_mask1</structfield>
31960f8248bfSmrgfields are either set or cleared, depending on the corresponding values in the
31970f8248bfSmrg<structfield>vmods0</structfield>
31980f8248bfSmrgand
31990f8248bfSmrg<structfield>vmods1</structfield>
32000f8248bfSmrgfields. If the real and virtual modifier definitions specify conflicting
3201e9fcaa8aSmrgvalues for a single modifier, the real modifier definition has priority.
3202e9fcaa8aSmrg</para>
3203e9fcaa8aSmrg
3204e9fcaa8aSmrg
3205e9fcaa8aSmrg<para>
32060f8248bfSmrgKey releases cause a
32070f8248bfSmrg<symbol>KeyRelease</symbol>
32080f8248bfSmrgevent for the key specified by the
32090f8248bfSmrg<structfield>new_key</structfield>
32100f8248bfSmrgfield instead of the actual key. The state for this event consists of the
3211e9fcaa8aSmrgeffective keyboard modifiers at the time of the release, changed as described
3212e9fcaa8aSmrgpreviously.
3213e9fcaa8aSmrg</para>
3214e9fcaa8aSmrg
3215e9fcaa8aSmrg
3216e9fcaa8aSmrg<para>
32170f8248bfSmrgThe
32180f8248bfSmrg<symbol>XkbSA_RedirectKey</symbol>
32190f8248bfSmrgaction normally redirects to another key on the same device as the key that
3220e9fcaa8aSmrgcaused the event, unless that device does not belong to the input extension
32210f8248bfSmrg<symbol>KeyClass</symbol>,
32220f8248bfSmrgin which case this action causes an event on the core keyboard device. (The
3223e9fcaa8aSmrginput extension categorizes devices by breaking them into classes. Keyboards,
3224e9fcaa8aSmrgand other input devices with keys, are classified as KeyClass devices by the
3225e9fcaa8aSmrginput extension.)
3226e9fcaa8aSmrg</para>
3227e9fcaa8aSmrg
3228e9fcaa8aSmrg
3229e9fcaa8aSmrg<para>
32300f8248bfSmrgThe
32310f8248bfSmrg<structfield>vmods_mask0</structfield>
32320f8248bfSmrgand
32330f8248bfSmrg<structfield>vmods_mask1</structfield>
32340f8248bfSmrgfields actually represent one
32350f8248bfSmrg<emphasis>vmods_mask</emphasis>
32360f8248bfSmrgvalue, as described in <xref linkend="Virtual_Modifiers" />. Xkb provides the following macros, to
3237e9fcaa8aSmrgconvert between the two formats:
3238e9fcaa8aSmrg</para>
3239e9fcaa8aSmrg
32400f8248bfSmrg<indexterm significance="preferred" zone="XkbSARedirectVModsMask"><primary><function>XkbSARedirectVModsMask</function></primary></indexterm>
32410f8248bfSmrg<funcsynopsis id="XkbSARedirectVModsMask">
32420f8248bfSmrg  <funcprototype>
32430f8248bfSmrg    <funcdef>unsigned int <function>XkbSARedirectVModsMask</function></funcdef>
32440f8248bfSmrg<!-- (
32450f8248bfSmrg<parameter>act</parameter>
32460f8248bfSmrg)                              /* macro */ -->
32470f8248bfSmrg
32480f8248bfSmrg    <paramdef>XkbRedirectKeyAction <parameter>act</parameter></paramdef>
32490f8248bfSmrg  </funcprototype>
32500f8248bfSmrg</funcsynopsis>
32510f8248bfSmrg<variablelist>
32520f8248bfSmrg  <varlistentry>
32530f8248bfSmrg    <term>
32540f8248bfSmrg      <parameter>act</parameter>
32550f8248bfSmrg    </term>
32560f8248bfSmrg    <listitem>
32570f8248bfSmrg      <para>
32580f8248bfSmrg        action from which to extract vmods
32590f8248bfSmrg      </para>
32600f8248bfSmrg    </listitem>
32610f8248bfSmrg  </varlistentry>
32620f8248bfSmrg</variablelist>
32630f8248bfSmrg
32640f8248bfSmrg<para>
32650f8248bfSmrg<function>XkbSARedirectVModsMask</function>
32660f8248bfSmrgreturns the
32670f8248bfSmrg<structfield>vmods_mask0</structfield>
32680f8248bfSmrgand
32690f8248bfSmrg<structfield>vmods_mask1</structfield>
32700f8248bfSmrgfields of
32710f8248bfSmrg<parameter>act</parameter>
32720f8248bfSmrgconverted to an unsigned int.
32730f8248bfSmrg</para>
32740f8248bfSmrg
32750f8248bfSmrg
32760f8248bfSmrg<indexterm significance="preferred" zone="XkbSARedirectSetVModsMask"><primary><function>XkbSARedirectSetVModsMask</function></primary></indexterm>
32770f8248bfSmrg<funcsynopsis id="XkbSARedirectSetVModsMask">
32780f8248bfSmrg  <funcprototype>
32790f8248bfSmrg    <funcdef>void <function>XkbSARedirectSetVModsMask</function></funcdef>
32800f8248bfSmrg<!-- (
32810f8248bfSmrg<parameter>act, vm</parameter>
32820f8248bfSmrg)                              /* macro */ -->
32830f8248bfSmrg
32840f8248bfSmrg    <paramdef>XkbRedirectKeyAction <parameter>act</parameter></paramdef>
32850f8248bfSmrg    <paramdef>unsigned int <parameter>vm</parameter></paramdef>
32860f8248bfSmrg  </funcprototype>
32870f8248bfSmrg</funcsynopsis>
32880f8248bfSmrg<variablelist>
32890f8248bfSmrg  <varlistentry>
32900f8248bfSmrg    <term>
32910f8248bfSmrg      <parameter>act</parameter>
32920f8248bfSmrg    </term>
32930f8248bfSmrg    <listitem>
32940f8248bfSmrg      <para>
32950f8248bfSmrg        action in which to set vmods
32960f8248bfSmrg      </para>
32970f8248bfSmrg    </listitem>
32980f8248bfSmrg  </varlistentry>
32990f8248bfSmrg  <varlistentry>
33000f8248bfSmrg    <term>
33010f8248bfSmrg      <parameter>vm</parameter>
33020f8248bfSmrg    </term>
33030f8248bfSmrg    <listitem>
33040f8248bfSmrg      <para>
33050f8248bfSmrg        new value for virtual modifier mask
33060f8248bfSmrg      </para>
33070f8248bfSmrg    </listitem>
33080f8248bfSmrg  </varlistentry>
33090f8248bfSmrg</variablelist>
3310e9fcaa8aSmrg
3311e9fcaa8aSmrg<para>
33120f8248bfSmrg<function>XkbSARedirectSetVModsMask</function>
33130f8248bfSmrgsets the
33140f8248bfSmrg<structfield>vmods_mask0</structfield>
33150f8248bfSmrgand
33160f8248bfSmrg<structfield>vmods_mask1</structfield>
33170f8248bfSmrgfields of
33180f8248bfSmrg<parameter>act</parameter>
33190f8248bfSmrgfrom
33200f8248bfSmrg<parameter>vm</parameter>.
3321e9fcaa8aSmrg</para>
3322e9fcaa8aSmrg
3323e9fcaa8aSmrg
3324e9fcaa8aSmrg<para>
33250f8248bfSmrgSimilarly, the
33260f8248bfSmrg<structfield>vmods0</structfield>
33270f8248bfSmrgand
33280f8248bfSmrg<structfield>vmods1</structfield>
33290f8248bfSmrgfields actually represent one
33300f8248bfSmrg<structfield>vmods</structfield>
33310f8248bfSmrgvalue, as described in <xref linkend="Virtual_Modifiers" />. To convert between the two formats, Xkb
3332e9fcaa8aSmrgprovides the following convenience macros:
3333e9fcaa8aSmrg</para>
3334e9fcaa8aSmrg
3335e9fcaa8aSmrg
33360f8248bfSmrg<indexterm significance="preferred" zone="XkbSARedirectVMods"><primary><function>XkbSARedirectVMods</function></primary></indexterm>
33370f8248bfSmrg<funcsynopsis id="XkbSARedirectVMods">
33380f8248bfSmrg  <funcprototype>
33390f8248bfSmrg    <funcdef>unsigned int <function>XkbSARedirectVMods</function></funcdef>
33400f8248bfSmrg<!-- (
33410f8248bfSmrg<parameter>act</parameter>
33420f8248bfSmrg)                              /* macro */ -->
33430f8248bfSmrg
33440f8248bfSmrg    <paramdef>XkbRedirectKeyAction <parameter>act</parameter></paramdef>
33450f8248bfSmrg  </funcprototype>
33460f8248bfSmrg</funcsynopsis>
33470f8248bfSmrg<variablelist>
33480f8248bfSmrg  <varlistentry>
33490f8248bfSmrg    <term>
33500f8248bfSmrg      <parameter>act</parameter>
33510f8248bfSmrg    </term>
33520f8248bfSmrg    <listitem>
33530f8248bfSmrg      <para>
33540f8248bfSmrg        action from which to extract vmods
33550f8248bfSmrg      </para>
33560f8248bfSmrg    </listitem>
33570f8248bfSmrg  </varlistentry>
33580f8248bfSmrg</variablelist>
3359e9fcaa8aSmrg
33600f8248bfSmrg<para>
33610f8248bfSmrg     <function>XkbSARedirectVModsMask</function> returns the <structfield>vmods0</structfield>
33620f8248bfSmrg     and <structfield>vmods1</structfield> fields of <parameter>act</parameter>
3363e9fcaa8aSmrg     converted to an unsigned int.
33640f8248bfSmrg</para>
3365e9fcaa8aSmrg
33660f8248bfSmrg<indexterm significance="preferred" zone="XkbSARedirectSetVMods"><primary><function>XkbSARedirectSetVMods</function></primary></indexterm>
33670f8248bfSmrg<funcsynopsis id="XkbSARedirectSetVMods">
33680f8248bfSmrg  <funcprototype>
33690f8248bfSmrg    <funcdef>void <function>XkbSARedirectSetVMods</function></funcdef>
33700f8248bfSmrg<!-- (
33710f8248bfSmrg<parameter>act, vm</parameter>
33720f8248bfSmrg)                              /* macro */ -->
33730f8248bfSmrg
33740f8248bfSmrg    <paramdef>XkbRedirectKeyAction <parameter>act</parameter></paramdef>
33750f8248bfSmrg    <paramdef>unsigned int <parameter>v</parameter></paramdef>
33760f8248bfSmrg  </funcprototype>
33770f8248bfSmrg</funcsynopsis>
33780f8248bfSmrg<variablelist>
33790f8248bfSmrg  <varlistentry>
33800f8248bfSmrg    <term>
33810f8248bfSmrg      <parameter>act</parameter>
33820f8248bfSmrg    </term>
33830f8248bfSmrg    <listitem>
33840f8248bfSmrg      <para>
33850f8248bfSmrg        action in which to set vmods
33860f8248bfSmrg      </para>
33870f8248bfSmrg    </listitem>
33880f8248bfSmrg  </varlistentry>
33890f8248bfSmrg  <varlistentry>
33900f8248bfSmrg    <term>
33910f8248bfSmrg      <parameter>v</parameter>
33920f8248bfSmrg    </term>
33930f8248bfSmrg    <listitem>
33940f8248bfSmrg      <para>
33950f8248bfSmrg        new value for virtual modifiers
33960f8248bfSmrg      </para>
33970f8248bfSmrg    </listitem>
33980f8248bfSmrg  </varlistentry>
33990f8248bfSmrg</variablelist>
34000f8248bfSmrg<para>
34010f8248bfSmrg     <function>XkbSARedirectSetVModsMask</function> sets the <structfield>vmods0</structfield>
34020f8248bfSmrg     and <structfield>vmods1</structfield> of <parameter>act</parameter> from <parameter>v</parameter>.
34030f8248bfSmrg</para>
3404e9fcaa8aSmrg
3405e9fcaa8aSmrg</sect2>
3406eb411b4bSmrg<sect2 id='Actions_for_Generating_DeviceButtonPress_and_DeviceButtonRelease'>
3407e9fcaa8aSmrg<title>Actions for Generating DeviceButtonPress and DeviceButtonRelease</title>
34080f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Generating_DeviceButtonPress_and_DeviceButtonRelease">
34090f8248bfSmrg<primary><structname>XkbDeviceBtnAction</structname></primary></indexterm>
34100f8248bfSmrg
34110f8248bfSmrg<para>
34120f8248bfSmrgActions associated with
34130f8248bfSmrg<structname>XkbDeviceBtnAction</structname>
34140f8248bfSmrgstructures generate
34150f8248bfSmrg<symbol>DeviceButtonPress</symbol>
34160f8248bfSmrgand
34170f8248bfSmrg<symbol>DeviceButtonRelease</symbol>
34180f8248bfSmrgevents instead of normal
34190f8248bfSmrg<symbol>KeyPress</symbol>
34200f8248bfSmrgand
34210f8248bfSmrg<symbol>KeyRelease</symbol>
34220f8248bfSmrgevents:
34230f8248bfSmrg
34240f8248bfSmrg<programlisting>
3425e9fcaa8aSmrgtypedef struct _XkbDeviceBtnAction {
34260f8248bfSmrg    unsigned char    type;      /* <symbol>XkbSA_DeviceBtn</symbol>, <symbol>XkbSA_LockDeviceBtn</symbol> */
34270f8248bfSmrg    unsigned char    flags;     /* with <structfield>type</structfield>, specifies locking or unlocking */
34280f8248bfSmrg    unsigned char    count;     /* controls number of DeviceButtonPress
34290f8248bfSmrg                                   and Release events */
34300f8248bfSmrg    unsigned char    button;    /* index of button on <structfield>device</structfield> */
34310f8248bfSmrg    unsigned char    device;    /* device ID of an X input extension device */
34320f8248bfSmrg} <structname>XkbDeviceBtnAction</structname>;
3433e9fcaa8aSmrg</programlisting></para>
3434e9fcaa8aSmrg
3435e9fcaa8aSmrg<para>
34360f8248bfSmrgThe
34370f8248bfSmrg<structfield>type</structfield>
34380f8248bfSmrgfield can have any one of the values shown in
34390f8248bfSmrg<link linkend="table16.17">Table 16.17</link>.
3440e9fcaa8aSmrg</para>
3441e9fcaa8aSmrg
34420f8248bfSmrg<table id='table16.17' frame='topbot'>
3443e9fcaa8aSmrg<title>Device Button Action Types</title>
3444eb411b4bSmrg<?dbfo keep-together="always" ?>
3445eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
3446eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
3447eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
3448e9fcaa8aSmrg<thead>
3449eb411b4bSmrg<row rowsep='1'>
3450e9fcaa8aSmrg  <entry>Type</entry>
3451e9fcaa8aSmrg  <entry>Effect</entry>
3452e9fcaa8aSmrg</row>
3453e9fcaa8aSmrg</thead>
3454e9fcaa8aSmrg<tbody>
3455eb411b4bSmrg  <row>
34560f8248bfSmrg    <entry><symbol>XkbSA_DeviceBtn</symbol></entry>
3457e9fcaa8aSmrg    <entry>
3458e9fcaa8aSmrg<itemizedlist>
3459e9fcaa8aSmrg  <listitem>
3460e9fcaa8aSmrg    <para>
3461e9fcaa8aSmrgIf the button specified by this action is logically down, the key press and
3462e9fcaa8aSmrgcorresponding release are ignored and have no effect. If the device or button
34630f8248bfSmrgspecified by this action are illegal, this action behaves like
34640f8248bfSmrg<symbol>XkbSA_NoAction</symbol>.
3465e9fcaa8aSmrg    </para>
3466e9fcaa8aSmrg  </listitem>
3467e9fcaa8aSmrg  <listitem>
3468e9fcaa8aSmrg    <para>
3469e9fcaa8aSmrgOtherwise, key presses cause one or more input extension device events instead
34700f8248bfSmrgof the usual key press event. If the
34710f8248bfSmrg<structfield>count</structfield>
34720f8248bfSmrgfield is zero, a key press generates a single
34730f8248bfSmrg<symbol>DeviceButtonPress</symbol>
34740f8248bfSmrgevent. If count is greater than zero, a key press event generates
34750f8248bfSmrg<structfield>count</structfield>
34760f8248bfSmrgpairs of
34770f8248bfSmrg<symbol>DeviceButtonPress</symbol>
34780f8248bfSmrgand
34790f8248bfSmrg<symbol>DeviceButtonRelease</symbol>
34800f8248bfSmrgevents.
3481e9fcaa8aSmrg    </para>
3482e9fcaa8aSmrg  </listitem>
3483e9fcaa8aSmrg  <listitem>
3484e9fcaa8aSmrg    <para>
34850f8248bfSmrgIf
34860f8248bfSmrg<structfield>count</structfield>
34870f8248bfSmrgis zero, a key release generates an input extension
34880f8248bfSmrg<symbol>DeviceButtonRelease</symbol>
34890f8248bfSmrgevent that matches the event generated by the corresponding key press. If
34900f8248bfSmrg<structfield>count</structfield>
34910f8248bfSmrgis nonzero, a key release does not cause a
34920f8248bfSmrg<symbol>DeviceButtonRelease</symbol>
34930f8248bfSmrgevent. Key releases never cause
34940f8248bfSmrg<symbol>KeyRelease</symbol>
34950f8248bfSmrgevents.
3496e9fcaa8aSmrg    </para>
3497e9fcaa8aSmrg  </listitem>
3498e9fcaa8aSmrg</itemizedlist>
3499e9fcaa8aSmrg    </entry>
3500e9fcaa8aSmrg  </row>
3501eb411b4bSmrg  <row>
35020f8248bfSmrg    <entry><symbol>XkbSA_LockDeviceBtn</symbol></entry>
3503e9fcaa8aSmrg    <entry>
3504e9fcaa8aSmrg<itemizedlist>
3505e9fcaa8aSmrg  <listitem>
3506e9fcaa8aSmrg    <para>
3507e9fcaa8aSmrgIf the device or button specified by this action are illegal, this action
35080f8248bfSmrgbehaves like <symbol>XkbSA_NoAction</symbol>.
3509e9fcaa8aSmrg    </para>
3510e9fcaa8aSmrg  </listitem>
3511e9fcaa8aSmrg  <listitem>
3512e9fcaa8aSmrg    <para>
35130f8248bfSmrgOtherwise, if the specified button is not locked and the
35140f8248bfSmrg<symbol>XkbSA_LockNoLock</symbol>
35150f8248bfSmrgbit is not set in the
35160f8248bfSmrg<structfield>flags</structfield>
35170f8248bfSmrgfield, a key press generates an input extension
35180f8248bfSmrg<symbol>DeviceButtonPress</symbol>
35190f8248bfSmrgevent instead of a
35200f8248bfSmrg<symbol>KeyPress</symbol>
35210f8248bfSmrgevent and locks the button. If the button is already locked or if
35220f8248bfSmrg<symbol>XkbSA_LockNoLock</symbol>
35230f8248bfSmrgbit is set in the
35240f8248bfSmrg<structfield>flags</structfield>
35250f8248bfSmrgfield, the key press is ignored and has no effect.
3526e9fcaa8aSmrg    </para>
3527e9fcaa8aSmrg  </listitem>
3528e9fcaa8aSmrg  <listitem>
3529e9fcaa8aSmrg    <para>
35300f8248bfSmrgIf the corresponding key press was ignored, and if the
35310f8248bfSmrg<symbol>XkbSA_LockNoUnlock</symbol>
35320f8248bfSmrgbit is not set in the
35330f8248bfSmrg<structfield>flags</structfield>
35340f8248bfSmrgfield, a key release generates an input extension
35350f8248bfSmrg<symbol>DeviceButtonRelease</symbol>
35360f8248bfSmrgevent instead of a
35370f8248bfSmrg<symbol>KeyRelease</symbol>
35380f8248bfSmrgevent and unlocks the button. If the corresponding key press locked a button,
3539e9fcaa8aSmrgthe key release is ignored and has no effect.
3540e9fcaa8aSmrg    </para>
3541e9fcaa8aSmrg  </listitem>
3542e9fcaa8aSmrg</itemizedlist>
3543e9fcaa8aSmrg    </entry>
3544e9fcaa8aSmrg  </row>
3545e9fcaa8aSmrg</tbody>
3546e9fcaa8aSmrg</tgroup>
3547e9fcaa8aSmrg</table>
3548e9fcaa8aSmrg
3549e9fcaa8aSmrg<para>
35500f8248bfSmrgThe
35510f8248bfSmrg<structfield>flags</structfield>
35520f8248bfSmrgfield is composed of the bitwise inclusive OR of the masks shown in
35530f8248bfSmrg<link linkend="table16.18">Table 16.18</link>.
3554e9fcaa8aSmrg</para>
3555e9fcaa8aSmrg
35560f8248bfSmrg<table id='table16.18' frame='topbot'>
3557e9fcaa8aSmrg<title>Device Button Action Flags</title>
3558eb411b4bSmrg<?dbfo keep-together="always" ?>
3559eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
3560eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
3561eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
3562e9fcaa8aSmrg<thead>
3563eb411b4bSmrg<row rowsep='1'>
3564e9fcaa8aSmrg  <entry>Flag</entry>
3565e9fcaa8aSmrg  <entry>Meaning</entry>
3566e9fcaa8aSmrg</row>
3567e9fcaa8aSmrg</thead>
3568e9fcaa8aSmrg<tbody>
3569eb411b4bSmrg  <row>
35700f8248bfSmrg    <entry><symbol>XkbSA_LockNoLock</symbol></entry>
3571e9fcaa8aSmrg    <entry>
35720f8248bfSmrgIf set, and the action type is
35730f8248bfSmrg<symbol>XkbSA_LockDeviceBtn</symbol>,
35740f8248bfSmrgthe server only unlocks the button.
3575e9fcaa8aSmrg    </entry>
3576e9fcaa8aSmrg  </row>
3577eb411b4bSmrg  <row>
35780f8248bfSmrg    <entry><symbol>XkbSA_LockNoUnlock</symbol></entry>
3579e9fcaa8aSmrg    <entry>
35800f8248bfSmrgIf set, and the action type is
35810f8248bfSmrg<symbol>XkbSA_LockDeviceBtn</symbol>,
35820f8248bfSmrgthe server only locks the button.
3583e9fcaa8aSmrg    </entry>
3584e9fcaa8aSmrg  </row>
3585e9fcaa8aSmrg</tbody>
3586e9fcaa8aSmrg</tgroup>
3587e9fcaa8aSmrg</table>
3588e9fcaa8aSmrg
3589e9fcaa8aSmrg</sect2>
3590eb411b4bSmrg<sect2 id='Actions_for_Simulating_Events_from_Device_Valuators'>
3591e9fcaa8aSmrg<title>Actions for Simulating Events from Device Valuators</title>
35920f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Simulating_Events_from_Device_Valuators">
35930f8248bfSmrg<primary><structname>XkbDeviceValuatorAction</structname></primary></indexterm>
35940f8248bfSmrg
35950f8248bfSmrg<para>
35960f8248bfSmrgA
35970f8248bfSmrg<firstterm>valuator</firstterm>
35980f8248bfSmrg<indexterm significance="preferred" zone="Actions_for_Simulating_Events_from_Device_Valuators">
35990f8248bfSmrg<primary>valuator</primary></indexterm>
36000f8248bfSmrgmanipulates a range of values for some entity, like a mouse axis, a slider or
36010f8248bfSmrga dial. Actions associated with
36020f8248bfSmrg<structname>XkbDeviceValuatorAction</structname>
36030f8248bfSmrgstructures are used to simulate events from one or two input extension device
3604e9fcaa8aSmrgvaluators.
3605e9fcaa8aSmrg</para>
3606e9fcaa8aSmrg
3607e9fcaa8aSmrg<para><programlisting>
3608e9fcaa8aSmrgtypedef struct _XkbDeviceValuatorAction {
36090f8248bfSmrg    unsigned char    type;        /* <symbol>XkbSA_DeviceValuator</symbol> */
36100f8248bfSmrg    unsigned char    device;      /* device ID */
36110f8248bfSmrg    unsigned char    v1_what;     /* determines how valuator is
36120f8248bfSmrg                                     to behave for valuator 1 */
36130f8248bfSmrg    unsigned char    v1_ndx;      /* specifies a real valuator */
36140f8248bfSmrg    unsigned char    v1_value;    /* the value for valuator 1 */
36150f8248bfSmrg    unsigned char    v2_what;     /* determines how valuator is
36160f8248bfSmrg                                     to behave for valuator 2 */
36170f8248bfSmrg    unsigned char    v2_ndx;      /* specifies a real valuator */
36180f8248bfSmrg    unsigned char    v2_value;    /* the value for valuator 1 */
36190f8248bfSmrg} <structname>XkbDeviceValuatorAction</structname>;
3620e9fcaa8aSmrg</programlisting></para>
3621e9fcaa8aSmrg
3622e9fcaa8aSmrg<para>
36230f8248bfSmrgIf
36240f8248bfSmrg<structfield>device</structfield>
36250f8248bfSmrgis illegal or if neither
36260f8248bfSmrg<structfield>v1_ndx</structfield>
36270f8248bfSmrgnor
36280f8248bfSmrg<structfield>v2_ndx</structfield>
36290f8248bfSmrgspecifies a legal valuator, this action behaves like
36300f8248bfSmrg<symbol>XkbSA_NoAction</symbol>.
36310f8248bfSmrg</para>
36320f8248bfSmrg
36330f8248bfSmrg
36340f8248bfSmrg<para>
36350f8248bfSmrgThe low four bits of
36360f8248bfSmrg<structfield>v1_what</structfield>
36370f8248bfSmrgand
36380f8248bfSmrg<structfield>v2_what</structfield>
36390f8248bfSmrgspecify the corresponding scale value (denoted
36400f8248bfSmrg<structfield>val&lt;n&gt;Scale</structfield>
36410f8248bfSmrgin <link linkend="table16.17">Table 16.17</link>), if needed.
36420f8248bfSmrgThe high four bits of
36430f8248bfSmrg<structfield>v1_what</structfield>
36440f8248bfSmrgand
36450f8248bfSmrg<structfield>v2_what</structfield>
36460f8248bfSmrgspecify the operation to perform to set the values. The high four bits of
36470f8248bfSmrg<structfield>v1_what</structfield>
36480f8248bfSmrgand
36490f8248bfSmrg<structfield>v2_what</structfield>
36500f8248bfSmrgcan have the values shown in <link linkend="table16.17">Table 16.17</link>;
36510f8248bfSmrgthe use of
36520f8248bfSmrg<structfield>val&lt;n&gt;Scale</structfield>
36530f8248bfSmrgis shown in that table also.
36540f8248bfSmrg</para>
36550f8248bfSmrg
36560f8248bfSmrg<table id='table16.19' frame='topbot'>
3657e9fcaa8aSmrg<title>Device Valuator v&lt;n&gt;_what High Bits Values</title>
3658eb411b4bSmrg<?dbfo keep-together="always" ?>
3659eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
3660eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
3661eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
3662e9fcaa8aSmrg<thead>
3663eb411b4bSmrg<row rowsep='1'>
3664e9fcaa8aSmrg  <entry>Value of high bits</entry>
3665e9fcaa8aSmrg  <entry>Effect</entry>
3666e9fcaa8aSmrg</row>
3667e9fcaa8aSmrg</thead>
3668e9fcaa8aSmrg<tbody>
3669eb411b4bSmrg  <row>
36700f8248bfSmrg    <entry><symbol>XkbSA_IgnoreVal</symbol></entry>
3671e9fcaa8aSmrg    <entry>No action</entry>
3672e9fcaa8aSmrg  </row>
3673eb411b4bSmrg  <row>
36740f8248bfSmrg    <entry><symbol>XkbSA_SetValMin</symbol></entry>
3675e9fcaa8aSmrg    <entry>
36760f8248bfSmrg<structfield>v&lt;n&gt;_value</structfield> is set to its minimum legal value.
3677e9fcaa8aSmrg    </entry>
3678e9fcaa8aSmrg  </row>
3679eb411b4bSmrg  <row>
36800f8248bfSmrg    <entry><symbol>XkbSA_SetValCenter</symbol></entry>
3681e9fcaa8aSmrg    <entry>
36820f8248bfSmrg<structfield>v&lt;n&gt;_value</structfield>is centered (to (max-min)/2).
3683e9fcaa8aSmrg    </entry>
3684e9fcaa8aSmrg  </row>
3685eb411b4bSmrg  <row>
36860f8248bfSmrg    <entry><symbol>XkbSA_SetValMax</symbol></entry>
3687e9fcaa8aSmrg    <entry>
36880f8248bfSmrg<structfield>v&lt;n&gt;_value</structfield> is set to its maximum legal value.
3689e9fcaa8aSmrg    </entry>
3690e9fcaa8aSmrg  </row>
3691eb411b4bSmrg  <row>
36920f8248bfSmrg    <entry><symbol>XkbSA_SetValRelative</symbol></entry>
3693e9fcaa8aSmrg    <entry>
36940f8248bfSmrg<structfield>v&lt;n&gt;_value</structfield> * (2
36950f8248bfSmrg<structfield>val&lt;n&gt;Scale</structfield>) is added to
36960f8248bfSmrg<structfield>v&lt;n&gt;_value</structfield>.
3697e9fcaa8aSmrg    </entry>
3698e9fcaa8aSmrg  </row>
3699eb411b4bSmrg  <row>
37000f8248bfSmrg    <entry><symbol>XkbSA_SetValAbsolute</symbol></entry>
3701e9fcaa8aSmrg    <entry>
37020f8248bfSmrg<structfield>v&lt;n&gt;_value</structfield>
37030f8248bfSmrgis set to (2 <structfield>val&lt;n&gt;Scale</structfield>).
3704e9fcaa8aSmrg    </entry>
3705e9fcaa8aSmrg  </row>
3706e9fcaa8aSmrg</tbody>
3707e9fcaa8aSmrg</tgroup>
3708e9fcaa8aSmrg</table>
3709e9fcaa8aSmrg
3710e9fcaa8aSmrg<para>
37110f8248bfSmrgIllegal values for
37120f8248bfSmrg<symbol>XkbSA_SetValRelative</symbol>
37130f8248bfSmrgor
37140f8248bfSmrg<symbol>XkbSA_SetValAbsolute</symbol>
37150f8248bfSmrgare clamped into range. Note that all of these possibilities are legal for
37160f8248bfSmrgabsolute valuators. For relative valuators, only
37170f8248bfSmrg<symbol>XkbSA_SetValRelative</symbol>
37180f8248bfSmrgis permitted. Part of the input extension description of a device is the range
3719e9fcaa8aSmrgof legal values for all absolute valuators, whence the maximum and minimum
37200f8248bfSmrglegal values shown in <link linkend="table16.17">Table 16.17</link>.
3721e9fcaa8aSmrg</para>
3722e9fcaa8aSmrg
3723e9fcaa8aSmrg
3724e9fcaa8aSmrg<para>
3725e9fcaa8aSmrgThe following two masks are provided as a convenience to select either portion
37260f8248bfSmrgof
37270f8248bfSmrg<structfield>v1_what</structfield>
37280f8248bfSmrgor
37290f8248bfSmrg<structfield>v2_what</structfield>:
3730e9fcaa8aSmrg
37310f8248bfSmrg<programlisting>
37320f8248bfSmrg#define XkbSA_ValOpMask         (0x70)
37330f8248bfSmrg#define XkbSA_ValScaleMask      (0x07)
37340f8248bfSmrg</programlisting>
37350f8248bfSmrg</para>
3736e9fcaa8aSmrg
3737e9fcaa8aSmrg<para>
37380f8248bfSmrg<structfield>v1_ndx</structfield>
37390f8248bfSmrgand
37400f8248bfSmrg<structfield>v2_ndx</structfield>
37410f8248bfSmrgspecify valuators that actually exists. For example, most mice have two
3742e9fcaa8aSmrgvaluators (x and y axes) so the only legal values for a mouse would be 0 and 1.
3743e9fcaa8aSmrgFor a dial box with eight dials, any value in the range 0..7 would be correct.
3744e9fcaa8aSmrg</para>
3745e9fcaa8aSmrg
3746e9fcaa8aSmrg
3747e9fcaa8aSmrg</sect2>
3748eb411b4bSmrg<sect2 id='Obtaining_Key_Actions_for_Keys_from_the_Server'>
3749e9fcaa8aSmrg<title>Obtaining Key Actions for Keys from the Server</title>
3750e9fcaa8aSmrg
3751e9fcaa8aSmrg<para>
37520f8248bfSmrgTo update the actions (the
37530f8248bfSmrg<structfield>key_acts</structfield>
37540f8248bfSmrgarray) for a subset of the keys in a keyboard description, use
37550f8248bfSmrg<function>XkbGetKeyActions</function>.
37560f8248bfSmrg</para>
37570f8248bfSmrg
37580f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyActions"><primary><function>XkbGetKeyActions</function></primary></indexterm>
37590f8248bfSmrg<funcsynopsis id="XkbGetKeyActions">
37600f8248bfSmrg  <funcprototype>
37610f8248bfSmrg    <funcdef>Status <function>XkbGetKeyActions</function></funcdef>
37620f8248bfSmrg<!-- (
37630f8248bfSmrg<parameter>dpy</parameter>,
37640f8248bfSmrg<parameter>first</parameter>,
37650f8248bfSmrg<parameter>num</parameter>,
37660f8248bfSmrg<parameter>xkb</parameter>
37670f8248bfSmrg) -->
37680f8248bfSmrg
37690f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
37700f8248bfSmrg    <paramdef>unsigned int <parameter>first</parameter></paramdef>
37710f8248bfSmrg    <paramdef>unsigned int <parameter>num</parameter></paramdef>
37720f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
37730f8248bfSmrg  </funcprototype>
37740f8248bfSmrg</funcsynopsis>
37750f8248bfSmrg<variablelist>
37760f8248bfSmrg  <varlistentry>
37770f8248bfSmrg    <term>
37780f8248bfSmrg      <parameter>dpy</parameter>
37790f8248bfSmrg    </term>
37800f8248bfSmrg    <listitem>
37810f8248bfSmrg      <para>
37820f8248bfSmrg        connection to X server
37830f8248bfSmrg      </para>
37840f8248bfSmrg    </listitem>
37850f8248bfSmrg  </varlistentry>
37860f8248bfSmrg  <varlistentry>
37870f8248bfSmrg    <term>
37880f8248bfSmrg      <parameter>first</parameter>
37890f8248bfSmrg    </term>
37900f8248bfSmrg    <listitem>
37910f8248bfSmrg      <para>
37920f8248bfSmrg        keycode of first key of interest
37930f8248bfSmrg      </para>
37940f8248bfSmrg    </listitem>
37950f8248bfSmrg  </varlistentry>
37960f8248bfSmrg  <varlistentry>
37970f8248bfSmrg    <term>
37980f8248bfSmrg      <parameter>num</parameter>
37990f8248bfSmrg    </term>
38000f8248bfSmrg    <listitem>
38010f8248bfSmrg      <para>
38020f8248bfSmrg        number of keys desired
38030f8248bfSmrg      </para>
38040f8248bfSmrg    </listitem>
38050f8248bfSmrg  </varlistentry>
38060f8248bfSmrg  <varlistentry>
38070f8248bfSmrg    <term>
38080f8248bfSmrg      <parameter>xkb</parameter>
38090f8248bfSmrg    </term>
38100f8248bfSmrg    <listitem>
38110f8248bfSmrg      <para>
38120f8248bfSmrg        pointer to keyboard description where result is stored
38130f8248bfSmrg      </para>
38140f8248bfSmrg    </listitem>
38150f8248bfSmrg  </varlistentry>
38160f8248bfSmrg</variablelist>
3817e9fcaa8aSmrg
3818e9fcaa8aSmrg<para>
38190f8248bfSmrg<function>XkbGetKeyActions</function>
38200f8248bfSmrgsends a request to the server to obtain the actions for
38210f8248bfSmrg<parameter>num</parameter>
38220f8248bfSmrgkeys on the keyboard starting with key
38230f8248bfSmrg<parameter>first</parameter>.
38240f8248bfSmrgIt waits for a reply and returns the actions in the
38250f8248bfSmrg<structfield>server</structfield>-&gt;<structfield>key_acts</structfield>
38260f8248bfSmrgfield of
38270f8248bfSmrg<parameter>xkb</parameter>.
38280f8248bfSmrgIf successful,
38290f8248bfSmrg<function>XkbGetKeyActions</function>
38300f8248bfSmrgreturns
38310f8248bfSmrg<symbol>Success</symbol>.
38320f8248bfSmrgThe
38330f8248bfSmrg<parameter>xkb</parameter>
38340f8248bfSmrgparameter must be a pointer to a valid Xkb keyboard description.
3835e9fcaa8aSmrg</para>
3836e9fcaa8aSmrg
3837e9fcaa8aSmrg
3838e9fcaa8aSmrg<para>
38390f8248bfSmrgIf the
38400f8248bfSmrg<structfield>server</structfield>
38410f8248bfSmrgmap in the
38420f8248bfSmrg<parameter>xkb</parameter>
38430f8248bfSmrgparameter has not been allocated,
38440f8248bfSmrg<function>XkbGetKeyActions</function>
38450f8248bfSmrgallocates and initializes it before obtaining the actions.
3846e9fcaa8aSmrg</para>
3847e9fcaa8aSmrg
3848e9fcaa8aSmrg
3849e9fcaa8aSmrg<para>
3850e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
38510f8248bfSmrghas not been properly initialized,
38520f8248bfSmrg<function>XkbGetKeyActions</function>
38530f8248bfSmrgreturns
38540f8248bfSmrg<errorname>BadAccess</errorname>.
38550f8248bfSmrgIf
38560f8248bfSmrg<parameter>num</parameter>
38570f8248bfSmrgis less than 1 or greater than
38580f8248bfSmrg<symbol>XkbMaxKeyCount</symbol>,
38590f8248bfSmrg<function>XkbGetKeyActions</function>
38600f8248bfSmrgreturns
38610f8248bfSmrg<errorname>BadValue</errorname>.
38620f8248bfSmrgIf any allocation errors occur,
38630f8248bfSmrg<function>XkbGetKeyActions</function>
38640f8248bfSmrgreturns
38650f8248bfSmrg<errorname>BadAlloc</errorname>.
3866e9fcaa8aSmrg</para>
3867e9fcaa8aSmrg
3868e9fcaa8aSmrg
3869e9fcaa8aSmrg</sect2>
3870eb411b4bSmrg<sect2 id='Changing_the_Number_of_Actions_Bound_to_a_Key'>
3871e9fcaa8aSmrg<title>Changing the Number of Actions Bound to a Key</title>
3872e9fcaa8aSmrg
3873e9fcaa8aSmrg<para>
38740f8248bfSmrgTo change the number of actions bound to a key, use
38750f8248bfSmrg<function>XkbResizeKeyActions</function>.
38760f8248bfSmrg</para>
38770f8248bfSmrg
38780f8248bfSmrg<indexterm significance="preferred" zone="XkbResizeKeyActions"><primary><function>XkbResizeKeyActions</function></primary></indexterm>
38790f8248bfSmrg<funcsynopsis id="XkbResizeKeyActions">
38800f8248bfSmrg  <funcprototype>
38810f8248bfSmrg    <funcdef>XkbAction *<function>XkbResizeKeyActions</function></funcdef>
38820f8248bfSmrg<!-- (
38830f8248bfSmrg<parameter>xkb</parameter>,
38840f8248bfSmrg<parameter>key</parameter>,
38850f8248bfSmrg<parameter>needed</parameter>
38860f8248bfSmrg) -->
38870f8248bfSmrg
38880f8248bfSmrg    <paramdef>XkbDescRec *<parameter>xkb</parameter></paramdef>
38890f8248bfSmrg    <paramdef>int <parameter>key</parameter></paramdef>
38900f8248bfSmrg    <paramdef>int <parameter>needed</parameter></paramdef>
38910f8248bfSmrg  </funcprototype>
38920f8248bfSmrg</funcsynopsis>
38930f8248bfSmrg<variablelist>
38940f8248bfSmrg  <varlistentry>
38950f8248bfSmrg    <term>
38960f8248bfSmrg      <parameter>xkb</parameter>
38970f8248bfSmrg    </term>
38980f8248bfSmrg    <listitem>
38990f8248bfSmrg      <para>
39000f8248bfSmrg        keyboard description to change
39010f8248bfSmrg      </para>
39020f8248bfSmrg    </listitem>
39030f8248bfSmrg  </varlistentry>
39040f8248bfSmrg  <varlistentry>
39050f8248bfSmrg    <term>
39060f8248bfSmrg      <parameter>key</parameter>
39070f8248bfSmrg    </term>
39080f8248bfSmrg    <listitem>
39090f8248bfSmrg      <para>
39100f8248bfSmrg        keycode of key to change
39110f8248bfSmrg      </para>
39120f8248bfSmrg    </listitem>
39130f8248bfSmrg  </varlistentry>
39140f8248bfSmrg  <varlistentry>
39150f8248bfSmrg    <term>
39160f8248bfSmrg      <parameter>needed</parameter>
39170f8248bfSmrg    </term>
39180f8248bfSmrg    <listitem>
39190f8248bfSmrg      <para>
39200f8248bfSmrg        new number of actions required
39210f8248bfSmrg      </para>
39220f8248bfSmrg    </listitem>
39230f8248bfSmrg  </varlistentry>
39240f8248bfSmrg</variablelist>
39250f8248bfSmrg
39260f8248bfSmrg<para>
39270f8248bfSmrgThe
39280f8248bfSmrg<parameter>xkb</parameter>
39290f8248bfSmrgparameter points to the keyboard description containing the
39300f8248bfSmrg<parameter>key</parameter>
39310f8248bfSmrgwhose number of actions is to be changed. The
39320f8248bfSmrg<parameter>key</parameter>
39330f8248bfSmrgparameter is the keycode of the key to change, and
39340f8248bfSmrg<parameter>needed</parameter>
39350f8248bfSmrgspecifies the new number of actions required for the key.
39360f8248bfSmrg</para>
39370f8248bfSmrg
39380f8248bfSmrg
39390f8248bfSmrg<para>
39400f8248bfSmrg<function>XkbResizeKeyActions</function>
39410f8248bfSmrgreserves the space needed for the actions and returns a pointer to the
39420f8248bfSmrgbeginning of the new array that holds the actions. It can change the
39430f8248bfSmrg<structfield>acts</structfield>,
39440f8248bfSmrg<structfield>num_acts</structfield>,
39450f8248bfSmrgand
39460f8248bfSmrg<structfield>size_acts</structfield>
39470f8248bfSmrgfields of
39480f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>server</structfield>
39490f8248bfSmrgif it is necessary to reallocate the
39500f8248bfSmrg<structfield>acts</structfield>
3951e9fcaa8aSmrgarray.
3952e9fcaa8aSmrg</para>
3953e9fcaa8aSmrg
3954e9fcaa8aSmrg
3955e9fcaa8aSmrg<para>
39560f8248bfSmrgIf
39570f8248bfSmrg<parameter>needed</parameter>
39580f8248bfSmrgis greater than the current number of keysyms for the key,
39590f8248bfSmrg<function>XkbResizeKeyActions</function>
39600f8248bfSmrginitializes all new actions in the array to
39610f8248bfSmrg<emphasis>NoAction</emphasis>.
3962e9fcaa8aSmrg</para>
3963e9fcaa8aSmrg
3964e9fcaa8aSmrg
3965e9fcaa8aSmrg<para>
3966e9fcaa8aSmrgBecause the number of actions needed by a key is normally computed as width *
39670f8248bfSmrgnumber of groups, and
39680f8248bfSmrg<function>XkbResizeKeyActions</function>
39690f8248bfSmrgdoes not modify either the width or number of groups for the key, a
39700f8248bfSmrgdiscrepancy exists on return from
39710f8248bfSmrg<function>XkbResizeKeyActions</function>
39720f8248bfSmrgbetween the space allocated for the actions and the number required. The
39730f8248bfSmrgunused entries in the list of actions returned by
39740f8248bfSmrg<function>XkbResizeKeyActions</function>
39750f8248bfSmrgare not preserved across future calls to any of the map editing functions, so
3976e9fcaa8aSmrgyou must update the key actions (which updates the width and number of groups
39770f8248bfSmrgfor the key) before calling another allocator function. A call to
39780f8248bfSmrg<function>XkbChangeTypesOfKey</function>
39790f8248bfSmrgupdates these.
3980e9fcaa8aSmrg</para>
3981e9fcaa8aSmrg
3982e9fcaa8aSmrg
3983e9fcaa8aSmrg<para>
3984e9fcaa8aSmrgIf any allocation errors occur while resizing the number of actions bound to
39850f8248bfSmrgthe key,
39860f8248bfSmrg<function>XkbResizeKeyActions</function>
39870f8248bfSmrgreturns
39880f8248bfSmrg<symbol>NULL</symbol>.
3989e9fcaa8aSmrg</para>
3990e9fcaa8aSmrg
3991e9fcaa8aSmrg<note><para>A change to the number of actions bound to a key should be
3992e9fcaa8aSmrgaccompanied by a change in the number of symbols bound to a key. Refer to
39930f8248bfSmrg<link linkend="Changing_the_Number_of_Symbols_Bound_to_a_Key">section 15.3.7</link> for more information on changing the number of symbols bound to
3994e9fcaa8aSmrga key.</para></note>
3995e9fcaa8aSmrg
3996e9fcaa8aSmrg
3997e9fcaa8aSmrg</sect2>
3998e9fcaa8aSmrg</sect1>
3999eb411b4bSmrg<sect1 id='Key_Behavior'>
4000e9fcaa8aSmrg<title>Key Behavior</title>
4001e9fcaa8aSmrg
4002e9fcaa8aSmrg<para>
4003e9fcaa8aSmrgKey behavior refers to the demeanor of a key. For example, the expected
40040f8248bfSmrgbehavior of the
40050f8248bfSmrg<keycap>CapsLock</keycap>
40060f8248bfSmrgkey is that it logically locks when pressed, and then logically unlocks when
4007e9fcaa8aSmrgpressed again.
4008e9fcaa8aSmrg</para>
4009e9fcaa8aSmrg
4010e9fcaa8aSmrg
4011eb411b4bSmrg<sect2 id='Radio_Groups_2'>
4012e9fcaa8aSmrg<title>Radio Groups</title>
4013e9fcaa8aSmrg
4014e9fcaa8aSmrg<para>
40150f8248bfSmrgKeys that belong to the same radio group have the
40160f8248bfSmrg<symbol>XkbKB_RadioGroup</symbol>
40170f8248bfSmrgtype in the
40180f8248bfSmrg<structfield>type</structfield>
40190f8248bfSmrgfield and the radio group index specified in the
40200f8248bfSmrg<structfield>data</structfield>
40210f8248bfSmrgfield in the
40220f8248bfSmrg<structname>XkbBehavior</structname>
40230f8248bfSmrgstructure. If the radio group has a name in the
40240f8248bfSmrg<structname>XkbNamesRec</structname>
40250f8248bfSmrgstructure, the radio group index is the index into the
40260f8248bfSmrg<structfield>radio_group</structfield>
40270f8248bfSmrgarray in the
40280f8248bfSmrg<structname>XkbNamesRec</structname>
40290f8248bfSmrgstructure. A radio group key when pressed stays logically down until another
4030e9fcaa8aSmrgkey in the radio group is pressed, when the first key becomes logically up and
40310f8248bfSmrgthe new key becomes logically down. Setting the
40320f8248bfSmrg<symbol>XkbKB_RGAllowNone</symbol>
40330f8248bfSmrgbit in the behavior for all of the keys of the radio group means that pressing
4034e9fcaa8aSmrgthe logically down member of the radio group causes it to logically release, in
4035e9fcaa8aSmrgwhich case none of the keys of the radio group would be logically down. If
40360f8248bfSmrg<symbol>XkbKB_RGAllowNone</symbol>
40370f8248bfSmrgis not set, there is no way to release the logically down member of the group.
4038e9fcaa8aSmrg</para>
4039e9fcaa8aSmrg
4040e9fcaa8aSmrg
4041e9fcaa8aSmrg<para>
40420f8248bfSmrgThe low five bits of the
40430f8248bfSmrg<structfield>data</structfield>
40440f8248bfSmrgfield of the
40450f8248bfSmrg<structname>XkbBehavior</structname>
40460f8248bfSmrgstructure are the group number, the high three bits are flags. The only flag
4047e9fcaa8aSmrgcurrently defined is:
4048e9fcaa8aSmrg
40490f8248bfSmrg<programlisting>
40500f8248bfSmrg#define      XkbKB_RGAllowNone      0x80
4051e9fcaa8aSmrg</programlisting></para>
4052e9fcaa8aSmrg
4053e9fcaa8aSmrg</sect2>
4054eb411b4bSmrg<sect2 id='The_XkbBehavior_Structure'>
4055e9fcaa8aSmrg<title>The XkbBehavior Structure</title>
40560f8248bfSmrg<indexterm significance="preferred" zone="The_XkbBehavior_Structure">
40570f8248bfSmrg<primary><structname>XkbBehavior</structname></primary></indexterm>
4058e9fcaa8aSmrg
4059e9fcaa8aSmrg<para>
40600f8248bfSmrgThe
40610f8248bfSmrg<structfield>behaviors</structfield>
40620f8248bfSmrgfield of the server map is an array of
40630f8248bfSmrg<structname>XkbBehavior</structname>
40640f8248bfSmrgstructures, indexed by keycode, and contains the behavior for each key. The
40650f8248bfSmrg<structname>XkbBehavior</structname>
40660f8248bfSmrgstructure is defined as follows:
4067e9fcaa8aSmrg
40680f8248bfSmrg<programlisting>
4069e9fcaa8aSmrgtypedef struct _XkbBehavior {
40700f8248bfSmrg    unsigned char  type;              /* behavior type + optional
40710f8248bfSmrg                                         <symbol>XkbKB_Permanent</symbol> bit */
40720f8248bfSmrg    unsigned char  data;
40730f8248bfSmrg} <structname>XkbBehavior</structname>;
4074e9fcaa8aSmrg</programlisting></para>
4075e9fcaa8aSmrg
4076e9fcaa8aSmrg<para>
40770f8248bfSmrgThe
40780f8248bfSmrg<structfield>type</structfield>
40790f8248bfSmrgfield specifies the Xkb behavior, and the value of the
40800f8248bfSmrg<structfield>data</structfield>
40810f8248bfSmrgfield depends on the
40820f8248bfSmrg<structfield>type</structfield>.
40830f8248bfSmrgXkb supports the key behaviors shown in
40840f8248bfSmrg<link linkend="table16.20">Table 16.20</link>.
4085e9fcaa8aSmrg</para>
4086e9fcaa8aSmrg
40870f8248bfSmrg<table id='table16.20' frame='topbot'>
4088e9fcaa8aSmrg<title>Key Behaviors</title>
4089eb411b4bSmrg<?dbfo keep-together="always" ?>
4090eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
4091eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
4092eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
4093e9fcaa8aSmrg<thead>
4094eb411b4bSmrg<row rowsep='1'>
4095e9fcaa8aSmrg  <entry>Type</entry>
4096e9fcaa8aSmrg  <entry>Effect</entry>
4097e9fcaa8aSmrg</row>
4098e9fcaa8aSmrg</thead>
4099e9fcaa8aSmrg<tbody>
4100eb411b4bSmrg  <row>
41010f8248bfSmrg    <entry><symbol>XkbKB_Default</symbol></entry>
4102e9fcaa8aSmrg    <entry>
41030f8248bfSmrgPress and release events are processed normally. The
41040f8248bfSmrg<structfield>data</structfield>
41050f8248bfSmrgfield is unused.
4106e9fcaa8aSmrg    </entry>
4107e9fcaa8aSmrg  </row>
4108eb411b4bSmrg  <row>
41090f8248bfSmrg    <entry><symbol>XkbKB_Lock</symbol></entry>
4110e9fcaa8aSmrg    <entry>
4111e9fcaa8aSmrgIf a key is logically up (that is, the corresponding bit of the core key map is
4112e9fcaa8aSmrgcleared) when it is pressed, the key press is processed normally and the
4113e9fcaa8aSmrgcorresponding release is ignored. If the key is logically down when pressed,
4114e9fcaa8aSmrgthe key press is ignored but the corresponding release is processed normally.
41150f8248bfSmrgThe
41160f8248bfSmrg<structfield>data</structfield>
41170f8248bfSmrgfield is unused.
4118e9fcaa8aSmrg    </entry>
4119e9fcaa8aSmrg  </row>
4120eb411b4bSmrg  <row>
41210f8248bfSmrg    <entry><symbol>XkbKB_RadioGroup</symbol></entry>
4122e9fcaa8aSmrg    <entry>
4123e9fcaa8aSmrg      <para>
4124e9fcaa8aSmrgIf another member of the radio group is logically down (all members of the
41250f8248bfSmrgradio group have the same index, specified in
41260f8248bfSmrg<structfield>data</structfield>)
41270f8248bfSmrgwhen a key is pressed, the server synthesizes a key release for the member
4128e9fcaa8aSmrgthat is logically down and then processes the new key press event normally.
4129e9fcaa8aSmrg      </para>
4130e9fcaa8aSmrg      <para>
4131e9fcaa8aSmrgIf the key itself is logically down when pressed, the key press event is
4132e9fcaa8aSmrgignored, but the processing of the corresponding key release depends on the
41330f8248bfSmrgvalue of the
41340f8248bfSmrg<symbol>XkbKB_RGAllowNone</symbol>
41350f8248bfSmrgbit in
41360f8248bfSmrg<structfield>flags</structfield>.
41370f8248bfSmrgIf it is set, the key release is processed normally; otherwise, the key
4138e9fcaa8aSmrgrelease is also ignored.
4139e9fcaa8aSmrg      </para>
4140e9fcaa8aSmrg      <para>
4141e9fcaa8aSmrgAll other key release events are ignored.
4142e9fcaa8aSmrg      </para>
4143e9fcaa8aSmrg    </entry>
4144e9fcaa8aSmrg  </row>
4145eb411b4bSmrg  <row>
41460f8248bfSmrg    <entry><symbol>XkbKB_Overlay1</symbol></entry>
4147e9fcaa8aSmrg    <entry>
41480f8248bfSmrgIf the
41490f8248bfSmrg<emphasis>Overlay1</emphasis>
41500f8248bfSmrgcontrol is enabled (see <link linkend="Controls_for_Keyboard_Overlays_Overlay1_and_Overlay2_Controls">section 10.4</link>),
41510f8248bfSmrg<structfield>data</structfield>
41520f8248bfSmrgis interpreted as a keycode, and events from this key are reported as if they
41530f8248bfSmrgcame from
41540f8248bfSmrg<structfield>data</structfield>’s
41550f8248bfSmrgkeycode. Otherwise, press and release events are processed normally.
4156e9fcaa8aSmrg    </entry>
4157e9fcaa8aSmrg  </row>
4158eb411b4bSmrg  <row>
41590f8248bfSmrg    <entry><symbol>XkbKB_Overlay2</symbol></entry>
4160e9fcaa8aSmrg    <entry>
41610f8248bfSmrgIf the
41620f8248bfSmrg<emphasis>Overlay2</emphasis>
41630f8248bfSmrgcontrol is enabled (see <link linkend="Controls_for_Keyboard_Overlays_Overlay1_and_Overlay2_Controls">section 10.4</link>),
41640f8248bfSmrg<structfield>data</structfield>
41650f8248bfSmrgis interpreted as a keycode, and events from this key are reported as if they
41660f8248bfSmrgcame from
41670f8248bfSmrg<structfield>data</structfield>’s
41680f8248bfSmrgkeycode. Otherwise, press and release events are processed normally.
4169e9fcaa8aSmrg    </entry>
4170e9fcaa8aSmrg  </row>
4171e9fcaa8aSmrg</tbody>
4172e9fcaa8aSmrg</tgroup>
4173e9fcaa8aSmrg</table>
4174e9fcaa8aSmrg
4175e9fcaa8aSmrg<para>
41760f8248bfSmrgXkb also provides the mask,
41770f8248bfSmrg<symbol>XkbKB_Permanent</symbol>
41780f8248bfSmrgto specify whether the key behavior type should be simulated by Xkb or whether
4179e9fcaa8aSmrgthe key behavior describes an unalterable physical, electrical, or software
41800f8248bfSmrgaspect of the keyboard. If the
41810f8248bfSmrg<symbol>XkbKB_Permanent</symbol>
41820f8248bfSmrgbit is not set in the
41830f8248bfSmrg<structfield>type</structfield>
41840f8248bfSmrgfield, Xkb simulates the behavior in software. Otherwise, Xkb relies upon the
4185e9fcaa8aSmrgkeyboard to implement the behavior.
4186e9fcaa8aSmrg</para>
4187e9fcaa8aSmrg
4188e9fcaa8aSmrg
4189e9fcaa8aSmrg</sect2>
4190eb411b4bSmrg<sect2 id='Obtaining_Key_Behaviors_for_Keys_from_the_Server'>
4191e9fcaa8aSmrg<title>Obtaining Key Behaviors for Keys from the Server</title>
4192e9fcaa8aSmrg
4193e9fcaa8aSmrg<para>
41940f8248bfSmrgTo obtain the behaviors (the
41950f8248bfSmrg<structfield>behaviors</structfield>
41960f8248bfSmrgarray) for a subset of the keys in a keyboard description from the server, use
41970f8248bfSmrg<function>XkbGetKeyBehaviors</function>:
41980f8248bfSmrg
41990f8248bfSmrg</para>
42000f8248bfSmrg
42010f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyBehaviors"><primary><function>XkbGetKeyBehaviors</function></primary></indexterm>
42020f8248bfSmrg<funcsynopsis id="XkbGetKeyBehaviors">
42030f8248bfSmrg  <funcprototype>
42040f8248bfSmrg    <funcdef>Status <function>XkbGetKeyBehaviors</function></funcdef>
42050f8248bfSmrg<!-- (
42060f8248bfSmrg<parameter>dpy</parameter>,
42070f8248bfSmrg<parameter>first</parameter>,
42080f8248bfSmrg<parameter>num</parameter>,
42090f8248bfSmrg<parameter>xkb</parameter>
42100f8248bfSmrg) -->
42110f8248bfSmrg
42120f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
42130f8248bfSmrg    <paramdef>unsigned int <parameter>first</parameter></paramdef>
42140f8248bfSmrg    <paramdef>unsigned int <parameter>num</parameter></paramdef>
42150f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
42160f8248bfSmrg  </funcprototype>
42170f8248bfSmrg</funcsynopsis>
42180f8248bfSmrg<variablelist>
42190f8248bfSmrg  <varlistentry>
42200f8248bfSmrg    <term>
42210f8248bfSmrg      <parameter>dpy</parameter>
42220f8248bfSmrg    </term>
42230f8248bfSmrg    <listitem>
42240f8248bfSmrg      <para>
42250f8248bfSmrg        connection to server
42260f8248bfSmrg      </para>
42270f8248bfSmrg    </listitem>
42280f8248bfSmrg  </varlistentry>
42290f8248bfSmrg  <varlistentry>
42300f8248bfSmrg    <term>
42310f8248bfSmrg      <parameter>first</parameter>
42320f8248bfSmrg    </term>
42330f8248bfSmrg    <listitem>
42340f8248bfSmrg      <para>
42350f8248bfSmrg        keycode of first key to get
42360f8248bfSmrg      </para>
42370f8248bfSmrg    </listitem>
42380f8248bfSmrg  </varlistentry>
42390f8248bfSmrg  <varlistentry>
42400f8248bfSmrg    <term>
42410f8248bfSmrg      <parameter>num</parameter>
42420f8248bfSmrg    </term>
42430f8248bfSmrg    <listitem>
42440f8248bfSmrg      <para>
42450f8248bfSmrg        number of keys for which behaviors are desired
42460f8248bfSmrg      </para>
42470f8248bfSmrg    </listitem>
42480f8248bfSmrg  </varlistentry>
42490f8248bfSmrg  <varlistentry>
42500f8248bfSmrg    <term>
42510f8248bfSmrg      <parameter>xkb</parameter>
42520f8248bfSmrg    </term>
42530f8248bfSmrg    <listitem>
42540f8248bfSmrg      <para>
42550f8248bfSmrg        Xkb description to contain the result
42560f8248bfSmrg      </para>
42570f8248bfSmrg    </listitem>
42580f8248bfSmrg  </varlistentry>
42590f8248bfSmrg</variablelist>
4260e9fcaa8aSmrg
4261e9fcaa8aSmrg<para>
42620f8248bfSmrg<function>XkbGetKeyBehaviors</function>
42630f8248bfSmrgsends a request to the server to obtain the behaviors for
42640f8248bfSmrg<parameter>num</parameter>
42650f8248bfSmrgkeys on the keyboard starting with the key whose keycode is
42660f8248bfSmrg<parameter>first</parameter>.
42670f8248bfSmrgIt waits for a reply and returns the behaviors in the
42680f8248bfSmrg<structfield>server</structfield>-&gt;<structfield>behaviors</structfield>
42690f8248bfSmrgfield of
42700f8248bfSmrg<parameter>xkb</parameter>.
42710f8248bfSmrgIf successful,
42720f8248bfSmrg<function>XkbGetKeyBehaviors</function>
42730f8248bfSmrgreturns
42740f8248bfSmrg<symbol>Success</symbol>.
4275e9fcaa8aSmrg</para>
4276e9fcaa8aSmrg
4277e9fcaa8aSmrg
4278e9fcaa8aSmrg<para>
42790f8248bfSmrgIf the
42800f8248bfSmrg<structfield>server</structfield>
42810f8248bfSmrgmap in the
42820f8248bfSmrg<parameter>xkb</parameter>
42830f8248bfSmrgparameter has not been allocated,
42840f8248bfSmrg<function>XkbGetKeyBehaviors</function>
42850f8248bfSmrgallocates and initializes it before obtaining the actions.
4286e9fcaa8aSmrg</para>
4287e9fcaa8aSmrg
4288e9fcaa8aSmrg
4289e9fcaa8aSmrg<para>
4290e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
42910f8248bfSmrghas not been properly initialized,
42920f8248bfSmrg<function>XkbGetKeyBehaviors</function>
42930f8248bfSmrgreturns
42940f8248bfSmrg<errorname>BadAccess</errorname>.
42950f8248bfSmrgIf
42960f8248bfSmrg<parameter>num</parameter>
42970f8248bfSmrgis less than 1 or greater than
42980f8248bfSmrg<symbol>XkbMaxKeyCount</symbol>,
42990f8248bfSmrg<function>XkbGetKeyBehaviors</function>
43000f8248bfSmrgreturns
43010f8248bfSmrg<errorname>BadValue</errorname>.
43020f8248bfSmrgIf any allocation errors occur,
43030f8248bfSmrg<function>XkbGetKeyBehaviors</function>
43040f8248bfSmrgreturns
43050f8248bfSmrg<errorname>BadAlloc</errorname>.
4306e9fcaa8aSmrg</para>
4307e9fcaa8aSmrg
4308e9fcaa8aSmrg
4309e9fcaa8aSmrg</sect2>
4310e9fcaa8aSmrg</sect1>
4311eb411b4bSmrg<sect1 id='Explicit_ComponentsAvoiding_Automatic_Remapping_by_the_Server'>
4312e9fcaa8aSmrg<title>Explicit Components—Avoiding Automatic Remapping by the Server</title>
4313e9fcaa8aSmrg
4314e9fcaa8aSmrg<para>
4315e9fcaa8aSmrgWhenever a client remaps the keyboard using core protocol requests, Xkb
4316e9fcaa8aSmrgexamines the map to determine likely default values for the components that
43170f8248bfSmrgcannot be specified using the core protocol (see <link linkend="Core_Keyboard_Mapping_to_Xkb_Keyboard_Mapping_Transformation">section 17.1.2</link> for more
4318e9fcaa8aSmrginformation on how Xkb chooses the default values).
4319e9fcaa8aSmrg</para>
4320e9fcaa8aSmrg
4321e9fcaa8aSmrg
4322e9fcaa8aSmrg<para>
4323e9fcaa8aSmrgThis automatic remapping might replace definitions explicitly requested by an
4324e9fcaa8aSmrgapplication, so the Xkb keyboard description defines an explicit components
4325e9fcaa8aSmrgmask for each key. Any aspects of the automatic remapping listed in the
4326e9fcaa8aSmrgexplicit components mask for a key are not changed by the automatic keyboard
4327e9fcaa8aSmrgmapping.
4328e9fcaa8aSmrg</para>
4329e9fcaa8aSmrg
4330e9fcaa8aSmrg
4331e9fcaa8aSmrg<para>
43320f8248bfSmrgThe explicit components masks are held in the
43330f8248bfSmrg<structfield>explicit</structfield>
43340f8248bfSmrgfield of the server map, which is an array indexed by keycode. Each entry in
4335e9fcaa8aSmrgthis array is a mask that is a bitwise inclusive OR of the values shown in
43360f8248bfSmrg<link linkend="table16.21">Table 16.21</link>.
4337e9fcaa8aSmrg</para>
4338e9fcaa8aSmrg
43390f8248bfSmrg<table id='table16.21' frame='topbot'>
4340e9fcaa8aSmrg<title>Explicit Component Masks</title>
4341eb411b4bSmrg<?dbfo keep-together="always" ?>
4342eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
4343eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
4344eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
4345eb411b4bSmrg<colspec colname='c3' colwidth='2.0*'/>
4346e9fcaa8aSmrg<thead>
4347eb411b4bSmrg<row rowsep='1'>
4348e9fcaa8aSmrg  <entry>Bit in Explicit Mask</entry>
4349e9fcaa8aSmrg  <entry>Value</entry>
4350e9fcaa8aSmrg  <entry>Protects Against</entry>
4351e9fcaa8aSmrg</row>
4352e9fcaa8aSmrg</thead>
4353e9fcaa8aSmrg<tbody>
4354eb411b4bSmrg  <row>
4355e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType1</emphasis></entry>
4356e9fcaa8aSmrg    <entry>(1&lt;&lt;0)</entry>
4357e9fcaa8aSmrg    <entry>
43580f8248bfSmrgAutomatic determination of the key type associated with
43590f8248bfSmrg<emphasis>Group1</emphasis>.
4360e9fcaa8aSmrg    </entry>
4361e9fcaa8aSmrg  </row>
4362eb411b4bSmrg  <row>
4363e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType2</emphasis></entry>
4364e9fcaa8aSmrg    <entry>(1&lt;&lt;1)</entry>
4365e9fcaa8aSmrg    <entry>
43660f8248bfSmrgAutomatic determination of the key type associated with
43670f8248bfSmrg<emphasis>Group2</emphasis>.
4368e9fcaa8aSmrg    </entry>
4369e9fcaa8aSmrg  </row>
4370eb411b4bSmrg  <row>
4371e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType3</emphasis></entry>
4372e9fcaa8aSmrg    <entry>(1&lt;&lt;2)</entry>
4373e9fcaa8aSmrg    <entry>
43740f8248bfSmrgAutomatic determination of the key type associated with
43750f8248bfSmrg<emphasis>Group3</emphasis>.
4376e9fcaa8aSmrg    </entry>
4377e9fcaa8aSmrg  </row>
4378eb411b4bSmrg  <row>
4379e9fcaa8aSmrg    <entry><emphasis>ExplicitKeyType4</emphasis></entry>
4380e9fcaa8aSmrg    <entry>(1&lt;&lt;3)</entry>
4381e9fcaa8aSmrg    <entry>
43820f8248bfSmrgAutomatic determination of the key type associated with
43830f8248bfSmrg<emphasis>Group4</emphasis>.
4384e9fcaa8aSmrg    </entry>
4385e9fcaa8aSmrg  </row>
4386eb411b4bSmrg  <row>
4387e9fcaa8aSmrg    <entry><emphasis>ExplicitInterpret</emphasis></entry>
4388e9fcaa8aSmrg    <entry>(1&lt;&lt;4)</entry>
4389e9fcaa8aSmrg    <entry>
4390e9fcaa8aSmrgApplication of any of the fields of a symbol interpretation to the
4391e9fcaa8aSmrgkey in question.
4392e9fcaa8aSmrg    </entry>
4393e9fcaa8aSmrg  </row>
4394eb411b4bSmrg  <row>
4395e9fcaa8aSmrg    <entry><emphasis>ExplicitAutoRepeat</emphasis></entry>
4396e9fcaa8aSmrg    <entry>(1&lt;&lt;5)</entry>
4397e9fcaa8aSmrg    <entry>Automatic determination of auto-repeat status for the key, as
4398e9fcaa8aSmrgspecified in a symbol interpretation.</entry>
4399e9fcaa8aSmrg  </row>
4400eb411b4bSmrg  <row>
4401e9fcaa8aSmrg    <entry><emphasis>ExplicitBehavior</emphasis></entry>
4402e9fcaa8aSmrg    <entry>(1&lt;&lt;6)</entry>
4403e9fcaa8aSmrg    <entry>
44040f8248bfSmrgAutomatic assignment of the
44050f8248bfSmrg<symbol>XkbKB_Lock</symbol>
44060f8248bfSmrgbehavior to the key, if the
44070f8248bfSmrg<symbol>XkbSI_LockingKey</symbol>
44080f8248bfSmrgflag is set in a symbol interpretation.
4409e9fcaa8aSmrg    </entry>
4410e9fcaa8aSmrg  </row>
4411eb411b4bSmrg  <row>
4412e9fcaa8aSmrg    <entry><emphasis>ExplicitVModMap</emphasis></entry>
4413e9fcaa8aSmrg    <entry>(1&lt;&lt;7)</entry>
4414e9fcaa8aSmrg    <entry>
4415e9fcaa8aSmrgAutomatic determination of the virtual modifier map for the key
4416e9fcaa8aSmrgbased on the actions assigned to the key and the symbol interpretations that
4417e9fcaa8aSmrgmatch the key.
4418e9fcaa8aSmrg    </entry>
4419e9fcaa8aSmrg  </row>
4420e9fcaa8aSmrg</tbody>
4421e9fcaa8aSmrg</tgroup>
4422e9fcaa8aSmrg</table>
4423e9fcaa8aSmrg
4424eb411b4bSmrg<sect2 id='Obtaining_Explicit_Components_for_Keys_from_the_Server'>
4425e9fcaa8aSmrg<title>Obtaining Explicit Components for Keys from the Server</title>
4426e9fcaa8aSmrg
4427e9fcaa8aSmrg<para>
44280f8248bfSmrgTo obtain the explicit components (the
44290f8248bfSmrg<structfield>explicit</structfield>
44300f8248bfSmrgarray) for a subset of the keys in a keyboard description, use
44310f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>.
44320f8248bfSmrg</para>
44330f8248bfSmrg
44340f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyExplicitComponents"><primary><function>XkbGetKeyExplicitComponents</function></primary></indexterm>
44350f8248bfSmrg<funcsynopsis id="XkbGetKeyExplicitComponents">
44360f8248bfSmrg  <funcprototype>
44370f8248bfSmrg    <funcdef>Status <function>XkbGetKeyExplicitComponents</function></funcdef>
44380f8248bfSmrg<!-- (
44390f8248bfSmrg<parameter>dpy</parameter>,
44400f8248bfSmrg<parameter>first</parameter>,
44410f8248bfSmrg<parameter>num</parameter>,
44420f8248bfSmrg<parameter>xkb</parameter>
44430f8248bfSmrg) -->
44440f8248bfSmrg
44450f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
44460f8248bfSmrg    <paramdef>unsigned int <parameter>first</parameter></paramdef>
44470f8248bfSmrg    <paramdef>unsigned int <parameter>num</parameter></paramdef>
44480f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
44490f8248bfSmrg  </funcprototype>
44500f8248bfSmrg</funcsynopsis>
44510f8248bfSmrg<variablelist>
44520f8248bfSmrg  <varlistentry>
44530f8248bfSmrg    <term>
44540f8248bfSmrg      <parameter>dpy</parameter>
44550f8248bfSmrg    </term>
44560f8248bfSmrg    <listitem>
44570f8248bfSmrg      <para>
44580f8248bfSmrg        connection to server
44590f8248bfSmrg      </para>
44600f8248bfSmrg    </listitem>
44610f8248bfSmrg  </varlistentry>
44620f8248bfSmrg  <varlistentry>
44630f8248bfSmrg    <term>
44640f8248bfSmrg      <parameter>first</parameter>
44650f8248bfSmrg    </term>
44660f8248bfSmrg    <listitem>
44670f8248bfSmrg      <para>
44680f8248bfSmrg        keycode of first key to fetch
44690f8248bfSmrg      </para>
44700f8248bfSmrg    </listitem>
44710f8248bfSmrg  </varlistentry>
44720f8248bfSmrg  <varlistentry>
44730f8248bfSmrg    <term>
44740f8248bfSmrg      <parameter>num</parameter>
44750f8248bfSmrg    </term>
44760f8248bfSmrg    <listitem>
44770f8248bfSmrg      <para>
44780f8248bfSmrg        number of keys for which to get explicit info
44790f8248bfSmrg      </para>
44800f8248bfSmrg    </listitem>
44810f8248bfSmrg  </varlistentry>
44820f8248bfSmrg  <varlistentry>
44830f8248bfSmrg    <term>
44840f8248bfSmrg      <parameter>xkb</parameter>
44850f8248bfSmrg    </term>
44860f8248bfSmrg    <listitem>
44870f8248bfSmrg      <para>
44880f8248bfSmrg        Xkb description in which to put results
44890f8248bfSmrg      </para>
44900f8248bfSmrg    </listitem>
44910f8248bfSmrg  </varlistentry>
44920f8248bfSmrg</variablelist>
4493e9fcaa8aSmrg
4494e9fcaa8aSmrg<para>
44950f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>
44960f8248bfSmrgsends a request to the server to obtain the explicit components for
44970f8248bfSmrg<parameter>num</parameter>
44980f8248bfSmrgkeys on the keyboard starting with key
44990f8248bfSmrg<parameter>first</parameter>.
45000f8248bfSmrgIt waits for a reply and returns the explicit components in the
45010f8248bfSmrg<structfield>server</structfield>-&gt;<structfield>explicit</structfield>
45020f8248bfSmrgarray of
45030f8248bfSmrg<parameter>xkb</parameter>.
45040f8248bfSmrgIf successful,
45050f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>
45060f8248bfSmrgreturns
45070f8248bfSmrg<symbol>Success</symbol>.
45080f8248bfSmrgThe
45090f8248bfSmrg<parameter>xkb</parameter>
45100f8248bfSmrgparameter must be a pointer to a valid Xkb keyboard description.
4511e9fcaa8aSmrg</para>
4512e9fcaa8aSmrg
4513e9fcaa8aSmrg
4514e9fcaa8aSmrg<para>
45150f8248bfSmrgIf the
45160f8248bfSmrg<structfield>server</structfield>
45170f8248bfSmrgmap in the
45180f8248bfSmrg<parameter>xkb</parameter>
45190f8248bfSmrgparameter has not been allocated,
45200f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>
45210f8248bfSmrgallocates and initializes it before obtaining the actions.
4522e9fcaa8aSmrg</para>
4523e9fcaa8aSmrg
4524e9fcaa8aSmrg
4525e9fcaa8aSmrg<para>
4526e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
45270f8248bfSmrghas not been properly initialized,
45280f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>
45290f8248bfSmrgreturns
45300f8248bfSmrg<errorname>BadMatch</errorname>.
45310f8248bfSmrgIf
45320f8248bfSmrg<parameter>num</parameter>
45330f8248bfSmrgis less than 1 or greater than
45340f8248bfSmrg<symbol>XkbMaxKeyCount</symbol>,
45350f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>
45360f8248bfSmrgreturns
45370f8248bfSmrg<errorname>BadValue</errorname>.
45380f8248bfSmrgIf any allocation errors occur,
45390f8248bfSmrg<function>XkbGetKeyExplicitComponents</function>
45400f8248bfSmrgreturns
45410f8248bfSmrg<errorname>BadAlloc</errorname>.
4542e9fcaa8aSmrg</para>
4543e9fcaa8aSmrg
4544e9fcaa8aSmrg
4545e9fcaa8aSmrg</sect2>
4546e9fcaa8aSmrg</sect1>
4547eb411b4bSmrg<sect1 id='Virtual_Modifier_Mapping'>
4548e9fcaa8aSmrg<title>Virtual Modifier Mapping</title>
4549e9fcaa8aSmrg
4550e9fcaa8aSmrg<para>
45510f8248bfSmrgThe
45520f8248bfSmrg<structfield>vmods</structfield>
45530f8248bfSmrgmember of the server map is a fixed-length array containing
45540f8248bfSmrg<symbol>XkbNumVirtualMods</symbol>
45550f8248bfSmrgentries. Each entry corresponds to a virtual modifier and provides the binding
45560f8248bfSmrgof the virtual modifier to the real modifier bits. Each entry in the
45570f8248bfSmrg<structfield>vmods</structfield>
45580f8248bfSmrgarray is a bitwise inclusive OR of the legal modifier masks:
45590f8248bfSmrg</para>
45600f8248bfSmrg
45610f8248bfSmrg<simplelist type='vert' columns='1'>
45620f8248bfSmrg     <member><symbol>ShiftMask</symbol></member>
45630f8248bfSmrg     <member><symbol>LockMask</symbol></member>
45640f8248bfSmrg     <member><symbol>ControlMask</symbol></member>
45650f8248bfSmrg     <member><symbol>Mod1Mask</symbol></member>
45660f8248bfSmrg     <member><symbol>Mod2Mask</symbol></member>
45670f8248bfSmrg     <member><symbol>Mod3Mask</symbol></member>
45680f8248bfSmrg     <member><symbol>Mod4Mask</symbol></member>
45690f8248bfSmrg     <member><symbol>Mod5Mask</symbol></member>
45700f8248bfSmrg</simplelist>
45710f8248bfSmrg
45720f8248bfSmrg<para>
45730f8248bfSmrgThe
45740f8248bfSmrg<structfield>vmodmap</structfield>
45750f8248bfSmrgmember of the server map is similar to the
45760f8248bfSmrg<structfield>modmap</structfield>
45770f8248bfSmrgarray of the client map (see <link linkend="The_Per_Key_Modifier_Map">section 15.4</link>), but is used to define the virtual
45780f8248bfSmrgmodifier mapping for each key. Like the
45790f8248bfSmrg<structfield>modmap</structfield>
45800f8248bfSmrgmember, it is indexed by keycode, and each entry is a mask representing the
4581e9fcaa8aSmrgvirtual modifiers bound to the corresponding key:
4582e9fcaa8aSmrg</para>
4583e9fcaa8aSmrg
4584e9fcaa8aSmrg<itemizedlist>
4585e9fcaa8aSmrg  <listitem>
4586e9fcaa8aSmrg    <para>
45870f8248bfSmrgEach of the bits in a
45880f8248bfSmrg<structfield>vmodmap</structfield>
45890f8248bfSmrgentry represents an index into the
45900f8248bfSmrg<structfield>vmods</structfield>
45910f8248bfSmrgmember. That is, bit 0 of a
45920f8248bfSmrg<structfield>vmodmap</structfield>
45930f8248bfSmrgentry refers to index 0 of the
45940f8248bfSmrg<structfield>vmods</structfield>
45950f8248bfSmrgarray, bit 1 refers to index 1, and so on.
4596e9fcaa8aSmrg    </para>
4597e9fcaa8aSmrg  </listitem>
4598e9fcaa8aSmrg  <listitem>
4599e9fcaa8aSmrg    <para>
46000f8248bfSmrgIf a bit is set in the
46010f8248bfSmrg<structfield>vmodmap</structfield>
46020f8248bfSmrgentry for a key, that key is bound to the corresponding virtual modifier in
46030f8248bfSmrgthe
46040f8248bfSmrg<structfield>vmods</structfield>
46050f8248bfSmrgarray.
4606e9fcaa8aSmrg    </para>
4607e9fcaa8aSmrg  </listitem>
4608e9fcaa8aSmrg</itemizedlist>
4609e9fcaa8aSmrg
4610e9fcaa8aSmrg<para>
46110f8248bfSmrgThe
46120f8248bfSmrg<structfield>vmodmap</structfield>
46130f8248bfSmrgand
46140f8248bfSmrg<structfield>vmods</structfield>
46150f8248bfSmrgmembers of the server map are the <quote>master</quote> virtual modifier definitions. Xkb
4616e9fcaa8aSmrgautomatically propagates any changes to these fields to all other fields that
4617e9fcaa8aSmrguse virtual modifier mappings.
4618e9fcaa8aSmrg</para>
4619e9fcaa8aSmrg
4620e9fcaa8aSmrg
4621e9fcaa8aSmrg<para>
4622e9fcaa8aSmrgThe overall relationship of fields dealing with virtual modifiers in an Xkb
46230f8248bfSmrgkeyboard description are shown in <link linkend="figure16.2">Figure 16.2</link>.
4624e9fcaa8aSmrg</para>
4625e9fcaa8aSmrg
46260f8248bfSmrg<figure id='figure16.2'>
46270f8248bfSmrg  <title>Virtual Modifier Relationships</title>
46280f8248bfSmrg  <mediaobject>
46290f8248bfSmrg   <imageobject> <imagedata format="SVG" fileref="XKBlib-17.svg"/>
46300f8248bfSmrg   </imageobject>
46310f8248bfSmrg  </mediaobject>
46320f8248bfSmrg</figure>
4633e9fcaa8aSmrg
4634e9fcaa8aSmrg
4635e9fcaa8aSmrg
4636e9fcaa8aSmrg<!--
4637e9fcaa8aSmrg<H5 CLASS="Figure">
4638e9fcaa8aSmrgVirtual Modifier Relationships</H5>
4639e9fcaa8aSmrg-->
4640e9fcaa8aSmrg
4641eb411b4bSmrg<sect2 id='Obtaining_Virtual_Modifier_Bindings_from_the_Server'>
4642e9fcaa8aSmrg<title>Obtaining Virtual Modifier Bindings from the Server</title>
4643e9fcaa8aSmrg
4644e9fcaa8aSmrg<para>
46450f8248bfSmrgTo obtain a subset of the virtual modifier bindings (the
46460f8248bfSmrg<structfield>vmods</structfield>
46470f8248bfSmrgarray) in a keyboard description, use
46480f8248bfSmrg<function>XkbGetVirtualMods</function>:
46490f8248bfSmrg
46500f8248bfSmrg</para>
46510f8248bfSmrg
46520f8248bfSmrg<indexterm significance="preferred" zone="XkbGetVirtualMods"><primary><function>XkbGetVirtualMods</function></primary></indexterm>
46530f8248bfSmrg<funcsynopsis id="XkbGetVirtualMods">
46540f8248bfSmrg  <funcprototype>
46550f8248bfSmrg    <funcdef>Status <function>XkbGetVirtualMods</function></funcdef>
46560f8248bfSmrg<!-- (
46570f8248bfSmrg<parameter>dpy</parameter>,
46580f8248bfSmrg<parameter>which</parameter>,
46590f8248bfSmrg<parameter>xkb</parameter>
46600f8248bfSmrg) -->
46610f8248bfSmrg
46620f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
46630f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
46640f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
46650f8248bfSmrg  </funcprototype>
46660f8248bfSmrg</funcsynopsis>
46670f8248bfSmrg<variablelist>
46680f8248bfSmrg  <varlistentry>
46690f8248bfSmrg    <term>
46700f8248bfSmrg      <parameter>dpy</parameter>
46710f8248bfSmrg    </term>
46720f8248bfSmrg    <listitem>
46730f8248bfSmrg      <para>
46740f8248bfSmrg        connection to server
46750f8248bfSmrg      </para>
46760f8248bfSmrg    </listitem>
46770f8248bfSmrg  </varlistentry>
46780f8248bfSmrg  <varlistentry>
46790f8248bfSmrg    <term>
46800f8248bfSmrg      <parameter>which</parameter>
46810f8248bfSmrg    </term>
46820f8248bfSmrg    <listitem>
46830f8248bfSmrg      <para>
46840f8248bfSmrg        mask indicating virtual modifier bindings to get
46850f8248bfSmrg      </para>
46860f8248bfSmrg    </listitem>
46870f8248bfSmrg  </varlistentry>
46880f8248bfSmrg  <varlistentry>
46890f8248bfSmrg    <term>
46900f8248bfSmrg      <parameter>xkb</parameter>
46910f8248bfSmrg    </term>
46920f8248bfSmrg    <listitem>
46930f8248bfSmrg      <para>
46940f8248bfSmrg        Xkb description where results will be placed
46950f8248bfSmrg      </para>
46960f8248bfSmrg    </listitem>
46970f8248bfSmrg  </varlistentry>
46980f8248bfSmrg</variablelist>
4699e9fcaa8aSmrg
4700e9fcaa8aSmrg<para>
47010f8248bfSmrg<function>XkbGetVirtualMods</function>
47020f8248bfSmrgsends a request to the server to obtain the
47030f8248bfSmrg<structfield>vmods</structfield>
47040f8248bfSmrgentries for the virtual modifiers specified in the mask,
47050f8248bfSmrg<parameter>which</parameter>,
47060f8248bfSmrgand waits for a reply. See <link linkend="Virtual_Modifier_Names_and_Masks">section 7.1</link> for a description of how to determine
47070f8248bfSmrgthe virtual modifier mask. For each bit set in
47080f8248bfSmrg<parameter>which</parameter>,
47090f8248bfSmrg<function>XkbGetVirtualMods</function>
47100f8248bfSmrgupdates the corresponding virtual modifier definition in the
47110f8248bfSmrg<structfield>server-&gt;vmods</structfield>
47120f8248bfSmrgarray of
47130f8248bfSmrg<parameter>xkb</parameter>.
47140f8248bfSmrgThe
47150f8248bfSmrg<parameter>xkb</parameter>
47160f8248bfSmrgparameter must be a pointer to a valid Xkb keyboard description. If
47170f8248bfSmrgsuccessful,
47180f8248bfSmrg<function>XkbGetVirtualMods</function>
47190f8248bfSmrgreturns
47200f8248bfSmrg<symbol>Success</symbol>.
4721e9fcaa8aSmrg</para>
4722e9fcaa8aSmrg
4723e9fcaa8aSmrg
4724e9fcaa8aSmrg<para>
47250f8248bfSmrgIf the
47260f8248bfSmrg<structfield>server</structfield>
47270f8248bfSmrgmap has not been allocated in the
47280f8248bfSmrg<parameter>xkb</parameter>
47290f8248bfSmrgparameter,
47300f8248bfSmrg<function>XkbGetVirtualMods</function>
47310f8248bfSmrgallocates and initializes it before obtaining the virtual modifier bindings.
4732e9fcaa8aSmrg</para>
4733e9fcaa8aSmrg
4734e9fcaa8aSmrg
4735e9fcaa8aSmrg<para>
4736e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
47370f8248bfSmrghas not been properly initialized,
47380f8248bfSmrg<function>XkbGetVirtualMods</function>
47390f8248bfSmrgreturns
47400f8248bfSmrg<errorname>BadMatch</errorname>.
47410f8248bfSmrgAny errors in allocation cause
47420f8248bfSmrg<function>XkbGetVirtualMods</function>
47430f8248bfSmrgto return
47440f8248bfSmrg<errorname>BadAlloc</errorname>.
4745e9fcaa8aSmrg</para>
4746e9fcaa8aSmrg
4747e9fcaa8aSmrg
4748e9fcaa8aSmrg</sect2>
4749eb411b4bSmrg<sect2 id='Obtaining_Per_Key_Virtual_Modifier_Mappings_from_the_Server'>
4750e9fcaa8aSmrg<title>Obtaining Per-Key Virtual Modifier Mappings from the Server</title>
4751e9fcaa8aSmrg
4752e9fcaa8aSmrg<para>
47530f8248bfSmrgTo obtain the virtual modifier map (the
47540f8248bfSmrg<structfield>vmodmap</structfield>
47550f8248bfSmrgarray) for a subset of the keys in a keyboard description, use
47560f8248bfSmrg<function>XkbGetKeyVirtualModMap</function>:
47570f8248bfSmrg
47580f8248bfSmrg</para>
47590f8248bfSmrg
47600f8248bfSmrg<indexterm significance="preferred" zone="XkbGetKeyVirtualModMap"><primary><function>XkbGetKeyVirtualModMap</function></primary></indexterm>
47610f8248bfSmrg<funcsynopsis id="XkbGetKeyVirtualModMap">
47620f8248bfSmrg  <funcprototype>
47630f8248bfSmrg    <funcdef>Status <function>XkbGetKeyVirtualModMap</function></funcdef>
47640f8248bfSmrg<!-- (
47650f8248bfSmrg<parameter>dpy</parameter>,
47660f8248bfSmrg<parameter>first</parameter>,
47670f8248bfSmrg<parameter>num</parameter>,
47680f8248bfSmrg<parameter>xkb</parameter>
47690f8248bfSmrg) -->
47700f8248bfSmrg
47710f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
47720f8248bfSmrg    <paramdef>unsigned int <parameter>first</parameter></paramdef>
47730f8248bfSmrg    <paramdef>unsigned int <parameter>num</parameter></paramdef>
47740f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
47750f8248bfSmrg  </funcprototype>
47760f8248bfSmrg</funcsynopsis>
47770f8248bfSmrg<variablelist>
47780f8248bfSmrg  <varlistentry>
47790f8248bfSmrg    <term>
47800f8248bfSmrg      <parameter>dpy</parameter>
47810f8248bfSmrg    </term>
47820f8248bfSmrg    <listitem>
47830f8248bfSmrg      <para>
47840f8248bfSmrg        connection to server
47850f8248bfSmrg      </para>
47860f8248bfSmrg    </listitem>
47870f8248bfSmrg  </varlistentry>
47880f8248bfSmrg  <varlistentry>
47890f8248bfSmrg    <term>
47900f8248bfSmrg      <parameter>first</parameter>
47910f8248bfSmrg    </term>
47920f8248bfSmrg    <listitem>
47930f8248bfSmrg      <para>
47940f8248bfSmrg        keycode of first key to fetch
47950f8248bfSmrg      </para>
47960f8248bfSmrg    </listitem>
47970f8248bfSmrg  </varlistentry>
47980f8248bfSmrg  <varlistentry>
47990f8248bfSmrg    <term>
48000f8248bfSmrg      <parameter>num</parameter>
48010f8248bfSmrg    </term>
48020f8248bfSmrg    <listitem>
48030f8248bfSmrg      <para>
48040f8248bfSmrg        # keys for which virtual mod maps are desired
48050f8248bfSmrg      </para>
48060f8248bfSmrg    </listitem>
48070f8248bfSmrg  </varlistentry>
48080f8248bfSmrg  <varlistentry>
48090f8248bfSmrg    <term>
48100f8248bfSmrg      <parameter>xkb</parameter>
48110f8248bfSmrg    </term>
48120f8248bfSmrg    <listitem>
48130f8248bfSmrg      <para>
48140f8248bfSmrg        Xkb description where results will be placed
48150f8248bfSmrg      </para>
48160f8248bfSmrg    </listitem>
48170f8248bfSmrg  </varlistentry>
48180f8248bfSmrg</variablelist>
4819e9fcaa8aSmrg
4820e9fcaa8aSmrg<para>
48210f8248bfSmrg<function>XkbGetKeyVirtualModmap</function>
4822e9fcaa8aSmrgsends a request to the server to obtain the virtual modifier mappings for
48230f8248bfSmrg<parameter>num</parameter>
48240f8248bfSmrgkeys on the keyboard starting with key
48250f8248bfSmrg<parameter>first</parameter>.
48260f8248bfSmrgIt waits for a reply and returns the virtual modifier mappings in the
48270f8248bfSmrg<structfield>server</structfield>-&gt;<structfield>vmodmap</structfield>
48280f8248bfSmrgarray of
48290f8248bfSmrg<parameter>xkb</parameter>.
48300f8248bfSmrgIf successful,
48310f8248bfSmrg<function>XkbGetKeyVirtualModMap</function>
48320f8248bfSmrgreturns
48330f8248bfSmrg<symbol>Success</symbol>.
48340f8248bfSmrgThe
48350f8248bfSmrg<parameter>xkb</parameter>
48360f8248bfSmrgparameter must be a pointer to a valid Xkb keyboard description
4837e9fcaa8aSmrg</para>
4838e9fcaa8aSmrg
4839e9fcaa8aSmrg
4840e9fcaa8aSmrg<para>
48410f8248bfSmrgIf the
48420f8248bfSmrg<structfield>server</structfield>
48430f8248bfSmrgmap in the
48440f8248bfSmrg<parameter>xkb</parameter>
48450f8248bfSmrgparameter has not been allocated,
48460f8248bfSmrg<function>XkbGetKeyVirtualModMap</function>
48470f8248bfSmrgallocates and initializes it before obtaining the virtual modifier mappings.
4848e9fcaa8aSmrg</para>
4849e9fcaa8aSmrg
4850e9fcaa8aSmrg
4851e9fcaa8aSmrg<para>
4852e9fcaa8aSmrgIf the server does not have a compatible version of Xkb, or the Xkb extension
48530f8248bfSmrghas not been properly initialized,
48540f8248bfSmrg<function>XkbGetKeyVirtualModMap</function>
48550f8248bfSmrgreturns
48560f8248bfSmrg<errorname>BadMatch</errorname>.
48570f8248bfSmrgIf
48580f8248bfSmrg<parameter>num</parameter>
48590f8248bfSmrgis less than 1 or greater than
48600f8248bfSmrg<symbol>XkbMaxKeyCount</symbol>,
48610f8248bfSmrg<function>XkbGetKeyVirtualModMap</function>
48620f8248bfSmrgreturns
48630f8248bfSmrg<errorname>BadValue</errorname>.
48640f8248bfSmrgIf any allocation errors occur,
48650f8248bfSmrg<function>XkbGetKeyVirtualModMap</function>
48660f8248bfSmrgreturns
48670f8248bfSmrg<errorname>BadAlloc</errorname>.
4868e9fcaa8aSmrg</para>
4869e9fcaa8aSmrg
4870e9fcaa8aSmrg</sect2>
4871e9fcaa8aSmrg</sect1>
4872e9fcaa8aSmrg</chapter>
4873