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>-><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>-><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> ⇒ 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> ⇒ key press, 30700f8248bfSmrg <symbol>False</symbol> ⇒ release */ 30710f8248bfSmrg Bool key_event_follows;/* <symbol>True</symbol> ⇒ 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<n>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<n>Scale</structfield> 36530f8248bfSmrgis shown in that table also. 36540f8248bfSmrg</para> 36550f8248bfSmrg 36560f8248bfSmrg<table id='table16.19' frame='topbot'> 3657e9fcaa8aSmrg<title>Device Valuator v<n>_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<n>_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<n>_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<n>_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<n>_value</structfield> * (2 36950f8248bfSmrg<structfield>val<n>Scale</structfield>) is added to 36960f8248bfSmrg<structfield>v<n>_value</structfield>. 3697e9fcaa8aSmrg </entry> 3698e9fcaa8aSmrg </row> 3699eb411b4bSmrg <row> 37000f8248bfSmrg <entry><symbol>XkbSA_SetValAbsolute</symbol></entry> 3701e9fcaa8aSmrg <entry> 37020f8248bfSmrg<structfield>v<n>_value</structfield> 37030f8248bfSmrgis set to (2 <structfield>val<n>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>-><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>-><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>-><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<<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<<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<<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<<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<<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<<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<<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<<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>-><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->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>-><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