10f8248bfSmrg<?xml version="1.0" encoding="UTF-8" ?>
20f8248bfSmrg<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
30f8248bfSmrg	  "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
4eb411b4bSmrg<chapter id='Keyboard_Controls'>
5e9fcaa8aSmrg<title>Keyboard Controls</title>
6e9fcaa8aSmrg
70f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
80f8248bfSmrg<primary>controls</primary></indexterm>
90f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
100f8248bfSmrg<primary>server controls</primary></indexterm>
110f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
120f8248bfSmrg<primary>controls</primary><secondary>server</secondary></indexterm>
130f8248bfSmrg
14e9fcaa8aSmrg<para>
15e9fcaa8aSmrgThe Xkb extension is composed of two parts: a server extension, and a
16e9fcaa8aSmrgclient-side X library extension. This chapter discusses functions used to
17e9fcaa8aSmrgmodify controls effecting the behavior of the server portion of the Xkb
180f8248bfSmrgextension. <xref linkend="X_Library_Controls" /> discusses functions used to modify controls that affect
19e9fcaa8aSmrgonly the behavior of the client portion of the extension; those controls are
20e9fcaa8aSmrgknown as Library Controls.
21e9fcaa8aSmrg</para>
22e9fcaa8aSmrg
23e9fcaa8aSmrg
24e9fcaa8aSmrg<para>
25e9fcaa8aSmrgXkb contains control features that affect the entire keyboard, known as global
26e9fcaa8aSmrgkeyboard controls. Some of the controls may be selectively enabled and
270f8248bfSmrgdisabled; these controls are known as the
280f8248bfSmrg<firstterm>Boolean Controls</firstterm>.
290f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
300f8248bfSmrg<primary>boolean controls</primary></indexterm>
310f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
320f8248bfSmrg<primary>controls</primary><secondary>boolean</secondary></indexterm>
330f8248bfSmrgBoolean Controls can be turned on or off under program control and can also
34e9fcaa8aSmrgbe automatically set to an on or off condition when a client program exits. The
350f8248bfSmrgremaining controls, known as the
360f8248bfSmrg<firstterm>Non-Boolean Controls</firstterm>,
370f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
380f8248bfSmrg<primary>non-boolean controls</primary></indexterm>
390f8248bfSmrg<indexterm significance="preferred" zone="Keyboard_Controls">
400f8248bfSmrg<primary>controls</primary><secondary>non-boolean</secondary></indexterm>
410f8248bfSmrgare always active. The
420f8248bfSmrg<structname>XkbControlsRec</structname>
430f8248bfSmrgstructure describes the current state of most of the global controls and the
44e9fcaa8aSmrgattributes effecting the behavior of each of these Xkb features. This chapter
45e9fcaa8aSmrgdescribes the Xkb controls and how to manipulate them.
46e9fcaa8aSmrg</para>
47e9fcaa8aSmrg
48e9fcaa8aSmrg
49e9fcaa8aSmrg<para>
50e9fcaa8aSmrgThere are two possible components for each of the Boolean Controls: attributes
51e9fcaa8aSmrgdescribing how the control should work, and a state describing whether the
52e9fcaa8aSmrgbehavior as a whole is enabled or disabled. The attributes and state for most
530f8248bfSmrgof these controls are held in the
540f8248bfSmrg<structname>XkbControlsRec</structname>
550f8248bfSmrgstructure (see <link linkend="The_XkbControlsRec_Structure">section 10.8</link>).
56e9fcaa8aSmrg</para>
57e9fcaa8aSmrg
58e9fcaa8aSmrg
59e9fcaa8aSmrg<para>
60e9fcaa8aSmrgYou can manipulate the Xkb controls individually, via convenience functions, or
610f8248bfSmrgas a whole. To treat them as a group, modify an
620f8248bfSmrg<structname>XkbControlsRec</structname>
630f8248bfSmrgstructure to describe all of the changes to be made, and then pass that
640f8248bfSmrgstructure and appropriate flags to an Xkb library function, or use a
650f8248bfSmrg<structname>XkbControlsChangesRec</structname>
660f8248bfSmrg(see <link linkend="The_XkbControlsChangesRec_Structure">section 10.10.1</link>) to reduce network traffic. When using a convenience
670f8248bfSmrgfunction to manipulate one control individually, you do not use an
680f8248bfSmrg<structname>XkbControlsRec</structname>
690f8248bfSmrgstructure directly.
70e9fcaa8aSmrg</para>
71e9fcaa8aSmrg
72e9fcaa8aSmrg
73e9fcaa8aSmrg<para>
740f8248bfSmrgThe Xkb controls are grouped as shown in
750f8248bfSmrg<link linkend="table10.1">Table 10.1</link>.
76e9fcaa8aSmrg</para>
77e9fcaa8aSmrg
780f8248bfSmrg<table id='table10.1' frame='topbot'>
79e9fcaa8aSmrg<title>Xkb Keyboard Controls</title>
80eb411b4bSmrg<?dbfo keep-together="always" ?>
81eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
82eb411b4bSmrg<colspec colname='c1' colwidth='1.5*'/>
83eb411b4bSmrg<colspec colname='c2' colwidth='1.5*'/>
84eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
85e9fcaa8aSmrg<thead>
86eb411b4bSmrg<row rowsep='1'>
87e9fcaa8aSmrg  <entry>Type of Control</entry>
88e9fcaa8aSmrg  <entry>Control Name</entry>
89e9fcaa8aSmrg  <entry>Boolean Control?</entry>
90e9fcaa8aSmrg  </row>
91e9fcaa8aSmrg</thead>
92e9fcaa8aSmrg<tbody>
93eb411b4bSmrg  <row>
94e9fcaa8aSmrg    <entry>Controls for enabling and disabling other controls</entry>
95e9fcaa8aSmrg    <entry>EnabledControls</entry>
96e9fcaa8aSmrg    <entry>No</entry>
97e9fcaa8aSmrg  </row>
98eb411b4bSmrg  <row>
99e9fcaa8aSmrg    <entry></entry>
100e9fcaa8aSmrg    <entry>AutoReset</entry>
101e9fcaa8aSmrg    <entry>No</entry>
102e9fcaa8aSmrg  </row>
103eb411b4bSmrg  <row>
104e9fcaa8aSmrg    <entry>Control for bell behavior</entry>
105e9fcaa8aSmrg    <entry>AudibleBell</entry>
106e9fcaa8aSmrg    <entry>Boolean</entry>
107e9fcaa8aSmrg  </row>
108eb411b4bSmrg  <row>
109e9fcaa8aSmrg    <entry>Controls for repeat key behavior</entry>
110e9fcaa8aSmrg    <entry>PerKeyRepeat</entry>
111e9fcaa8aSmrg    <entry>No</entry>
112e9fcaa8aSmrg  </row>
113eb411b4bSmrg  <row>
114e9fcaa8aSmrg    <entry></entry>
115e9fcaa8aSmrg    <entry>RepeatKeys</entry>
116e9fcaa8aSmrg    <entry>Boolean</entry>
117e9fcaa8aSmrg  </row>
118eb411b4bSmrg  <row>
119e9fcaa8aSmrg    <entry></entry>
120e9fcaa8aSmrg    <entry>DetectableAutorepeat</entry>
121e9fcaa8aSmrg    <entry>Boolean</entry>
122e9fcaa8aSmrg  </row>
123eb411b4bSmrg  <row>
124e9fcaa8aSmrg    <entry>Controls for keyboard overlays</entry>
125e9fcaa8aSmrg    <entry>Overlay1</entry>
126e9fcaa8aSmrg    <entry>Boolean</entry>
127e9fcaa8aSmrg  </row>
128eb411b4bSmrg  <row>
129e9fcaa8aSmrg    <entry></entry>
130e9fcaa8aSmrg    <entry>Overlay2</entry>
131e9fcaa8aSmrg    <entry>Boolean</entry>
132e9fcaa8aSmrg  </row>
133eb411b4bSmrg  <row>
134e9fcaa8aSmrg    <entry>Controls for using the mouse from the keyboard</entry>
135e9fcaa8aSmrg    <entry>MouseKeys</entry>
136e9fcaa8aSmrg    <entry>Boolean</entry>
137e9fcaa8aSmrg  </row>
138eb411b4bSmrg  <row>
139e9fcaa8aSmrg    <entry></entry>
140e9fcaa8aSmrg    <entry>MouseKeysAccel</entry>
141e9fcaa8aSmrg    <entry>Boolean</entry>
142e9fcaa8aSmrg  </row>
143eb411b4bSmrg  <row>
144e9fcaa8aSmrg    <entry>Controls for better keyboard access by </entry>
145e9fcaa8aSmrg    <entry>AccessXFeedback</entry>
146e9fcaa8aSmrg    <entry>Boolean</entry>
147e9fcaa8aSmrg  </row>
148eb411b4bSmrg  <row>
149e9fcaa8aSmrg    <entry>physically impaired persons</entry>
150e9fcaa8aSmrg    <entry>AccessXKeys</entry>
151e9fcaa8aSmrg    <entry>Boolean</entry>
152e9fcaa8aSmrg  </row>
153eb411b4bSmrg  <row>
154e9fcaa8aSmrg    <entry></entry>
155e9fcaa8aSmrg    <entry>AccessXTimeout</entry>
156e9fcaa8aSmrg    <entry>Boolean</entry>
157e9fcaa8aSmrg  </row>
158eb411b4bSmrg  <row>
159e9fcaa8aSmrg    <entry></entry>
160e9fcaa8aSmrg    <entry>BounceKeys</entry>
161e9fcaa8aSmrg    <entry>Boolean</entry>
162e9fcaa8aSmrg  </row>
163eb411b4bSmrg  <row>
164e9fcaa8aSmrg    <entry></entry>
165e9fcaa8aSmrg    <entry>SlowKeys</entry>
166e9fcaa8aSmrg    <entry>Boolean</entry>
167e9fcaa8aSmrg  </row>
168eb411b4bSmrg  <row>
169e9fcaa8aSmrg    <entry></entry>
170e9fcaa8aSmrg    <entry>StickyKeys</entry>
171e9fcaa8aSmrg    <entry>Boolean</entry>
172e9fcaa8aSmrg  </row>
173eb411b4bSmrg  <row>
174e9fcaa8aSmrg    <entry>Controls for general keyboard mapping</entry>
175e9fcaa8aSmrg    <entry>GroupsWrap</entry>
176e9fcaa8aSmrg    <entry>No</entry>
177e9fcaa8aSmrg  </row>
178eb411b4bSmrg  <row>
179e9fcaa8aSmrg    <entry></entry>
180e9fcaa8aSmrg    <entry>IgnoreGroupLock</entry>
181e9fcaa8aSmrg    <entry>Boolean</entry>
182e9fcaa8aSmrg  </row>
183eb411b4bSmrg  <row>
184e9fcaa8aSmrg    <entry></entry>
185e9fcaa8aSmrg    <entry>IgnoreLockMods</entry>
186e9fcaa8aSmrg    <entry>No</entry>
187e9fcaa8aSmrg  </row>
188eb411b4bSmrg  <row>
189e9fcaa8aSmrg    <entry></entry>
190e9fcaa8aSmrg    <entry>InternalMods</entry>
191e9fcaa8aSmrg    <entry>No</entry>
192e9fcaa8aSmrg  </row>
193eb411b4bSmrg  <row>
194e9fcaa8aSmrg    <entry>Miscellaneous per-client controls</entry>
195e9fcaa8aSmrg    <entry>GrabsUseXKBState</entry>
196e9fcaa8aSmrg    <entry>Boolean</entry>
197e9fcaa8aSmrg  </row>
198eb411b4bSmrg  <row>
199e9fcaa8aSmrg    <entry></entry>
200e9fcaa8aSmrg    <entry>LookupStateWhenGrabbed</entry>
201e9fcaa8aSmrg    <entry>Boolean</entry>
202e9fcaa8aSmrg  </row>
203eb411b4bSmrg  <row>
204e9fcaa8aSmrg    <entry></entry>
205e9fcaa8aSmrg    <entry>SendEventUsesXKBState</entry>
206e9fcaa8aSmrg    <entry>Boolean</entry>
207e9fcaa8aSmrg  </row>
208e9fcaa8aSmrg</tbody>
209e9fcaa8aSmrg</tgroup>
210e9fcaa8aSmrg</table>
211e9fcaa8aSmrg
212e9fcaa8aSmrg<para>
213e9fcaa8aSmrgThe individual categories and controls are described first, together with
2140f8248bfSmrgfunctions for manipulating them. A description of the
2150f8248bfSmrg<structname>XkbControlsRec</structname>
2160f8248bfSmrgstructure and the general functions for dealing with all of the controls at
217e9fcaa8aSmrgonce follow at the end of the chapter.
218e9fcaa8aSmrg</para>
219e9fcaa8aSmrg
220eb411b4bSmrg<sect1 id='Controls_that_Enable_and_Disable_Other_Controls'>
221e9fcaa8aSmrg<title>Controls that Enable and Disable Other Controls</title>
222e9fcaa8aSmrg
223e9fcaa8aSmrg<para>
224e9fcaa8aSmrgEnable and disable the boolean controls under program control by using the
2250f8248bfSmrg<emphasis>EnabledControls</emphasis>
2260f8248bfSmrgcontrol; enable and disable them upon program exit by configuring the
2270f8248bfSmrg<emphasis>AutoReset</emphasis>
2280f8248bfSmrgcontrol.
229e9fcaa8aSmrg</para>
230e9fcaa8aSmrg
231e9fcaa8aSmrg
232eb411b4bSmrg<sect2 id='The_EnabledControls_Control'>
233e9fcaa8aSmrg<title>The EnabledControls Control</title>
234e9fcaa8aSmrg
235e9fcaa8aSmrg<para>
2360f8248bfSmrgThe
2370f8248bfSmrg<emphasis>EnabledControls</emphasis>
2380f8248bfSmrgcontrol is a bit mask where each bit that is turned on means the corresponding
239e9fcaa8aSmrgcontrol is enabled, and when turned off, disabled. It corresponds to the
2400f8248bfSmrg<structfield>enabled_ctrls</structfield>
2410f8248bfSmrgfield of an
2420f8248bfSmrg<structname>XkbControlsRec</structname>
2430f8248bfSmrgstructure (see <link linkend="The_XkbControlsRec_Structure">section 10.8</link>). The bits describing which controls are turned on
2440f8248bfSmrgor off are defined in <link linkend="table10.7">Table 10.7</link>.
2450f8248bfSmrg</para>
2460f8248bfSmrg
2470f8248bfSmrg
2480f8248bfSmrg<para>
2490f8248bfSmrgUse
2500f8248bfSmrg<function>XkbChangeEnabledControls</function>
2510f8248bfSmrgto manipulate the
2520f8248bfSmrg<emphasis>EnabledControls</emphasis>
2530f8248bfSmrgcontrol.
2540f8248bfSmrg</para>
2550f8248bfSmrg
2560f8248bfSmrg<indexterm significance="preferred" zone="XkbChangeEnabledControls"><primary><function>XkbChangeEnabledControls</function></primary></indexterm>
2570f8248bfSmrg<funcsynopsis id="XkbChangeEnabledControls">
2580f8248bfSmrg  <funcprototype>
2590f8248bfSmrg    <funcdef>Bool <function>XkbChangeEnabledControls</function></funcdef>
2600f8248bfSmrg<!-- (
2610f8248bfSmrg<parameter>dpy</parameter>,
2620f8248bfSmrg<parameter>device_spec</parameter>,
2630f8248bfSmrg<parameter>mask</parameter>,
2640f8248bfSmrg<parameter>values</parameter>
2650f8248bfSmrg) -->
2660f8248bfSmrg
2670f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
2680f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
2690f8248bfSmrg    <paramdef>unsigned int <parameter>mask</parameter></paramdef>
2700f8248bfSmrg    <paramdef>unsigned int <parameter>values</parameter></paramdef>
2710f8248bfSmrg  </funcprototype>
2720f8248bfSmrg</funcsynopsis>
2730f8248bfSmrg<variablelist>
2740f8248bfSmrg  <varlistentry>
2750f8248bfSmrg    <term>
2760f8248bfSmrg      <parameter>dpy</parameter>
2770f8248bfSmrg    </term>
2780f8248bfSmrg    <listitem>
2790f8248bfSmrg      <para>
2800f8248bfSmrg        connection to X server
2810f8248bfSmrg      </para>
2820f8248bfSmrg    </listitem>
2830f8248bfSmrg  </varlistentry>
2840f8248bfSmrg  <varlistentry>
2850f8248bfSmrg    <term>
2860f8248bfSmrg      <parameter>device_spec</parameter>
2870f8248bfSmrg    </term>
2880f8248bfSmrg    <listitem>
2890f8248bfSmrg      <para>
2900f8248bfSmrg        keyboard device to modify
2910f8248bfSmrg      </para>
2920f8248bfSmrg    </listitem>
2930f8248bfSmrg  </varlistentry>
2940f8248bfSmrg  <varlistentry>
2950f8248bfSmrg    <term>
2960f8248bfSmrg      <parameter>mask</parameter>
2970f8248bfSmrg    </term>
2980f8248bfSmrg    <listitem>
2990f8248bfSmrg      <para>
3000f8248bfSmrg        1 bit &rarr; controls to enable / disable
3010f8248bfSmrg      </para>
3020f8248bfSmrg    </listitem>
3030f8248bfSmrg  </varlistentry>
3040f8248bfSmrg  <varlistentry>
3050f8248bfSmrg    <term>
3060f8248bfSmrg      <parameter>values</parameter>
3070f8248bfSmrg    </term>
3080f8248bfSmrg    <listitem>
3090f8248bfSmrg      <para>
3100f8248bfSmrg        1 bit &rArr; enable, 0 bit &rArr; disable
3110f8248bfSmrg      </para>
3120f8248bfSmrg    </listitem>
3130f8248bfSmrg  </varlistentry>
3140f8248bfSmrg</variablelist>
3150f8248bfSmrg
3160f8248bfSmrg<para>
3170f8248bfSmrgThe
3180f8248bfSmrg<parameter>mask</parameter>
3190f8248bfSmrgparameter specifies the boolean controls to be enabled or disabled, and the
3200f8248bfSmrg<parameter>values</parameter>
3210f8248bfSmrgmask specifies the new state for those controls. Valid values for both of
322e9fcaa8aSmrgthese masks are composed of a bitwise inclusive OR of bits taken from the set
3230f8248bfSmrgof mask bits in <link linkend="table10.7">Table 10.7</link>,
3240f8248bfSmrgusing only those masks with <quote>ok</quote> in the
3250f8248bfSmrg<structfield>enabled_ctrls</structfield>
3260f8248bfSmrgcolumn.
327e9fcaa8aSmrg</para>
328e9fcaa8aSmrg
329e9fcaa8aSmrg
330e9fcaa8aSmrg<para>
331e9fcaa8aSmrgIf the X server does not support a compatible version of Xkb or the Xkb
3320f8248bfSmrgextension has not been properly initialized,
3330f8248bfSmrg<function>XkbChangeEnabledControls</function>
3340f8248bfSmrgreturns
3350f8248bfSmrg<symbol>False</symbol>;
3360f8248bfSmrgotherwise, it sends the request to the X server and returns
3370f8248bfSmrg<symbol>True</symbol>.
338e9fcaa8aSmrg</para>
339e9fcaa8aSmrg
340e9fcaa8aSmrg
341e9fcaa8aSmrg<para>
3420f8248bfSmrgNote that the
3430f8248bfSmrg<emphasis>EnabledControls</emphasis>
3440f8248bfSmrgcontrol only enables and disables controls; it does not configure them. Some
3450f8248bfSmrgcontrols, such as the
3460f8248bfSmrg<emphasis>AudibleBell</emphasis>
3470f8248bfSmrgcontrol, have no configuration attributes and are therefore manipulated solely
348e9fcaa8aSmrgby enabling and disabling them. Others, however, have additional attributes to
3490f8248bfSmrgconfigure their behavior. For example, the
3500f8248bfSmrg<emphasis>RepeatControl</emphasis>
3510f8248bfSmrgcontrol uses
3520f8248bfSmrg<structfield>repeat_delay</structfield>
3530f8248bfSmrgand
3540f8248bfSmrg<structfield>repeat_interval</structfield>
3550f8248bfSmrgfields to describe the timing behavior of keys that repeat. The
3560f8248bfSmrg<emphasis>RepeatControl</emphasis>
3570f8248bfSmrgbehavior is turned on or off depending on the value of the
3580f8248bfSmrg<symbol>XkbRepeatKeysMask</symbol>
3590f8248bfSmrgbit, but you must use other means, as described in this chapter, to configure
360e9fcaa8aSmrgits behavior in detail.
361e9fcaa8aSmrg</para>
362e9fcaa8aSmrg
363e9fcaa8aSmrg
364e9fcaa8aSmrg</sect2>
365eb411b4bSmrg<sect2 id='The_AutoReset_Control'>
366e9fcaa8aSmrg<title>The AutoReset Control</title>
367e9fcaa8aSmrg
368e9fcaa8aSmrg<para>
369e9fcaa8aSmrgYou can configure the boolean controls to automatically be enabled or disabled
370e9fcaa8aSmrgwhen a program exits. This capability is controlled via two masks maintained in
371e9fcaa8aSmrgthe X server on a per-client basis. There is no client-side Xkb data structure
372e9fcaa8aSmrgcorresponding to these masks. Whenever the client exits for any reason, any
3730f8248bfSmrgboolean controls specified in the
3740f8248bfSmrg<firstterm>auto-reset mask</firstterm>
3750f8248bfSmrg<indexterm significance="preferred" zone="The_AutoReset_Control">
3760f8248bfSmrg<primary>auto-reset mask</primary></indexterm>
3770f8248bfSmrg<indexterm significance="preferred" zone="The_AutoReset_Control">
3780f8248bfSmrg<primary>mask</primary><secondary>auto-reset</secondary></indexterm>
3790f8248bfSmrgare set to the corresponding value from the
3800f8248bfSmrg<firstterm>auto-reset values</firstterm>
3810f8248bfSmrgmask. This makes it possible for clients to "clean up after themselves"
382e9fcaa8aSmrgautomatically, even if abnormally terminated. The bits used in the masks
3830f8248bfSmrgcorrespond to the
3840f8248bfSmrg<emphasis>EnabledControls</emphasis>
3850f8248bfSmrgcontrol bits.
386e9fcaa8aSmrg</para>
387e9fcaa8aSmrg
388e9fcaa8aSmrg
389e9fcaa8aSmrg<para>
390e9fcaa8aSmrgFor example, a client that replaces the keyboard bell with some other audible
3910f8248bfSmrgcue might want to turn off the
3920f8248bfSmrg<emphasis>AudibleBell</emphasis>
3930f8248bfSmrgcontrol to prevent the server from also generating a sound and avoid
3940f8248bfSmrgcacophony. If the client were to exit without resetting the
3950f8248bfSmrg<emphasis>AudibleBell</emphasis>
3960f8248bfSmrgcontrol, the user would be left without any feedback at all. Setting
3970f8248bfSmrg<emphasis>AudibleBell</emphasis>
3980f8248bfSmrgin both the auto-reset mask and auto-reset values guarantees that the audible
399e9fcaa8aSmrgbell will be turned back on when the client exits.
400e9fcaa8aSmrg</para>
401e9fcaa8aSmrg
402e9fcaa8aSmrg
403e9fcaa8aSmrg<para>
4040f8248bfSmrgTo get the current values of the auto-reset controls, use
4050f8248bfSmrg<function>XkbGetAutoResetControls</function>.
4060f8248bfSmrg</para>
4070f8248bfSmrg
4080f8248bfSmrg<indexterm significance="preferred" zone="XkbGetAutoResetControls"><primary><function>XkbGetAutoResetControls</function></primary></indexterm>
4090f8248bfSmrg<funcsynopsis id="XkbGetAutoResetControls">
4100f8248bfSmrg  <funcprototype>
4110f8248bfSmrg    <funcdef>Bool <function>XkbGetAutoResetControls</function></funcdef>
4120f8248bfSmrg<!-- (
4130f8248bfSmrg<parameter>dpy</parameter>,
4140f8248bfSmrg<parameter>auto_ctrls</parameter>,
4150f8248bfSmrg<parameter>auto_values</parameter>
4160f8248bfSmrg) -->
4170f8248bfSmrg
4180f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
4190f8248bfSmrg    <paramdef>unsigned int *<parameter>auto_ctrls</parameter></paramdef>
4200f8248bfSmrg    <paramdef>unsigned int *<parameter>auto_values</parameter></paramdef>
4210f8248bfSmrg  </funcprototype>
4220f8248bfSmrg</funcsynopsis>
4230f8248bfSmrg<variablelist>
4240f8248bfSmrg  <varlistentry>
4250f8248bfSmrg    <term>
4260f8248bfSmrg      <parameter>dpy</parameter>
4270f8248bfSmrg    </term>
4280f8248bfSmrg    <listitem>
4290f8248bfSmrg      <para>
4300f8248bfSmrg        connection to X server
4310f8248bfSmrg      </para>
4320f8248bfSmrg    </listitem>
4330f8248bfSmrg  </varlistentry>
4340f8248bfSmrg  <varlistentry>
4350f8248bfSmrg    <term>
4360f8248bfSmrg      <parameter>auto_ctrls</parameter>
4370f8248bfSmrg    </term>
4380f8248bfSmrg    <listitem>
4390f8248bfSmrg      <para>
4400f8248bfSmrg        specifies which bits in <parameter>auto_values</parameter> are relevant
4410f8248bfSmrg      </para>
4420f8248bfSmrg    </listitem>
4430f8248bfSmrg  </varlistentry>
4440f8248bfSmrg  <varlistentry>
4450f8248bfSmrg    <term>
4460f8248bfSmrg      <parameter>auto_values</parameter>
4470f8248bfSmrg    </term>
4480f8248bfSmrg    <listitem>
4490f8248bfSmrg      <para>
4500f8248bfSmrg        1 bit &rArr; corresponding control has auto-reset on
4510f8248bfSmrg      </para>
4520f8248bfSmrg    </listitem>
4530f8248bfSmrg  </varlistentry>
4540f8248bfSmrg</variablelist>
4550f8248bfSmrg
4560f8248bfSmrg<para>
4570f8248bfSmrg<function>XkbGetAutoResetControls</function>
4580f8248bfSmrgbackfills
4590f8248bfSmrg<parameter>auto_ctrls</parameter>
4600f8248bfSmrgand
4610f8248bfSmrg<parameter>auto_values</parameter>
4620f8248bfSmrgwith the
4630f8248bfSmrg<emphasis>AutoReset</emphasis>
4640f8248bfSmrgcontrol attributes for this particular client. It returns
4650f8248bfSmrg<symbol>True</symbol>
4660f8248bfSmrgif successful, and
4670f8248bfSmrg<symbol>False</symbol>
4680f8248bfSmrgotherwise.
4690f8248bfSmrg</para>
4700f8248bfSmrg
4710f8248bfSmrg
4720f8248bfSmrg<para>
4730f8248bfSmrgTo change the current values of the
4740f8248bfSmrg<emphasis>AutoReset</emphasis>
4750f8248bfSmrgcontrol attributes, use
4760f8248bfSmrg<function>XkbSetAutoResetControls</function>.
4770f8248bfSmrg</para>
4780f8248bfSmrg
4790f8248bfSmrg
4800f8248bfSmrg<indexterm significance="preferred" zone="XkbSetAutoResetControls"><primary><function>XkbSetAutoResetControls</function></primary></indexterm>
4810f8248bfSmrg<funcsynopsis id="XkbSetAutoResetControls">
4820f8248bfSmrg  <funcprototype>
4830f8248bfSmrg    <funcdef>Bool <function>XkbSetAutoResetControls</function></funcdef>
4840f8248bfSmrg<!-- (
4850f8248bfSmrg<parameter>dpy</parameter>,
4860f8248bfSmrg<parameter>changes</parameter>,
4870f8248bfSmrg<parameter>auto_ctrls</parameter>,
4880f8248bfSmrg<parameter>auto_values</parameter>
4890f8248bfSmrg) -->
4900f8248bfSmrg
4910f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
4920f8248bfSmrg    <paramdef>unsigned int <parameter>changes</parameter></paramdef>
4930f8248bfSmrg    <paramdef>unsigned int *<parameter>auto_ctrls</parameter></paramdef>
4940f8248bfSmrg    <paramdef>unsigned int *<parameter>auto_values</parameter></paramdef>
4950f8248bfSmrg  </funcprototype>
4960f8248bfSmrg</funcsynopsis>
4970f8248bfSmrg<variablelist>
4980f8248bfSmrg  <varlistentry>
4990f8248bfSmrg    <term>
5000f8248bfSmrg      <parameter>dpy</parameter>
5010f8248bfSmrg    </term>
5020f8248bfSmrg    <listitem>
5030f8248bfSmrg      <para>
5040f8248bfSmrg        connection to X server
5050f8248bfSmrg      </para>
5060f8248bfSmrg    </listitem>
5070f8248bfSmrg  </varlistentry>
5080f8248bfSmrg  <varlistentry>
5090f8248bfSmrg    <term>
5100f8248bfSmrg      <parameter>changes</parameter>
5110f8248bfSmrg    </term>
5120f8248bfSmrg    <listitem>
5130f8248bfSmrg      <para>
5140f8248bfSmrg        controls for which to change auto-reset values
5150f8248bfSmrg      </para>
5160f8248bfSmrg    </listitem>
5170f8248bfSmrg  </varlistentry>
5180f8248bfSmrg  <varlistentry>
5190f8248bfSmrg    <term>
5200f8248bfSmrg      <parameter>auto_ctrls</parameter>
5210f8248bfSmrg    </term>
5220f8248bfSmrg    <listitem>
5230f8248bfSmrg      <para>
5240f8248bfSmrg        controls from changes that should auto reset
5250f8248bfSmrg      </para>
5260f8248bfSmrg    </listitem>
5270f8248bfSmrg  </varlistentry>
5280f8248bfSmrg  <varlistentry>
5290f8248bfSmrg    <term>
5300f8248bfSmrg      <parameter>auto_values</parameter>
5310f8248bfSmrg    </term>
5320f8248bfSmrg    <listitem>
5330f8248bfSmrg      <para>
5340f8248bfSmrg        1 bit &rArr; auto-reset on
5350f8248bfSmrg      </para>
5360f8248bfSmrg    </listitem>
5370f8248bfSmrg  </varlistentry>
5380f8248bfSmrg</variablelist>
5390f8248bfSmrg
5400f8248bfSmrg<para>
5410f8248bfSmrg<function>XkbSetAutoResetControls</function>
5420f8248bfSmrgchanges the auto-reset status and associated auto-reset
5430f8248bfSmrgvalues for the controls selected by
5440f8248bfSmrg<parameter>changes</parameter>.
5450f8248bfSmrgFor any control selected by
5460f8248bfSmrg<parameter>changes</parameter>,
5470f8248bfSmrgif the corresponding bit is set in
5480f8248bfSmrg<parameter>auto_ctrls</parameter>,
5490f8248bfSmrgthe control is configured to auto-reset when the client exits. If the
5500f8248bfSmrgcorresponding bit in
5510f8248bfSmrg<parameter>auto_values</parameter>
5520f8248bfSmrgis on, the control is turned on when the client exits;
5530f8248bfSmrgif zero, the control is turned off when the client exits.
5540f8248bfSmrgFor any control selected by
5550f8248bfSmrg<parameter>changes</parameter>,
5560f8248bfSmrgif the corresponding bit is not set in
5570f8248bfSmrg<parameter>auto_ctrls</parameter>,
5580f8248bfSmrgthe control is configured to not reset when the client exits. For example:
5590f8248bfSmrg</para>
5600f8248bfSmrg
5610f8248bfSmrg
5620f8248bfSmrg<para>
5630f8248bfSmrgTo leave the auto-reset controls for
5640f8248bfSmrg<emphasis>StickyKeys</emphasis>
5650f8248bfSmrgthe way they are:
566e9fcaa8aSmrg
5670f8248bfSmrg<programlisting>
5680f8248bfSmrg    ok = XkbSetAutoResetControls(dpy, 0, 0, 0);
569e9fcaa8aSmrg</programlisting></para>
570e9fcaa8aSmrg
571e9fcaa8aSmrg<para>
5720f8248bfSmrgTo change the auto-reset controls so that
5730f8248bfSmrg<emphasis>StickyKeys</emphasis>
5740f8248bfSmrgare unaffected when the client exits:
575e9fcaa8aSmrg
5760f8248bfSmrg<programlisting>
5770f8248bfSmrg    ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, 0, 0);
578e9fcaa8aSmrg</programlisting></para>
579e9fcaa8aSmrg
580e9fcaa8aSmrg<para>
5810f8248bfSmrgTo change the auto-reset controls so that
5820f8248bfSmrg<emphasis>StickyKeys</emphasis>
5830f8248bfSmrgare turned off when the client exits:
584e9fcaa8aSmrg
5850f8248bfSmrg<programlisting>
5860f8248bfSmrg    ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, XkbStickyKeysMask, 0);
587e9fcaa8aSmrg</programlisting></para>
588e9fcaa8aSmrg
589e9fcaa8aSmrg<para>
5900f8248bfSmrgTo change the auto-reset controls so that
5910f8248bfSmrg<emphasis>StickyKeys</emphasis>
5920f8248bfSmrgare turned on when the client exits:
593e9fcaa8aSmrg
5940f8248bfSmrg<programlisting>
5950f8248bfSmrg    ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, XkbStickyKeysMask,
5960f8248bfSmrg                                 XkbStickyKeysMask);
597e9fcaa8aSmrg</programlisting></para>
598e9fcaa8aSmrg
599e9fcaa8aSmrg<para>
6000f8248bfSmrg<function>XkbSetAutoResetControls</function>
6010f8248bfSmrgbackfills
6020f8248bfSmrg<parameter>auto_ctrls</parameter>
6030f8248bfSmrgand
6040f8248bfSmrg<parameter>auto_values</parameter>
6050f8248bfSmrgwith the auto-reset controls for this particular client. Note that all of the
606e9fcaa8aSmrgbits are valid in the returned values, not just the ones selected in the
6070f8248bfSmrg<parameter>changes</parameter>
6080f8248bfSmrgmask.
609e9fcaa8aSmrg</para>
610e9fcaa8aSmrg
611e9fcaa8aSmrg
612e9fcaa8aSmrg</sect2>
613e9fcaa8aSmrg</sect1>
614eb411b4bSmrg<sect1 id='Control_for_Bell_Behavior'>
615e9fcaa8aSmrg<title>Control for Bell Behavior</title>
616e9fcaa8aSmrg
617e9fcaa8aSmrg<para>
6180f8248bfSmrgThe X server’s generation of sounds is controlled by the
6190f8248bfSmrg<emphasis>AudibleBell</emphasis>
6200f8248bfSmrgcontrol. Configuration of different bell sounds is discussed in <xref linkend="Bells" />.
621e9fcaa8aSmrg</para>
622e9fcaa8aSmrg
623e9fcaa8aSmrg
624eb411b4bSmrg<sect2 id='The_AudibleBell_Control'>
625e9fcaa8aSmrg<title>The AudibleBell Control</title>
626e9fcaa8aSmrg
627e9fcaa8aSmrg<para>
6280f8248bfSmrgThe
6290f8248bfSmrg<emphasis>AudibleBell</emphasis>
6300f8248bfSmrgcontrol is a boolean control that has no attributes. As such, you may enable
6310f8248bfSmrgand disable it using either the
6320f8248bfSmrg<emphasis>EnabledControls</emphasis>
6330f8248bfSmrgcontrol or the
6340f8248bfSmrg<emphasis>AutoReset</emphasis>
6350f8248bfSmrgcontrol discussed in <link linkend="The_EnabledControls_Control">section 10.1.1</link>. When enabled, protocol requests to
636e9fcaa8aSmrggenerate a sound result in the X server actually producing a real sound; when
637e9fcaa8aSmrgdisabled, requests to the server to generate a sound are ignored unless the
6380f8248bfSmrgsound is forced. See <link linkend="Audible_Bells">section 9.2</link>.
639e9fcaa8aSmrg</para>
640e9fcaa8aSmrg
641e9fcaa8aSmrg
642e9fcaa8aSmrg</sect2>
643e9fcaa8aSmrg</sect1>
644eb411b4bSmrg<sect1 id='Controls_for_Repeat_Key_Behavior'>
645e9fcaa8aSmrg<title>Controls for Repeat Key Behavior</title>
646e9fcaa8aSmrg
6470f8248bfSmrg<indexterm significance="preferred" zone="Controls_for_Repeat_Key_Behavior">
6480f8248bfSmrg<primary>auto-repeat</primary><secondary>controls</secondary></indexterm>
6490f8248bfSmrg
650e9fcaa8aSmrg<para>
651e9fcaa8aSmrgThe repeating behavior of keyboard keys is governed by three controls, the
6520f8248bfSmrg<emphasis>PerKeyRepeat</emphasis>
6530f8248bfSmrgcontrol, which is always active, and the
6540f8248bfSmrg<emphasis>RepeatKeys</emphasis>
6550f8248bfSmrgand
6560f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
6570f8248bfSmrgcontrols, which are boolean controls that may be enabled and disabled.
6580f8248bfSmrg<emphasis>PerKeyRepeat</emphasis>
6590f8248bfSmrgdetermines which keys are allowed to repeat.
6600f8248bfSmrg<emphasis>RepeatKeys</emphasis>
6610f8248bfSmrggoverns the behavior of an individual key when it is repeating.
6620f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
6630f8248bfSmrgallows a client to detect when a key is repeating as a result of being held
664e9fcaa8aSmrgdown.
665e9fcaa8aSmrg</para>
666e9fcaa8aSmrg
667e9fcaa8aSmrg
668eb411b4bSmrg<sect2 id='The_PerKeyRepeat_Control'>
669e9fcaa8aSmrg<title>The PerKeyRepeat Control</title>
670e9fcaa8aSmrg
671e9fcaa8aSmrg<para>
6720f8248bfSmrgThe
6730f8248bfSmrg<emphasis>PerKeyRepeat</emphasis>
6740f8248bfSmrgcontrol is a bitmask long enough to contain a bit for each key on the device;
6750f8248bfSmrgit determines which individual keys are allowed to repeat. The Xkb
6760f8248bfSmrg<emphasis>PerKeyRepeat</emphasis>
6770f8248bfSmrgcontrol provides no functionality different from that available via the core X
678e9fcaa8aSmrgprotocol. There are no convenience functions in Xkb for manipulating this
6790f8248bfSmrgcontrol. The
6800f8248bfSmrg<emphasis>PerKeyRepeat</emphasis>
6810f8248bfSmrgcontrol settings are carried in the
6820f8248bfSmrg<structfield>per_key_repeat</structfield>
6830f8248bfSmrgfield of an
6840f8248bfSmrg<structname>XkbControlsRec</structname>
6850f8248bfSmrgstructure, discussed in <link linkend="The_XkbControlsRec_Structure">section 10.8</link>.
686e9fcaa8aSmrg</para>
687e9fcaa8aSmrg
688e9fcaa8aSmrg
689e9fcaa8aSmrg</sect2>
690eb411b4bSmrg<sect2 id='The_RepeatKeys_Control'>
691e9fcaa8aSmrg<title>The RepeatKeys Control</title>
692e9fcaa8aSmrg
693e9fcaa8aSmrg<para>
694e9fcaa8aSmrgThe core protocol allows only control over whether or not the entire keyboard
6950f8248bfSmrgor individual keys should auto-repeat when held down.
6960f8248bfSmrg<emphasis>RepeatKeys</emphasis>
6970f8248bfSmrgis a boolean control that extends this capability by adding control over the
6980f8248bfSmrgdelay until a key begins to repeat and the rate at which it repeats.
6990f8248bfSmrg<emphasis>RepeatKeys</emphasis>
7000f8248bfSmrgis coupled with the core auto-repeat control: when
7010f8248bfSmrg<emphasis>RepeatKeys</emphasis>
7020f8248bfSmrgis enabled or disabled, the core auto-repeat is enabled or disabled and vice
703e9fcaa8aSmrgversa.
704e9fcaa8aSmrg</para>
705e9fcaa8aSmrg
706e9fcaa8aSmrg
707e9fcaa8aSmrg<para>
7080f8248bfSmrgAuto-repeating keys are controlled by two attributes. The first,
7090f8248bfSmrg<firstterm>timeout</firstterm>,
7100f8248bfSmrgis the delay after the initial press of an auto-repeating key and the first
7110f8248bfSmrggenerated repeat event. The second,
7120f8248bfSmrg<firstterm>interval</firstterm>,
7130f8248bfSmrgis the delay between all subsequent generated repeat events. As with all
714e9fcaa8aSmrgboolean controls, configuring the attributes that determine how the control
7150f8248bfSmrgoperates does not automatically enable the control as a whole; see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>.
7160f8248bfSmrg</para>
7170f8248bfSmrg
7180f8248bfSmrg
7190f8248bfSmrg<para>
7200f8248bfSmrgTo get the current attributes of the
7210f8248bfSmrg<emphasis>RepeatKeys</emphasis>
7220f8248bfSmrgcontrol for a keyboard device, use
7230f8248bfSmrg<function>XkbGetAutoRepeatRate</function>.
7240f8248bfSmrg</para>
7250f8248bfSmrg
7260f8248bfSmrg<indexterm significance="preferred" zone="XkbGetAutoRepeatRate"><primary><function>XkbGetAutoRepeatRate</function></primary></indexterm>
7270f8248bfSmrg<funcsynopsis id="XkbGetAutoRepeatRate">
7280f8248bfSmrg  <funcprototype>
7290f8248bfSmrg    <funcdef>Bool <function>XkbGetAutoRepeatRate</function></funcdef>
7300f8248bfSmrg<!-- (
7310f8248bfSmrg<parameter>display, device_spec, timeout_rtrn, interval_rtrn</parameter>
7320f8248bfSmrg) -->
7330f8248bfSmrg
7340f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
7350f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
7360f8248bfSmrg    <paramdef>unsigned int *<parameter>timeout_rtrn</parameter></paramdef>
7370f8248bfSmrg    <paramdef>unsigned int *<parameter>interval_rtrn</parameter></paramdef>
7380f8248bfSmrg  </funcprototype>
7390f8248bfSmrg</funcsynopsis>
7400f8248bfSmrg<variablelist>
7410f8248bfSmrg  <varlistentry>
7420f8248bfSmrg    <term>
7430f8248bfSmrg      <parameter>display</parameter>
7440f8248bfSmrg    </term>
7450f8248bfSmrg    <listitem>
7460f8248bfSmrg      <para>
7470f8248bfSmrg        connection to X server
7480f8248bfSmrg      </para>
7490f8248bfSmrg    </listitem>
7500f8248bfSmrg  </varlistentry>
7510f8248bfSmrg  <varlistentry>
7520f8248bfSmrg    <term>
7530f8248bfSmrg      <parameter>device_spec</parameter>
7540f8248bfSmrg    </term>
7550f8248bfSmrg    <listitem>
7560f8248bfSmrg      <para>
7570f8248bfSmrg        desired device ID, or <symbol>XkbUseCoreKbd</symbol>
7580f8248bfSmrg      </para>
7590f8248bfSmrg    </listitem>
7600f8248bfSmrg  </varlistentry>
7610f8248bfSmrg  <varlistentry>
7620f8248bfSmrg    <term>
7630f8248bfSmrg      <parameter>timeout_rtrn</parameter>
7640f8248bfSmrg    </term>
7650f8248bfSmrg    <listitem>
7660f8248bfSmrg      <para>
7670f8248bfSmrg        backfilled with initial repeat delay, ms
7680f8248bfSmrg      </para>
7690f8248bfSmrg    </listitem>
7700f8248bfSmrg  </varlistentry>
7710f8248bfSmrg  <varlistentry>
7720f8248bfSmrg    <term>
7730f8248bfSmrg      <parameter>interval_rtrn</parameter>
7740f8248bfSmrg    </term>
7750f8248bfSmrg    <listitem>
7760f8248bfSmrg      <para>
7770f8248bfSmrg        backfilled with subsequent repeat delay, ms
7780f8248bfSmrg      </para>
7790f8248bfSmrg    </listitem>
7800f8248bfSmrg  </varlistentry>
7810f8248bfSmrg</variablelist>
7820f8248bfSmrg
7830f8248bfSmrg<para>
7840f8248bfSmrg<function>XkbGetAutoRepeatRate</function>
7850f8248bfSmrgqueries the server for the current values of the
7860f8248bfSmrg<emphasis>RepeatControls</emphasis>
7870f8248bfSmrgcontrol attributes, backfills
7880f8248bfSmrg<parameter>timeout_rtrn</parameter>
7890f8248bfSmrgand
7900f8248bfSmrg<parameter>interval_rtrn</parameter>
7910f8248bfSmrgwith them, and returns
7920f8248bfSmrg<symbol>True</symbol>.
7930f8248bfSmrgIf a compatible version of the Xkb extension is not available in the server
7940f8248bfSmrg<function>XkbGetAutoRepeatRate</function>
7950f8248bfSmrgreturns
7960f8248bfSmrg<symbol>False</symbol>.
797e9fcaa8aSmrg</para>
798e9fcaa8aSmrg
799e9fcaa8aSmrg
800e9fcaa8aSmrg<para>
801e9fcaa8aSmrgTo set the attributes of the RepeatKeys control for a keyboard device, use
8020f8248bfSmrg<function>XkbSetAutoRepeatRate</function>.
8030f8248bfSmrg</para>
8040f8248bfSmrg
8050f8248bfSmrg
8060f8248bfSmrg<indexterm significance="preferred" zone="XkbSetAutoRepeatRate"><primary><function>XkbSetAutoRepeatRate</function></primary></indexterm>
8070f8248bfSmrg<funcsynopsis id="XkbSetAutoRepeatRate">
8080f8248bfSmrg  <funcprototype>
8090f8248bfSmrg    <funcdef>Bool <function>XkbSetAutoRepeatRate</function></funcdef>
8100f8248bfSmrg<!-- (
8110f8248bfSmrg<parameter>display, device_spec, timeout, interval</parameter>
8120f8248bfSmrg) -->
8130f8248bfSmrg
8140f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
8150f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
8160f8248bfSmrg    <paramdef>unsigned int <parameter>timeout</parameter></paramdef>
8170f8248bfSmrg    <paramdef>unsigned int <parameter>interval</parameter></paramdef>
8180f8248bfSmrg  </funcprototype>
8190f8248bfSmrg</funcsynopsis>
8200f8248bfSmrg<variablelist>
8210f8248bfSmrg  <varlistentry>
8220f8248bfSmrg    <term>
8230f8248bfSmrg      <parameter>display</parameter>
8240f8248bfSmrg    </term>
8250f8248bfSmrg    <listitem>
8260f8248bfSmrg      <para>
8270f8248bfSmrg        connection to X server
8280f8248bfSmrg      </para>
8290f8248bfSmrg    </listitem>
8300f8248bfSmrg  </varlistentry>
8310f8248bfSmrg  <varlistentry>
8320f8248bfSmrg    <term>
8330f8248bfSmrg      <parameter>device_spec</parameter>
8340f8248bfSmrg    </term>
8350f8248bfSmrg    <listitem>
8360f8248bfSmrg      <para>
8370f8248bfSmrg        device to configure, or <symbol>XkbUseCoreKbd</symbol>
8380f8248bfSmrg      </para>
8390f8248bfSmrg    </listitem>
8400f8248bfSmrg  </varlistentry>
8410f8248bfSmrg  <varlistentry>
8420f8248bfSmrg    <term>
8430f8248bfSmrg      <parameter>timeout</parameter>
8440f8248bfSmrg    </term>
8450f8248bfSmrg    <listitem>
8460f8248bfSmrg      <para>
8470f8248bfSmrg        initial delay, ms
8480f8248bfSmrg      </para>
8490f8248bfSmrg    </listitem>
8500f8248bfSmrg  </varlistentry>
8510f8248bfSmrg  <varlistentry>
8520f8248bfSmrg    <term>
8530f8248bfSmrg      <parameter>interval</parameter>
8540f8248bfSmrg    </term>
8550f8248bfSmrg    <listitem>
8560f8248bfSmrg      <para>
8570f8248bfSmrg        delay between repeats, ms
8580f8248bfSmrg      </para>
8590f8248bfSmrg    </listitem>
8600f8248bfSmrg  </varlistentry>
8610f8248bfSmrg</variablelist>
8620f8248bfSmrg
8630f8248bfSmrg<para>
8640f8248bfSmrg<function>XkbSetAutoRepeatRate</function>
8650f8248bfSmrgsends a request to the X server to configure the
8660f8248bfSmrg<emphasis>AutoRepeat</emphasis>
8670f8248bfSmrgcontrol attributes to the values specified in
8680f8248bfSmrg<parameter>timeout</parameter>
8690f8248bfSmrgand
8700f8248bfSmrg<parameter>interval</parameter>.
8710f8248bfSmrg</para>
8720f8248bfSmrg
8730f8248bfSmrg
8740f8248bfSmrg<para>
8750f8248bfSmrg<function>XkbSetAutoRepeatRate</function>
8760f8248bfSmrgdoes not wait for a reply; it normally returns
8770f8248bfSmrg<symbol>True</symbol>.
8780f8248bfSmrgSpecifying a zero value for either
8790f8248bfSmrg<parameter>timeout</parameter>
8800f8248bfSmrgor
8810f8248bfSmrg<parameter>interval</parameter>
8820f8248bfSmrgcauses the server to generate a
8830f8248bfSmrg<errorname>BadValue</errorname>
8840f8248bfSmrgprotocol error. If a compatible version of the Xkb extension is not available
8850f8248bfSmrgin the server,
8860f8248bfSmrg<function>XkbSetAutoRepeatRate</function>
8870f8248bfSmrgreturns
8880f8248bfSmrg<symbol>False</symbol>.
889e9fcaa8aSmrg</para>
890e9fcaa8aSmrg
891e9fcaa8aSmrg
892e9fcaa8aSmrg</sect2>
893eb411b4bSmrg<sect2 id='The_DetectableAutorepeat_Control'>
894e9fcaa8aSmrg<title>The DetectableAutorepeat Control</title>
895e9fcaa8aSmrg
896e9fcaa8aSmrg<para>
897e9fcaa8aSmrgAuto-repeat is the generation of multiple key events by a keyboard when the
898e9fcaa8aSmrguser presses a key and holds it down. Keyboard hardware and device-dependent X
8990f8248bfSmrgserver software often implement auto-repeat by generating multiple
9000f8248bfSmrg<symbol>KeyPress</symbol>
9010f8248bfSmrgevents with no intervening
9020f8248bfSmrg<symbol>KeyRelease</symbol>
9030f8248bfSmrgevent. The standard behavior of the X server is to generate a
9040f8248bfSmrg<symbol>KeyRelease</symbol>
9050f8248bfSmrgevent for every
9060f8248bfSmrg<symbol>KeyPress</symbol>
9070f8248bfSmrgevent. If the keyboard hardware and device-dependent software of the X server
9080f8248bfSmrgimplement auto-repeat by generating multiple
9090f8248bfSmrg<symbol>KeyPress</symbol>
9100f8248bfSmrgevents, the device-independent part of the X server by default synthetically
9110f8248bfSmrggenerates a
9120f8248bfSmrg<symbol>KeyRelease</symbol>
9130f8248bfSmrgevent after each
9140f8248bfSmrg<symbol>KeyPress</symbol>
9150f8248bfSmrgevent. This provides predictable behavior for X clients, but does not allow
916e9fcaa8aSmrgthose clients to detect the fact that a key is auto-repeating.
917e9fcaa8aSmrg</para>
918e9fcaa8aSmrg
919e9fcaa8aSmrg
920e9fcaa8aSmrg<para>
9210f8248bfSmrgXkb allows clients to request
9220f8248bfSmrg<firstterm>detectable auto-repeat</firstterm>.
9230f8248bfSmrg<indexterm significance="preferred" zone="The_DetectableAutorepeat_Control">
9240f8248bfSmrg<primary>detectable auto-repeat</primary></indexterm>
9250f8248bfSmrg<indexterm significance="preferred" zone="The_DetectableAutorepeat_Control">
9260f8248bfSmrg<primary>auto-repeat</primary><secondary>detectable</secondary></indexterm>
9270f8248bfSmrgIf a client requests and the server supports
9280f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>,
9290f8248bfSmrgXkb generates
9300f8248bfSmrg<symbol>KeyRelease</symbol>
9310f8248bfSmrgevents only when the key is physically released. If
9320f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
9330f8248bfSmrgis not supported or has not been requested, the server synthesizes a
9340f8248bfSmrg<symbol>KeyRelease</symbol>
9350f8248bfSmrgevent for each repeating
9360f8248bfSmrg<symbol>KeyPress</symbol>
9370f8248bfSmrgevent it generates.
938e9fcaa8aSmrg</para>
939e9fcaa8aSmrg
940e9fcaa8aSmrg
941e9fcaa8aSmrg<para>
9420f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>,
9430f8248bfSmrgunlike the other controls in this chapter, is not contained in the
9440f8248bfSmrg<structname>XkbControlsRec</structname>
9450f8248bfSmrgstructure, nor can it be enabled or disabled via the
9460f8248bfSmrg<emphasis>EnabledControls</emphasis>
9470f8248bfSmrgcontrol. Instead, query and set
9480f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
9490f8248bfSmrgusing
9500f8248bfSmrg<function>XkbGetDetectableAutorepeat</function>
9510f8248bfSmrgand
9520f8248bfSmrg<function>XkbSetDetectableAutorepeat</function>.
953e9fcaa8aSmrg</para>
954e9fcaa8aSmrg
955e9fcaa8aSmrg
956e9fcaa8aSmrg<para>
9570f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
9580f8248bfSmrgis a condition that applies to all keyboard devices for a client’s
959e9fcaa8aSmrgconnection to a given X server; it cannot be selectively set for some devices
960e9fcaa8aSmrgand not for others. For this reason, none of the Xkb library functions
9610f8248bfSmrginvolving
9620f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
9630f8248bfSmrginvolve a device specifier.
9640f8248bfSmrg</para>
9650f8248bfSmrg
9660f8248bfSmrg
9670f8248bfSmrg<para>
9680f8248bfSmrgTo determine whether or not the server supports
9690f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>,
9700f8248bfSmrguse
9710f8248bfSmrg<function>XkbGetDetectableAutorepeat</function>.
9720f8248bfSmrg</para>
9730f8248bfSmrg
9740f8248bfSmrg<indexterm significance="preferred" zone="XkbGetDetectableAutorepeat"><primary><function>XkbGetDetectableAutorepeat</function></primary></indexterm>
9750f8248bfSmrg<funcsynopsis id="XkbGetDetectableAutorepeat">
9760f8248bfSmrg  <funcprototype>
9770f8248bfSmrg    <funcdef>Bool <function>XkbGetDetectableAutorepeat</function></funcdef>
9780f8248bfSmrg<!-- (
9790f8248bfSmrg<parameter>display, supported_rtrn</parameter>
9800f8248bfSmrg) -->
9810f8248bfSmrg
9820f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
9830f8248bfSmrg    <paramdef>Bool *<parameter>supported_rtrn</parameter></paramdef>
9840f8248bfSmrg  </funcprototype>
9850f8248bfSmrg</funcsynopsis>
9860f8248bfSmrg<variablelist>
9870f8248bfSmrg  <varlistentry>
9880f8248bfSmrg    <term>
9890f8248bfSmrg      <parameter>display</parameter>
9900f8248bfSmrg    </term>
9910f8248bfSmrg    <listitem>
9920f8248bfSmrg      <para>
9930f8248bfSmrg        connection to X server
9940f8248bfSmrg      </para>
9950f8248bfSmrg    </listitem>
9960f8248bfSmrg  </varlistentry>
9970f8248bfSmrg  <varlistentry>
9980f8248bfSmrg    <term>
9990f8248bfSmrg      <parameter>supported_rtrn</parameter>
10000f8248bfSmrg    </term>
10010f8248bfSmrg    <listitem>
10020f8248bfSmrg      <para>
10030f8248bfSmrg        backfilled <symbol>True</symbol> if
10040f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
10050f8248bfSmrg         supported
10060f8248bfSmrg      </para>
10070f8248bfSmrg    </listitem>
10080f8248bfSmrg  </varlistentry>
10090f8248bfSmrg</variablelist>
10100f8248bfSmrg
10110f8248bfSmrg<para>
10120f8248bfSmrg<function>XkbGetDetectableAutorepeat</function>
10130f8248bfSmrgqueries the server for the current state of
10140f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
10150f8248bfSmrgand waits for a reply. If
10160f8248bfSmrg<parameter>supported_rtrn</parameter>
10170f8248bfSmrgis not
10180f8248bfSmrg<symbol>NULL</symbol>,
10190f8248bfSmrgit backfills supported_rtrn with
10200f8248bfSmrg<symbol>True</symbol>
10210f8248bfSmrgif the server supports
10220f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>,
10230f8248bfSmrgand
10240f8248bfSmrg<symbol>False</symbol>
10250f8248bfSmrgotherwise.
10260f8248bfSmrg<function>XkbGetDetectableAutorepeat</function>
10270f8248bfSmrgreturns the current state of
10280f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
10290f8248bfSmrgfor the requesting client:
10300f8248bfSmrg<symbol>True</symbol>
10310f8248bfSmrgif
10320f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
10330f8248bfSmrgis set, and
10340f8248bfSmrg<symbol>False</symbol>
10350f8248bfSmrgotherwise.
10360f8248bfSmrg</para>
10370f8248bfSmrg
10380f8248bfSmrg
10390f8248bfSmrg<para>
10400f8248bfSmrgTo set
10410f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>,
10420f8248bfSmrguse
10430f8248bfSmrg<function>XkbSetDetectableAutorepeat</function>.
10440f8248bfSmrgThis request affects all keyboard activity for the requesting client only;
1045e9fcaa8aSmrgother clients still see the expected nondetectable auto-repeat behavior, unless
1046e9fcaa8aSmrgthey have requested otherwise.
1047e9fcaa8aSmrg</para>
1048e9fcaa8aSmrg
1049e9fcaa8aSmrg
10500f8248bfSmrg<indexterm significance="preferred" zone="XkbSetDetectableAutorepeat"><primary><function>XkbSetDetectableAutorepeat</function></primary></indexterm>
10510f8248bfSmrg<funcsynopsis id="XkbSetDetectableAutorepeat">
10520f8248bfSmrg  <funcprototype>
10530f8248bfSmrg    <funcdef>Bool <function>XkbSetDetectableAutorepeat</function></funcdef>
10540f8248bfSmrg<!-- (
10550f8248bfSmrg<parameter>display, detectable, supported_rtrn</parameter>
10560f8248bfSmrg) -->
10570f8248bfSmrg
10580f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
10590f8248bfSmrg    <paramdef>Bool <parameter>detectable</parameter></paramdef>
10600f8248bfSmrg    <paramdef>Bool *<parameter>supported_rtrn</parameter></paramdef>
10610f8248bfSmrg  </funcprototype>
10620f8248bfSmrg</funcsynopsis>
10630f8248bfSmrg<variablelist>
10640f8248bfSmrg  <varlistentry>
10650f8248bfSmrg    <term>
10660f8248bfSmrg      <parameter>display</parameter>
10670f8248bfSmrg    </term>
10680f8248bfSmrg    <listitem>
10690f8248bfSmrg      <para>
10700f8248bfSmrg        connection to X server
10710f8248bfSmrg      </para>
10720f8248bfSmrg    </listitem>
10730f8248bfSmrg  </varlistentry>
10740f8248bfSmrg  <varlistentry>
10750f8248bfSmrg    <term>
10760f8248bfSmrg      <parameter>detectable</parameter>
10770f8248bfSmrg    </term>
10780f8248bfSmrg    <listitem>
10790f8248bfSmrg      <para>
10800f8248bfSmrg        <symbol>True</symbol> &rArr; set
10810f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
10820f8248bfSmrg      </para>
10830f8248bfSmrg    </listitem>
10840f8248bfSmrg  </varlistentry>
10850f8248bfSmrg  <varlistentry>
10860f8248bfSmrg    <term>
10870f8248bfSmrg      <parameter>supported_rtrn</parameter>
10880f8248bfSmrg    </term>
10890f8248bfSmrg    <listitem>
10900f8248bfSmrg      <para>
10910f8248bfSmrg        backfilled <symbol>True</symbol> if
10920f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
10930f8248bfSmrg         supported
10940f8248bfSmrg      </para>
10950f8248bfSmrg    </listitem>
10960f8248bfSmrg  </varlistentry>
10970f8248bfSmrg</variablelist>
10980f8248bfSmrg
10990f8248bfSmrg<para>
11000f8248bfSmrg<function>XkbSetDetectableAutorepeat</function>
11010f8248bfSmrgsends a request to the server to set
11020f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
11030f8248bfSmrgon for the current client if
11040f8248bfSmrg<parameter>detectable</parameter>
11050f8248bfSmrgis
11060f8248bfSmrg<symbol>True</symbol>,
11070f8248bfSmrgand off it
11080f8248bfSmrg<parameter>detectable</parameter>
11090f8248bfSmrgis
11100f8248bfSmrg<symbol>False</symbol>;
11110f8248bfSmrgit then waits for a reply. If
11120f8248bfSmrg<parameter>supported_rtrn</parameter>
11130f8248bfSmrgis not
11140f8248bfSmrg<symbol>NULL</symbol>,
11150f8248bfSmrg<function>XkbSetDetectableAutorepeat</function>
11160f8248bfSmrgbackfills
11170f8248bfSmrg<parameter>supported_rtrn</parameter>
11180f8248bfSmrgwith
11190f8248bfSmrg<symbol>True</symbol>
11200f8248bfSmrgif the server supports
11210f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>,
11220f8248bfSmrgand
11230f8248bfSmrg<symbol>False</symbol>
11240f8248bfSmrgif it does not.
11250f8248bfSmrg<function>XkbSetDetectableAutorepeat</function>
11260f8248bfSmrgreturns the current state of
11270f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
11280f8248bfSmrgfor the requesting client:
11290f8248bfSmrg<symbol>True</symbol>
11300f8248bfSmrgif
11310f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
11320f8248bfSmrgis set, and
11330f8248bfSmrg<symbol>False</symbol>
11340f8248bfSmrgotherwise.
1135e9fcaa8aSmrg</para>
1136e9fcaa8aSmrg
1137e9fcaa8aSmrg
1138e9fcaa8aSmrg</sect2>
1139e9fcaa8aSmrg</sect1>
1140eb411b4bSmrg<sect1 id='Controls_for_Keyboard_Overlays_Overlay1_and_Overlay2_Controls'>
1141e9fcaa8aSmrg<title>Controls for Keyboard Overlays (Overlay1 and Overlay2 Controls)</title>
1142e9fcaa8aSmrg
1143e9fcaa8aSmrg<para>
1144e9fcaa8aSmrgA keyboard overlay allows some subset of the keyboard to report alternate
1145e9fcaa8aSmrgkeycodes when the overlay is enabled. For example, a keyboard overlay can be
1146e9fcaa8aSmrgused to simulate a numeric or editing keypad on a keyboard that does not
1147e9fcaa8aSmrgactually have one by reusing some portion of the keyboard as an overlay. This
1148e9fcaa8aSmrgtechnique is very common on portable computers and embedded systems with small
1149e9fcaa8aSmrgkeyboards.
1150e9fcaa8aSmrg</para>
1151e9fcaa8aSmrg
1152e9fcaa8aSmrg
1153e9fcaa8aSmrg<para>
11540f8248bfSmrgXkb includes direct support for two keyboard overlays, using the
11550f8248bfSmrg<emphasis>Overlay1</emphasis>
11560f8248bfSmrgand
11570f8248bfSmrg<emphasis>Overlay2</emphasis>
11580f8248bfSmrgcontrols. When
11590f8248bfSmrg<emphasis>Overlay1</emphasis>
11600f8248bfSmrgis enabled, all of the keys that are members of the first keyboard overlay
11610f8248bfSmrggenerate an alternate keycode. When
11620f8248bfSmrg<emphasis>Overlay2</emphasis>
11630f8248bfSmrgis enabled, all of the keys that are members of the second keyboard overlay
1164e9fcaa8aSmrggenerate an alternate keycode. The two overlays are mutually exclusive; any
11650f8248bfSmrgparticular key may be in at most one overlay.
11660f8248bfSmrg<emphasis>Overlay1</emphasis>
11670f8248bfSmrgand
11680f8248bfSmrg<emphasis>Overlay2</emphasis>
11690f8248bfSmrgare boolean controls. As such, you may enable and disable them using either
11700f8248bfSmrgthe
11710f8248bfSmrg<emphasis>EnabledControls</emphasis>
11720f8248bfSmrgcontrol or the
11730f8248bfSmrg<emphasis>AutoReset</emphasis>
11740f8248bfSmrgcontrol discussed in <link linkend="The_EnabledControls_Control">section 10.1.1</link>.
1175e9fcaa8aSmrg</para>
1176e9fcaa8aSmrg
1177e9fcaa8aSmrg
1178e9fcaa8aSmrg<para>
1179e9fcaa8aSmrgTo specify the overlay to which a key belongs and the alternate keycode it
11800f8248bfSmrgshould generate when that overlay is enabled, assign it either the
11810f8248bfSmrg<symbol>XkbKB_Overlay1</symbol>
11820f8248bfSmrgor
11830f8248bfSmrg<symbol>XkbKB_Overlay2</symbol>
11840f8248bfSmrgkey behaviors, as described in <link linkend="Key_Behavior">section 16.2</link>.
1185e9fcaa8aSmrg</para>
1186e9fcaa8aSmrg
1187e9fcaa8aSmrg
1188e9fcaa8aSmrg</sect1>
1189eb411b4bSmrg<sect1 id='Controls_for_Using_the_Mouse_from_the_Keyboard'>
1190e9fcaa8aSmrg<title>Controls for Using the Mouse from the Keyboard</title>
1191e9fcaa8aSmrg
1192e9fcaa8aSmrg<para>
1193e9fcaa8aSmrgUsing Xkb, it is possible to configure the keyboard to allow simulation of the
1194e9fcaa8aSmrgX pointer device. This simulation includes both movement of the pointer itself
1195e9fcaa8aSmrgand press and release events associated with the buttons on the pointer. Two
11960f8248bfSmrgcontrols affect this behavior: the
11970f8248bfSmrg<emphasis>MouseKeys</emphasis>
11980f8248bfSmrgcontrol determines whether or not simulation of the pointer device is active,
11990f8248bfSmrgas well as configuring the default button; the
12000f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
12010f8248bfSmrgcontrol determines the movement characteristics of the pointer when simulated
1202e9fcaa8aSmrgvia the keyboard. Both of them are boolean controls; as such, you may enable
12030f8248bfSmrgand disable them using either the
12040f8248bfSmrg<emphasis>EnabledControls</emphasis>
12050f8248bfSmrgcontrol or the
12060f8248bfSmrg<emphasis>AutoReset</emphasis>
12070f8248bfSmrgcontrol discussed in <link linkend="The_EnabledControls_Control">section 10.1.1</link>. The individual keys that simulate
1208e9fcaa8aSmrgdifferent aspects of the pointer device are determined by the keyboard mapping,
12090f8248bfSmrgdiscussed in <xref linkend="Xkb_Server_Keyboard_Mapping" />.
1210e9fcaa8aSmrg</para>
1211e9fcaa8aSmrg
1212e9fcaa8aSmrg
1213eb411b4bSmrg<sect2 id='The_MouseKeys_Control'>
1214e9fcaa8aSmrg<title>The MouseKeys Control</title>
1215e9fcaa8aSmrg
1216e9fcaa8aSmrg<para>
12170f8248bfSmrgThe
12180f8248bfSmrg<emphasis>MouseKeys</emphasis>
12190f8248bfSmrgcontrol allows a user to control all the mouse functions from the keyboard.
12200f8248bfSmrgWhen
12210f8248bfSmrg<emphasis>MouseKeys</emphasis>
12220f8248bfSmrgare enabled, all keys with
12230f8248bfSmrg<emphasis>MouseKeys</emphasis>
12240f8248bfSmrgactions bound to them generate core pointer events instead of normal
12250f8248bfSmrg<symbol>KeyPress</symbol>
12260f8248bfSmrgand
12270f8248bfSmrg<symbol>KeyRelease</symbol>
12280f8248bfSmrgevents.
1229e9fcaa8aSmrg</para>
1230e9fcaa8aSmrg
1231e9fcaa8aSmrg
1232e9fcaa8aSmrg<para>
12330f8248bfSmrgThe
12340f8248bfSmrg<emphasis>MouseKeys</emphasis>
12350f8248bfSmrgcontrol has a single attribute,
12360f8248bfSmrg<structfield>mk_dflt_btn</structfield>
12370f8248bfSmrgthat specifies the core button number to be used by mouse keys actions that do
1238e9fcaa8aSmrgnot explicitly specify a button. There is no convenience function for getting
12390f8248bfSmrgor setting the attribute; instead use
12400f8248bfSmrg<function>XkbGetControls</function>
12410f8248bfSmrgand
12420f8248bfSmrg<function>XkbSetControls</function>
12430f8248bfSmrg(see <link linkend="Querying_Controls">section 10.9</link> and <link linkend="Changing_Controls">section 10.10</link>).
12440f8248bfSmrg</para>
12450f8248bfSmrg
12460f8248bfSmrg<note><para>
12470f8248bfSmrg<emphasis>MouseKeys</emphasis>
12480f8248bfSmrgcan also be turned on and off by pressing the key combination necessary to
12490f8248bfSmrgproduce an
12500f8248bfSmrg<keysym>XK_Pointer_EnableKeys</keysym>
12510f8248bfSmrgkeysym. The de facto default standard for this is
12520f8248bfSmrg<keycombo><keycap>Shift</keycap><keycap>Alt</keycap><keycap>NumLock</keycap></keycombo>,
12530f8248bfSmrgbut this may vary depending on the keymap.</para></note>
1254e9fcaa8aSmrg
1255e9fcaa8aSmrg</sect2>
1256eb411b4bSmrg<sect2 id='The_MouseKeysAccel_Control'>
1257e9fcaa8aSmrg<title>The MouseKeysAccel Control</title>
1258e9fcaa8aSmrg
1259e9fcaa8aSmrg<para>
12600f8248bfSmrgWhen the
12610f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
12620f8248bfSmrgcontrol is enabled, the effect of a key-activated pointer motion action
1263e9fcaa8aSmrgchanges as a key is held down. If the control is disabled, pressing a
12640f8248bfSmrgmouse-pointer key yields one mouse event. When
12650f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
12660f8248bfSmrgis enabled, mouse movement is defined by an initial distance specified in the
12670f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
12680f8248bfSmrgaction and the following fields in the
12690f8248bfSmrg<structname>XkbControlsRec</structname>
12700f8248bfSmrgstructure (see <link linkend="The_XkbControlsRec_Structure">section 10.8</link>).
1271e9fcaa8aSmrg</para>
1272e9fcaa8aSmrg
12730f8248bfSmrg<table id='table10.2' frame='topbot'>
1274e9fcaa8aSmrg<title>MouseKeysAccel Fields</title>
1275eb411b4bSmrg<?dbfo keep-together="always" ?>
1276eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1277eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1278eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1279e9fcaa8aSmrg<thead>
1280eb411b4bSmrg<row rowsep='1'>
1281e9fcaa8aSmrg  <entry>Field</entry>
1282e9fcaa8aSmrg  <entry>Function</entry>
1283e9fcaa8aSmrg</row>
1284e9fcaa8aSmrg</thead>
1285e9fcaa8aSmrg<tbody>
1286eb411b4bSmrg<row>
1287e9fcaa8aSmrg    <entry>mk_delay</entry>
1288e9fcaa8aSmrg    <entry>Time (ms) between the initial key press and the first repeated
1289e9fcaa8aSmrgmotion event</entry>
1290e9fcaa8aSmrg</row>
1291eb411b4bSmrg<row>
1292e9fcaa8aSmrg    <entry>mk_interval</entry>
1293e9fcaa8aSmrg    <entry>Time (ms) between repeated motion events</entry>
1294e9fcaa8aSmrg</row>
1295eb411b4bSmrg<row>
1296e9fcaa8aSmrg    <entry>mk_time_to_max</entry>
1297e9fcaa8aSmrg    <entry>Number of events (count) before the pointer reaches maximum
1298e9fcaa8aSmrgspeed</entry>
1299e9fcaa8aSmrg</row>
1300eb411b4bSmrg<row>
1301e9fcaa8aSmrg    <entry>mk_max_speed</entry>
1302e9fcaa8aSmrg    <entry>The maximum speed (in pixels per event) the pointer reaches</entry>
1303e9fcaa8aSmrg</row>
1304eb411b4bSmrg<row>
1305e9fcaa8aSmrg    <entry>mk_curve</entry>
1306e9fcaa8aSmrg    <entry>The ramp used to reach maximum pointer speed</entry>
1307e9fcaa8aSmrg  </row>
1308e9fcaa8aSmrg</tbody>
1309e9fcaa8aSmrg</tgroup>
1310e9fcaa8aSmrg</table>
1311e9fcaa8aSmrg
1312e9fcaa8aSmrg<para>
1313e9fcaa8aSmrgThere are no convenience functions to query or change the attributes of the
13140f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
13150f8248bfSmrgcontrol; instead use
13160f8248bfSmrg<function>XkbGetControls</function>
13170f8248bfSmrgand
13180f8248bfSmrg<function>XkbSetControls</function>
13190f8248bfSmrg(see <link linkend="Querying_Controls">section 10.9</link> and <link linkend="Changing_Controls">section 10.10</link>).
1320e9fcaa8aSmrg</para>
1321e9fcaa8aSmrg
1322e9fcaa8aSmrg
1323e9fcaa8aSmrg<para>
13240f8248bfSmrgThe effects of the attributes of the
13250f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
13260f8248bfSmrgcontrol depend on whether the
13270f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13280f8248bfSmrgaction (see <link linkend="Key_Actions">section 16.1</link>) specifies relative or absolute pointer motion.
1329e9fcaa8aSmrg</para>
1330e9fcaa8aSmrg
1331eb411b4bSmrg<sect3 id='Absolute_Pointer_Motion'>
1332e9fcaa8aSmrg<title>Absolute Pointer Motion</title>
1333e9fcaa8aSmrg
1334e9fcaa8aSmrg<para>
13350f8248bfSmrgIf an
13360f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13370f8248bfSmrgaction specifies an absolute position for one of the coordinates but still
1338e9fcaa8aSmrgallows acceleration, all repeated events contain any absolute coordinates
13390f8248bfSmrgspecified in the action. For example, if the
13400f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13410f8248bfSmrgaction specifies an absolute position for the X direction, but a relative
1342e9fcaa8aSmrgmotion for the Y direction, the pointer accelerates in the Y direction, but
1343e9fcaa8aSmrgstays at the same X position.
1344e9fcaa8aSmrg</para>
1345e9fcaa8aSmrg
1346e9fcaa8aSmrg
1347e9fcaa8aSmrg</sect3>
1348eb411b4bSmrg<sect3 id='Relative_Pointer_Motion'>
1349e9fcaa8aSmrg<title>Relative Pointer Motion</title>
1350e9fcaa8aSmrg
1351e9fcaa8aSmrg<para>
13520f8248bfSmrgIf the
13530f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13540f8248bfSmrgaction specifies relative motion, the initial event always moves the cursor
13550f8248bfSmrgthe distance specified in the action. After
13560f8248bfSmrg<structfield>mk_delay</structfield>
13570f8248bfSmrgmilliseconds, a second motion event is generated, and another occurs every
13580f8248bfSmrg<structfield>mk_interval</structfield>
13590f8248bfSmrgmilliseconds until the user releases the key.
1360e9fcaa8aSmrg</para>
1361e9fcaa8aSmrg
1362e9fcaa8aSmrg
1363e9fcaa8aSmrg<para>
13640f8248bfSmrgBetween the time of the second motion event and
13650f8248bfSmrg<structfield>mk_time_to_max</structfield>
13660f8248bfSmrgintervals, the change in pointer distance per interval increases with each
13670f8248bfSmrginterval. After
13680f8248bfSmrg<structfield>mk_time_to_max</structfield>
13690f8248bfSmrgintervals have elapsed, the change in pointer distance per interval remains
1370e9fcaa8aSmrgthe same and is calculated by multiplying the original distance specified in
13710f8248bfSmrgthe action by
13720f8248bfSmrg<structfield>mk_max_speed</structfield>.
1373e9fcaa8aSmrg</para>
1374e9fcaa8aSmrg
1375e9fcaa8aSmrg
1376e9fcaa8aSmrg<para>
13770f8248bfSmrgFor example, if the
13780f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
13790f8248bfSmrgaction specifies a relative motion in the X direction of 5,
13800f8248bfSmrg<structfield>mk_delay</structfield>
13810f8248bfSmrg=160,
13820f8248bfSmrg<structfield>mk_interval</structfield>
13830f8248bfSmrg=40,
13840f8248bfSmrg<structfield>mk_time_to_max</structfield>
13850f8248bfSmrg=30, and
13860f8248bfSmrg<structfield>mk_max_speed</structfield>
1387e9fcaa8aSmrg=30, the following happens when the user presses the key:
1388e9fcaa8aSmrg</para>
1389e9fcaa8aSmrg
1390e9fcaa8aSmrg<itemizedlist>
1391e9fcaa8aSmrg<listitem>
1392e9fcaa8aSmrg  <para>
1393e9fcaa8aSmrgThe pointer immediately moves 5 pixels in the X direction when the key is
1394e9fcaa8aSmrgpressed.
1395e9fcaa8aSmrg  </para>
1396e9fcaa8aSmrg</listitem>
1397e9fcaa8aSmrg<listitem>
1398e9fcaa8aSmrg  <para>
13990f8248bfSmrgAfter 160 milliseconds
14000f8248bfSmrg(<structfield>mk_delay</structfield>),
14010f8248bfSmrgand every 40 milliseconds thereafter
14020f8248bfSmrg(<structfield>mk_interval</structfield>),
14030f8248bfSmrgthe pointer moves in the X direction.
1404e9fcaa8aSmrg  </para>
1405e9fcaa8aSmrg</listitem>
1406e9fcaa8aSmrg<listitem>
1407e9fcaa8aSmrg  <para>
1408e9fcaa8aSmrgThe distance in the X direction increases with each interval until 30 intervals
14090f8248bfSmrg(
14100f8248bfSmrg<structfield>mk_time_to_max</structfield>)
14110f8248bfSmrghave elapsed.
1412e9fcaa8aSmrg  </para>
1413e9fcaa8aSmrg</listitem>
1414e9fcaa8aSmrg<listitem>
1415e9fcaa8aSmrg  <para>
1416e9fcaa8aSmrgAfter 30 intervals, the pointer stops accelerating, and moves 150 pixels
14170f8248bfSmrg(
14180f8248bfSmrg<structfield>mk_max_speed</structfield>
14190f8248bfSmrg* the original distance) every interval thereafter, until the key is released.
1420e9fcaa8aSmrg  </para>
1421e9fcaa8aSmrg</listitem>
1422e9fcaa8aSmrg</itemizedlist>
1423e9fcaa8aSmrg
1424e9fcaa8aSmrg<para>
14250f8248bfSmrgThe increase in pointer difference for each interval is a function of
14260f8248bfSmrg<structfield>mk_curve</structfield>.
14270f8248bfSmrgEvents after the first but before maximum acceleration has been achieved are
1428e9fcaa8aSmrgaccelerated according to the formula:
1429e9fcaa8aSmrg</para>
1430e9fcaa8aSmrg
1431e9fcaa8aSmrg<mediaobject>
14320f8248bfSmrg<imageobject> <imagedata format="SVG" fileref="XKBlib-3.svg"/>
14330f8248bfSmrg</imageobject>
14340f8248bfSmrg</mediaobject>
1435e9fcaa8aSmrg
1436e9fcaa8aSmrg
1437e9fcaa8aSmrg<para>
14380f8248bfSmrgWhere
14390f8248bfSmrg<emphasis>action_delta</emphasis>
14400f8248bfSmrgis the relative motion specified by the
14410f8248bfSmrg<symbol>XkbSA_MovePtr</symbol>
14420f8248bfSmrgaction,
14430f8248bfSmrg<structfield>mk_max_speed</structfield>
14440f8248bfSmrgand
14450f8248bfSmrg<structfield>mk_time_to_max</structfield>
14460f8248bfSmrgare parameters to the
14470f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
14480f8248bfSmrgcontrol, and the curveFactor is computed using the
14490f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
14500f8248bfSmrg<structfield>mk_curve</structfield>
14510f8248bfSmrgparameter as follows:
1452e9fcaa8aSmrg</para>
1453e9fcaa8aSmrg
1454e9fcaa8aSmrg<mediaobject>
14550f8248bfSmrg<imageobject> <imagedata format="SVG" fileref="XKBlib-4.svg"/>
14560f8248bfSmrg</imageobject>
14570f8248bfSmrg</mediaobject>
14580f8248bfSmrg
14590f8248bfSmrg
14600f8248bfSmrg<para>
14610f8248bfSmrgWith the result that a
14620f8248bfSmrg<structfield>mk_curve</structfield>
14630f8248bfSmrgof zero causes the distance moved to increase linearly from
14640f8248bfSmrg<emphasis>action_delta</emphasis>
14650f8248bfSmrgto <mediaobject>
14660f8248bfSmrg<imageobject> <imagedata format="SVG" fileref="XKBlib-5.svg"/>
14670f8248bfSmrg</imageobject>
14680f8248bfSmrg</mediaobject>.
14690f8248bfSmrgA negative
14700f8248bfSmrg<structfield>mk_curve</structfield>
14710f8248bfSmrgcauses an initial sharp increase in acceleration that tapers off, and a
1472e9fcaa8aSmrgpositive curve yields a slower initial increase in acceleration followed by a
1473e9fcaa8aSmrgsharp increase as the number of pointer events generated by the action
14740f8248bfSmrgapproaches
14750f8248bfSmrg<structfield>mk_time_to_max</structfield>.
14760f8248bfSmrgThe legal values for
14770f8248bfSmrg<structfield>mk_curve</structfield>
14780f8248bfSmrgare between &minus;1000 and 1000.
1479e9fcaa8aSmrg</para>
1480e9fcaa8aSmrg
1481e9fcaa8aSmrg
1482e9fcaa8aSmrg<para>
14830f8248bfSmrgA distance vs. time graph of the pointer motion is shown in
14840f8248bfSmrg<link linkend="figure10.1">Figure 10.1</link>.
1485e9fcaa8aSmrg</para>
1486e9fcaa8aSmrg
14870f8248bfSmrg<figure id='figure10.1'>
14880f8248bfSmrg  <title>MouseKeys Acceleration</title>
14890f8248bfSmrg  <mediaobject>
14900f8248bfSmrg   <imageobject> <imagedata format="SVG" fileref="XKBlib-6.svg"/>
14910f8248bfSmrg   </imageobject>
14920f8248bfSmrg   </mediaobject>
14930f8248bfSmrg</figure>
1494e9fcaa8aSmrg
1495e9fcaa8aSmrg<!--
1496e9fcaa8aSmrg<H5 CLASS="Figure">
1497e9fcaa8aSmrgMouseKeys Acceleration</H5>
1498e9fcaa8aSmrg-->
1499e9fcaa8aSmrg</sect3>
1500e9fcaa8aSmrg</sect2>
1501e9fcaa8aSmrg</sect1>
1502eb411b4bSmrg<sect1 id='Controls_for_Better_Keyboard_Access_by_Physically_ImpairedPersons'>
1503e9fcaa8aSmrg<title>Controls for Better Keyboard Access by Physically Impaired
1504e9fcaa8aSmrgPersons</title>
1505e9fcaa8aSmrg
1506e9fcaa8aSmrg<para>
1507e9fcaa8aSmrgThe Xkb extension includes several controls specifically aimed at making
1508e9fcaa8aSmrgkeyboard use more effective for physically impaired people. All of these
1509e9fcaa8aSmrgcontrols are boolean controls and may be individually enabled and disabled, as
1510e9fcaa8aSmrgwell as configured to tune their specific behavior. The behavior of these
1511e9fcaa8aSmrgcontrols is based on the AccessDOS package
1512e9fcaa8aSmrg<footnote><para>
1513e9fcaa8aSmrgAccessDOS provides access to the DOS operating system for people with physical
1514e9fcaa8aSmrgimpairments and was developed by the Trace R&amp;D Center at the University of
1515e9fcaa8aSmrgWisconsin. For more information on AccessDOS, contact the Trace R&amp;D Center,
1516e9fcaa8aSmrgWaisman Center and Department of Industrial Engineering, University of
1517e9fcaa8aSmrgWisconsin-Madison WI 53705-2280. Phone: 608-262-6966. e-mail: info@trace.wisc.edu.
1518e9fcaa8aSmrg</para></footnote>.
1519e9fcaa8aSmrg</para>
1520e9fcaa8aSmrg
1521eb411b4bSmrg<sect2 id='The_AccessXKeys_Control'>
1522e9fcaa8aSmrg<title>The AccessXKeys Control</title>
1523e9fcaa8aSmrg
1524e9fcaa8aSmrg<para>
1525e9fcaa8aSmrgEnabling or disabling the keyboard controls through a graphical user interface
1526e9fcaa8aSmrgmay be impossible for people who need to use the controls. For example, a user
15270f8248bfSmrgwho needs
15280f8248bfSmrg<emphasis>SlowKeys</emphasis>
15290f8248bfSmrg(see <link linkend="The_SlowKeys_Control">section 10.6.6</link>) may not even be able to start the graphical application,
15300f8248bfSmrglet alone use it, if
15310f8248bfSmrg<emphasis>SlowKeys</emphasis>
15320f8248bfSmrgis not enabled. To allow easier access to some of the controls, the
15330f8248bfSmrg<emphasis>AccessXKeys</emphasis>
15340f8248bfSmrgcontrol provides a set of special key sequences similar to those available in
1535e9fcaa8aSmrgAccessDOS.
1536e9fcaa8aSmrg</para>
1537e9fcaa8aSmrg
1538e9fcaa8aSmrg
1539e9fcaa8aSmrg<para>
15400f8248bfSmrgWhen the
15410f8248bfSmrg<emphasis>AccessXKeys</emphasis>
15420f8248bfSmrgcontrol is enabled, the user can turn controls on or off from the keyboard by
1543e9fcaa8aSmrgentering the following standard key sequences:
1544e9fcaa8aSmrg</para>
1545e9fcaa8aSmrg
1546e9fcaa8aSmrg<itemizedlist>
1547e9fcaa8aSmrg<listitem>
1548e9fcaa8aSmrg  <para>
15490f8248bfSmrgHolding down a <keycap>Shift</keycap> key by itself for eight seconds
15500f8248bfSmrgtoggles the
15510f8248bfSmrg<emphasis>SlowKeys</emphasis>
15520f8248bfSmrgcontrol.
1553e9fcaa8aSmrg  </para>
1554e9fcaa8aSmrg</listitem>
1555e9fcaa8aSmrg<listitem>
1556e9fcaa8aSmrg  <para>
15570f8248bfSmrgPressing and releasing the left or right
15580f8248bfSmrg<keycap>Shift</keycap>
15590f8248bfSmrgkey five times in a row, without any intervening key events and with less than
1560e9fcaa8aSmrg30 seconds delay between consecutive presses, toggles the state of the
15610f8248bfSmrg<emphasis>StickyKeys</emphasis>
15620f8248bfSmrgcontrol.
1563e9fcaa8aSmrg  </para>
1564e9fcaa8aSmrg</listitem>
1565e9fcaa8aSmrg<listitem>
1566e9fcaa8aSmrg  <para>
15670f8248bfSmrgSimultaneously operating two or more modifier keys deactivates the
15680f8248bfSmrg<emphasis>StickyKeys</emphasis>
15690f8248bfSmrgcontrol.
1570e9fcaa8aSmrg  </para>
1571e9fcaa8aSmrg</listitem>
1572e9fcaa8aSmrg</itemizedlist>
1573e9fcaa8aSmrg
1574e9fcaa8aSmrg<para>
15750f8248bfSmrgWhen the
15760f8248bfSmrg<emphasis>AccessXKeys</emphasis>
15770f8248bfSmrgcontrol is disabled, Xkb does not look for the above special key sequences.
1578e9fcaa8aSmrg</para>
1579e9fcaa8aSmrg
1580e9fcaa8aSmrg
1581e9fcaa8aSmrg<para>
1582e9fcaa8aSmrgSome of these key sequences optionally generate audible feedback of the change
15830f8248bfSmrgin state, as described in <link linkend="The_AccessXFeedback_Control">section 10.6.3</link>, or
15840f8248bfSmrg<symbol>XkbControlsNotify</symbol>
15850f8248bfSmrgevents, described in <link linkend="Tracking_Changes_to_Keyboard_Controls">section 10.11</link>.
1586e9fcaa8aSmrg</para>
1587e9fcaa8aSmrg
1588e9fcaa8aSmrg</sect2>
1589eb411b4bSmrg<sect2 id='The_AccessXTimeout_Control'>
1590e9fcaa8aSmrg<title>The AccessXTimeout Control</title>
1591e9fcaa8aSmrg
1592e9fcaa8aSmrg<para>
15930f8248bfSmrgIn environments where computers are shared, features such as
15940f8248bfSmrg<emphasis>SlowKeys</emphasis>
15950f8248bfSmrgpresent a problem: if
15960f8248bfSmrg<emphasis>SlowKeys</emphasis>
15970f8248bfSmrgis on, the keyboard can appear to be unresponsive because keys are not
1598e9fcaa8aSmrgaccepted until they are held for a certain period of time. To help solve this
15990f8248bfSmrgproblem, Xkb provides an
16000f8248bfSmrg<emphasis>AccessXTimeout</emphasis>
16010f8248bfSmrgcontrol to automatically change the enabled/disabled state of any boolean
16020f8248bfSmrgcontrols and to change the value of the
16030f8248bfSmrg<emphasis>AccessXKeys</emphasis>
16040f8248bfSmrgand
16050f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
16060f8248bfSmrgcontrol attributes if the keyboard is idle for a specified period of time.
16070f8248bfSmrg</para>
16080f8248bfSmrg
16090f8248bfSmrg
16100f8248bfSmrg<para>
16110f8248bfSmrgWhen a timeout as specified by
16120f8248bfSmrg<emphasis>AccessXTimeout</emphasis>
16130f8248bfSmrgoccurs and a control is consequently modified, Xkb generates an
16140f8248bfSmrg<symbol>XkbControlsNotify</symbol>
16150f8248bfSmrgevent. For more information on
16160f8248bfSmrg<symbol>XkbControlsNotify</symbol>
16170f8248bfSmrgevents, refer to <link linkend="Tracking_Changes_to_Keyboard_Controls">section 10.11</link>.
16180f8248bfSmrg</para>
16190f8248bfSmrg
16200f8248bfSmrg<para>
1621cbfda780SmrgThere are no convenience functions in Xkb for manipulating this control. The
16220f8248bfSmrg<emphasis>AccessXTimeout</emphasis>
1623cbfda780Smrgcontrol settings are carried in the
1624cbfda780Smrg<structfield>ax_timeout</structfield>,
1625cbfda780Smrg<structfield>axt_opts_mask</structfield>,
1626cbfda780Smrg<structfield>axt_opts_values</structfield>,
1627cbfda780Smrg<structfield>axt_ctrls_mask</structfield>,
16280f8248bfSmrgand
1629cbfda780Smrg<structfield>axt_ctrls_values</structfield>
1630cbfda780Smrgfields of an
16310f8248bfSmrg<structname>XkbControlsRec</structname>
1632cbfda780Smrgstructure, discussed in <link linkend="The_XkbControlsRec_Structure">section 10.8</link>.
16330f8248bfSmrg</para>
16340f8248bfSmrg
16350f8248bfSmrg
1636e9fcaa8aSmrg
1637e9fcaa8aSmrg</sect2>
1638eb411b4bSmrg<sect2 id='The_AccessXFeedback_Control'>
1639e9fcaa8aSmrg<title>The AccessXFeedback Control</title>
1640e9fcaa8aSmrg
1641e9fcaa8aSmrg<para>
1642e9fcaa8aSmrgJust as some keyboards can produce keyclicks to indicate when a key is pressed
1643e9fcaa8aSmrgor repeating, Xkb can provide feedback for the controls by using special beep
16440f8248bfSmrgcodes. Use the
16450f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
16460f8248bfSmrgcontrol to configure the specific types of operations that generate feedback.
1647e9fcaa8aSmrg</para>
1648e9fcaa8aSmrg
1649e9fcaa8aSmrg
1650e9fcaa8aSmrg<para>
16510f8248bfSmrgThere is no convenience function for modifying the
16520f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
16530f8248bfSmrgcontrol, although the feedback as a whole can be enabled or disabled just as
16540f8248bfSmrgother boolean controls are (see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>). Individual beep codes are turned
16550f8248bfSmrgon or off by modifying the following bits in the
16560f8248bfSmrg<structfield>ax_options</structfield>
16570f8248bfSmrgfield of an
16580f8248bfSmrg<structname>XkbControlsRec</structname>
16590f8248bfSmrgstructure and using
16600f8248bfSmrg<function>XkbSetControls</function>
16610f8248bfSmrg(see <link linkend="Changing_Controls">section 10.10</link>):
1662e9fcaa8aSmrg</para>
1663e9fcaa8aSmrg
16640f8248bfSmrg<table id='table10.3' frame='topbot'>
1665e9fcaa8aSmrg<title>AccessXFeedback Masks</title>
1666eb411b4bSmrg<?dbfo keep-together="always" ?>
1667eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
1668eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1669eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
1670eb411b4bSmrg<colspec colname='c3' colwidth='1.0*'/>
1671e9fcaa8aSmrg<thead>
1672eb411b4bSmrg<row rowsep='1'>
1673e9fcaa8aSmrg  <entry>Action</entry>
1674e9fcaa8aSmrg  <entry>Beep Code</entry>
1675e9fcaa8aSmrg  <entry>ax_options bit</entry>
1676e9fcaa8aSmrg  </row>
1677e9fcaa8aSmrg</thead>
1678e9fcaa8aSmrg<tbody>
1679eb411b4bSmrg<row>
1680e9fcaa8aSmrg    <entry>LED turned on</entry>
1681e9fcaa8aSmrg    <entry>High-pitched beep</entry>
16820f8248bfSmrg    <entry><symbol>XkbAX_IndicatorFBMask</symbol></entry>
1683e9fcaa8aSmrg</row>
1684eb411b4bSmrg<row>
1685e9fcaa8aSmrg    <entry>LED turned off</entry>
1686e9fcaa8aSmrg    <entry>Low-pitched beep</entry>
16870f8248bfSmrg    <entry><symbol>XkbAX_IndicatorFBMask</symbol></entry>
1688e9fcaa8aSmrg</row>
1689eb411b4bSmrg<row>
1690e9fcaa8aSmrg    <entry>More than one LED changed state</entry>
1691e9fcaa8aSmrg    <entry>Two high-pitched beeps</entry>
16920f8248bfSmrg    <entry><symbol>XkbAX_IndicatorFBMask</symbol></entry>
1693e9fcaa8aSmrg</row>
1694eb411b4bSmrg<row>
1695e9fcaa8aSmrg    <entry>Control turned on</entry>
1696e9fcaa8aSmrg    <entry>Rising tone</entry>
16970f8248bfSmrg    <entry><symbol>XkbAX_FeatureFBMask</symbol></entry>
1698e9fcaa8aSmrg</row>
1699eb411b4bSmrg<row>
1700e9fcaa8aSmrg    <entry>Control turned off</entry>
1701e9fcaa8aSmrg    <entry>Falling tone</entry>
17020f8248bfSmrg    <entry><symbol>XkbAX_FeatureFBMask</symbol></entry>
1703e9fcaa8aSmrg</row>
1704eb411b4bSmrg<row>
1705e9fcaa8aSmrg    <entry>More than one control changed state</entry>
1706e9fcaa8aSmrg    <entry>Two high-pitched beeps</entry>
17070f8248bfSmrg    <entry><symbol>XkbAX_FeatureFBMask</symbol></entry>
1708e9fcaa8aSmrg</row>
1709eb411b4bSmrg<row>
1710e9fcaa8aSmrg    <entry>SlowKeys and BounceKeys about to be turned on or off</entry>
1711e9fcaa8aSmrg    <entry>Three high-pitched beeps</entry>
17120f8248bfSmrg    <entry><symbol>XkbAX_SlowWarnFBMask</symbol></entry>
1713e9fcaa8aSmrg</row>
1714eb411b4bSmrg<row>
1715e9fcaa8aSmrg    <entry>SlowKeys key pressed</entry>
1716e9fcaa8aSmrg    <entry>Medium-pitched beep</entry>
17170f8248bfSmrg    <entry><symbol>XkbAX_SKPressFBMask</symbol></entry>
1718e9fcaa8aSmrg</row>
1719eb411b4bSmrg<row>
1720e9fcaa8aSmrg    <entry>SlowKeys key accepted</entry>
1721e9fcaa8aSmrg    <entry>Medium-pitched beep</entry>
17220f8248bfSmrg    <entry><symbol>XkbAX_SKAcceptFBMask</symbol></entry>
1723e9fcaa8aSmrg</row>
1724eb411b4bSmrg<row>
1725e9fcaa8aSmrg    <entry>SlowKeys key rejected</entry>
1726e9fcaa8aSmrg    <entry>Low-pitched beep</entry>
17270f8248bfSmrg    <entry><symbol>XkbAX_SKRejectFBMask</symbol></entry>
1728e9fcaa8aSmrg</row>
1729eb411b4bSmrg<row>
1730e9fcaa8aSmrg    <entry>Accepted SlowKeys key released</entry>
1731e9fcaa8aSmrg    <entry>Medium-pitched beep</entry>
17320f8248bfSmrg    <entry><symbol>XkbAX_SKReleaseFBMask</symbol></entry>
1733e9fcaa8aSmrg</row>
1734eb411b4bSmrg<row>
1735e9fcaa8aSmrg    <entry>BounceKeys key rejected</entry>
1736e9fcaa8aSmrg    <entry>Low-pitched beep</entry>
17370f8248bfSmrg    <entry><symbol>XkbAX_BKRejectFBMask</symbol></entry>
1738e9fcaa8aSmrg</row>
1739eb411b4bSmrg<row>
1740e9fcaa8aSmrg    <entry>StickyKeys key latched</entry>
1741e9fcaa8aSmrg    <entry>Low-pitched beep followed by high-pitched beep</entry>
17420f8248bfSmrg    <entry><symbol>XkbAX_StickyKeysFBMask</symbol></entry>
1743e9fcaa8aSmrg</row>
1744eb411b4bSmrg<row>
1745e9fcaa8aSmrg    <entry>StickyKeys key locked</entry>
1746e9fcaa8aSmrg    <entry>High-pitched beep</entry>
17470f8248bfSmrg    <entry><symbol>XkbAX_StickyKeysFBMask</symbol></entry>
1748e9fcaa8aSmrg</row>
1749eb411b4bSmrg<row>
1750e9fcaa8aSmrg    <entry>StickyKeys key unlocked</entry>
1751e9fcaa8aSmrg    <entry>Low-pitched beep</entry>
17520f8248bfSmrg    <entry><symbol>XkbAX_StickyKeysFBMask</symbol></entry>
1753e9fcaa8aSmrg  </row>
1754e9fcaa8aSmrg</tbody>
1755e9fcaa8aSmrg</tgroup>
1756e9fcaa8aSmrg</table>
1757e9fcaa8aSmrg
1758e9fcaa8aSmrg<para>
1759e9fcaa8aSmrgImplementations that cannot generate continuous tones may generate multiple
1760e9fcaa8aSmrgbeeps instead of falling and rising tones; for example, they can generate a
1761e9fcaa8aSmrghigh-pitched beep followed by a low-pitched beep instead of a continuous
1762e9fcaa8aSmrgfalling tone. Other implementations can only ring the bell with one fixed
17630f8248bfSmrgpitch. In these cases, use the
17640f8248bfSmrg<symbol>XkbAX_DumbBellFBMask</symbol>
17650f8248bfSmrgbit of
17660f8248bfSmrg<structfield>ax_options</structfield>
17670f8248bfSmrgto indicate that the bell can only ring with a fixed pitch.
1768e9fcaa8aSmrg</para>
1769e9fcaa8aSmrg
1770e9fcaa8aSmrg
1771e9fcaa8aSmrg<para>
17720f8248bfSmrgWhen any of the above feedbacks occur, Xkb may generate a
17730f8248bfSmrg<symbol>XkbBellNotify</symbol>
17740f8248bfSmrgevent (see <link linkend="Detecting_Bells">section 9.4</link>).
1775e9fcaa8aSmrg</para>
1776e9fcaa8aSmrg
1777e9fcaa8aSmrg
1778e9fcaa8aSmrg</sect2>
1779eb411b4bSmrg<sect2 id='AccessXNotify_Events'>
1780e9fcaa8aSmrg<title>AccessXNotify Events</title>
1781e9fcaa8aSmrg
17820f8248bfSmrg<indexterm significance="preferred" zone="AccessXNotify_Events">
17830f8248bfSmrg<primary>events</primary><secondary><symbol>XkbAccessXNotify</symbol></secondary></indexterm>
17840f8248bfSmrg<indexterm significance="preferred" zone="AccessXNotify_Events">
17850f8248bfSmrg<primary><structname>XkbAccessXNotifyEvent</structname></primary></indexterm>
17860f8248bfSmrg
1787e9fcaa8aSmrg<para>
17880f8248bfSmrgThe server can generate
17890f8248bfSmrg<symbol>XkbAccessXNotify</symbol>
17900f8248bfSmrgevents for some of the global keyboard controls. The structure for the
17910f8248bfSmrg<symbol>XkbAccessXNotify</symbol>
17920f8248bfSmrgevent type is as follows:
1793e9fcaa8aSmrg
17940f8248bfSmrg<programlisting>
1795e9fcaa8aSmrgtypedef struct {
17960f8248bfSmrg    int             type;            /* Xkb extension base event code */
17970f8248bfSmrg    unsigned long   serial;          /* X server serial number for event */
17980f8248bfSmrg    Bool            send_event;      /* <symbol>True</symbol> &rArr; synthetically generated */
17990f8248bfSmrg    Display *       display;         /* server connection where event generated */
18000f8248bfSmrg    Time            time;            /* server time when event generated */
18010f8248bfSmrg    int             xkb_type;        /* <symbol>XkbAccessXNotify</symbol> */
18020f8248bfSmrg    int             device;          /* Xkb device ID, will not be <symbol>XkbUseCoreKbd</symbol> */
18030f8248bfSmrg    int             detail;          /* XkbAXN_* */
18040f8248bfSmrg    KeyCode         keycode;         /* key of event */
18050f8248bfSmrg    int             slowKeysDelay;   /* current SlowKeys delay */
18060f8248bfSmrg    int             debounceDelay;   /* current debounce delay */
18070f8248bfSmrg} <structname>XkbAccessXNotifyEvent</structname>;
1808e9fcaa8aSmrg</programlisting></para>
1809e9fcaa8aSmrg
1810e9fcaa8aSmrg<para>
18110f8248bfSmrgThe
18120f8248bfSmrg<structfield>detail</structfield>
18130f8248bfSmrgfield describes what AccessX event just occurred and can be any of the values
18140f8248bfSmrgin <link linkend="table10.4">Table 10.4</link>.
1815e9fcaa8aSmrg</para>
1816e9fcaa8aSmrg
18170f8248bfSmrg<table id='table10.4' frame='topbot'>
1818e9fcaa8aSmrg<title>AccessXNotify Events</title>
1819eb411b4bSmrg<?dbfo keep-together="always" ?>
1820eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
1821eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
1822eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
1823e9fcaa8aSmrg<thead>
1824eb411b4bSmrg<row rowsep='1'>
1825e9fcaa8aSmrg  <entry>detail</entry>
1826e9fcaa8aSmrg  <entry>Reason</entry>
1827e9fcaa8aSmrg</row>
1828e9fcaa8aSmrg</thead>
1829e9fcaa8aSmrg<tbody>
1830eb411b4bSmrg<row>
18310f8248bfSmrg    <entry><symbol>XkbAXN_SKPress</symbol></entry>
1832e9fcaa8aSmrg    <entry>A key was pressed when SlowKeys was enabled.</entry>
1833e9fcaa8aSmrg</row>
1834eb411b4bSmrg<row>
18350f8248bfSmrg    <entry><symbol>XkbAXN_SKAccept</symbol></entry>
1836e9fcaa8aSmrg    <entry>A key was accepted (held longer than the SlowKeys delay).</entry>
1837e9fcaa8aSmrg</row>
1838eb411b4bSmrg<row>
18390f8248bfSmrg    <entry><symbol>XkbAXN_SKRelease</symbol></entry>
1840e9fcaa8aSmrg    <entry>An accepted SlowKeys key was released.</entry>
1841e9fcaa8aSmrg</row>
1842eb411b4bSmrg<row>
18430f8248bfSmrg    <entry><symbol>XkbAXN_SKReject</symbol></entry>
1844e9fcaa8aSmrg    <entry>A key was rejected (released before the SlowKeys delay
1845e9fcaa8aSmrgexpired).</entry>
1846e9fcaa8aSmrg</row>
1847eb411b4bSmrg<row>
18480f8248bfSmrg    <entry><symbol>XkbAXN_BKAccept</symbol></entry>
1849e9fcaa8aSmrg    <entry>A key was accepted by BounceKeys.</entry>
1850e9fcaa8aSmrg</row>
1851eb411b4bSmrg<row>
18520f8248bfSmrg    <entry><symbol>XkbAXN_BKReject</symbol></entry>
1853e9fcaa8aSmrg    <entry>A key was rejected (pressed before the BounceKeys delay
1854e9fcaa8aSmrgexpired).</entry>
1855e9fcaa8aSmrg</row>
1856eb411b4bSmrg<row>
18570f8248bfSmrg    <entry><symbol>XkbAXN_AXKWarning</symbol></entry>
1858e9fcaa8aSmrg    <entry>AccessXKeys is about to turn on/off StickyKeys or BounceKeys.</entry>
1859e9fcaa8aSmrg  </row>
1860e9fcaa8aSmrg</tbody>
1861e9fcaa8aSmrg</tgroup>
1862e9fcaa8aSmrg</table>
1863e9fcaa8aSmrg
1864e9fcaa8aSmrg<para>
18650f8248bfSmrgThe
18660f8248bfSmrg<structfield>keycode</structfield>
18670f8248bfSmrgfield reports the keycode of the key for which the event occurred. If the
18680f8248bfSmrgaction is related to
18690f8248bfSmrg<emphasis>SlowKeys</emphasis>,
18700f8248bfSmrgthe
18710f8248bfSmrg<structfield>slowKeysDelay</structfield>
18720f8248bfSmrgfield contains the current
18730f8248bfSmrg<emphasis>SlowKeys</emphasis>
18740f8248bfSmrgacceptance delay. If the action is related to
18750f8248bfSmrg<emphasis>BounceKeys</emphasis>,
18760f8248bfSmrgthe
18770f8248bfSmrg<structfield>debounceDelay</structfield>
18780f8248bfSmrgfield contains the current
18790f8248bfSmrg<emphasis>BounceKeys</emphasis>
18800f8248bfSmrgdebounce delay.
1881e9fcaa8aSmrg</para>
1882e9fcaa8aSmrg
1883eb411b4bSmrg<sect3 id='Selecting_for_AccessX_Events'>
1884e9fcaa8aSmrg<title>Selecting for AccessX Events</title>
1885e9fcaa8aSmrg
1886e9fcaa8aSmrg<para>
18870f8248bfSmrgTo receive
18880f8248bfSmrg<symbol>XkbAccessXNotify</symbol>
18890f8248bfSmrgevents under all possible conditions, use
18900f8248bfSmrg<function>XkbSelectEvents</function>
18910f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>) and pass
18920f8248bfSmrg<symbol>XkbAccessXNotifyMask</symbol>
18930f8248bfSmrgin both
18940f8248bfSmrg<parameter>bits_to_change</parameter>
18950f8248bfSmrgand
18960f8248bfSmrg<parameter>values_for_bits</parameter>.
1897e9fcaa8aSmrg</para>
1898e9fcaa8aSmrg
1899e9fcaa8aSmrg
1900e9fcaa8aSmrg<para>
19010f8248bfSmrgTo receive
19020f8248bfSmrg<symbol>XkbStateNotify</symbol>
19030f8248bfSmrgevents only under certain conditions, use
19040f8248bfSmrg<function>XkbSelectEventDetails</function>
19050f8248bfSmrgusing
19060f8248bfSmrg<symbol>XkbAccessXNotify</symbol>
19070f8248bfSmrgas the
19080f8248bfSmrg<structfield>event_type</structfield>
19090f8248bfSmrgand specifying the desired state changes in
19100f8248bfSmrg<parameter>bits_to_change</parameter>
19110f8248bfSmrgand
19120f8248bfSmrg<parameter>values_for_bits</parameter>
19130f8248bfSmrgusing mask bits from <link linkend="table10.5">Table 10.5</link>.
1914e9fcaa8aSmrg</para>
1915e9fcaa8aSmrg
19160f8248bfSmrg<table id='table10.5' frame='topbot'>
1917e9fcaa8aSmrg<title>AccessXNotify Event Details</title>
1918eb411b4bSmrg<?dbfo keep-together="always" ?>
1919eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
1920eb411b4bSmrg<colspec colname='c1' colwidth='1.5*'/>
1921eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
1922eb411b4bSmrg<colspec colname='c3' colwidth='2.0*'/>
1923e9fcaa8aSmrg<thead>
1924eb411b4bSmrg<row rowsep='1'>
1925e9fcaa8aSmrg  <entry>XkbAccessXNotify Event Details</entry>
1926e9fcaa8aSmrg  <entry>Value</entry>
1927e9fcaa8aSmrg  <entry>Circumstances</entry>
1928e9fcaa8aSmrg  </row>
1929e9fcaa8aSmrg</thead>
1930e9fcaa8aSmrg<tbody>
1931eb411b4bSmrg  <row>
19320f8248bfSmrg    <entry><symbol>XkbAXN_SKPressMask</symbol></entry>
1933e9fcaa8aSmrg    <entry>(1&lt;&lt;0)</entry>
1934e9fcaa8aSmrg    <entry>Slow key press notification wanted</entry>
1935e9fcaa8aSmrg  </row>
1936eb411b4bSmrg  <row>
19370f8248bfSmrg    <entry><symbol>XkbAXN_SKAcceptMask</symbol></entry>
1938e9fcaa8aSmrg    <entry>(1&lt;&lt;1)</entry>
1939e9fcaa8aSmrg    <entry>Slow key accept notification wanted</entry>
1940e9fcaa8aSmrg  </row>
1941eb411b4bSmrg  <row>
19420f8248bfSmrg    <entry><symbol>XkbAXN_SKRejectMask</symbol></entry>
1943e9fcaa8aSmrg    <entry>(1&lt;&lt;2)</entry>
1944e9fcaa8aSmrg    <entry>Slow key reject notification wanted</entry>
1945e9fcaa8aSmrg  </row>
1946eb411b4bSmrg  <row>
19470f8248bfSmrg    <entry><symbol>XkbAXN_SKReleaseMask</symbol></entry>
1948e9fcaa8aSmrg    <entry>(1&lt;&lt;3)</entry>
1949e9fcaa8aSmrg    <entry>Slow key release notification wanted</entry>
1950e9fcaa8aSmrg  </row>
1951eb411b4bSmrg  <row>
19520f8248bfSmrg    <entry><symbol>XkbAXN_BKAcceptMask</symbol></entry>
1953e9fcaa8aSmrg    <entry>(1&lt;&lt;4)</entry>
1954e9fcaa8aSmrg    <entry>Bounce key accept notification wanted</entry>
1955e9fcaa8aSmrg  </row>
1956eb411b4bSmrg  <row>
19570f8248bfSmrg    <entry><symbol>XkbAXN_BKRejectMask</symbol></entry>
1958e9fcaa8aSmrg    <entry>(1&lt;&lt;5)</entry>
1959e9fcaa8aSmrg    <entry>Bounce key reject notification wanted</entry>
1960e9fcaa8aSmrg  </row>
1961eb411b4bSmrg  <row>
19620f8248bfSmrg    <entry><symbol>XkbAXN_AXKWarningMask</symbol></entry>
1963e9fcaa8aSmrg    <entry>(1&lt;&lt;6)</entry>
1964e9fcaa8aSmrg    <entry>AccessX warning notification wanted</entry>
1965e9fcaa8aSmrg  </row>
1966eb411b4bSmrg  <row>
1967e9fcaa8aSmrg    <entry>XkbAXN_AllEventsMask</entry>
1968e9fcaa8aSmrg    <entry>(0x7f)</entry>
1969e9fcaa8aSmrg    <entry>All AccessX features notifications wanted</entry>
1970e9fcaa8aSmrg  </row>
1971e9fcaa8aSmrg</tbody>
1972e9fcaa8aSmrg</tgroup>
1973e9fcaa8aSmrg</table>
1974e9fcaa8aSmrg
1975e9fcaa8aSmrg</sect3>
1976e9fcaa8aSmrg</sect2>
1977eb411b4bSmrg<sect2 id='StickyKeys_RepeatKeys_and_MouseKeys_Events'>
1978e9fcaa8aSmrg<title>StickyKeys, RepeatKeys, and MouseKeys Events</title>
1979e9fcaa8aSmrg
1980e9fcaa8aSmrg<para>
19810f8248bfSmrgThe
19820f8248bfSmrg<emphasis>StickyKeys</emphasis>,
19830f8248bfSmrg<emphasis>RepeatKeys</emphasis>,
19840f8248bfSmrgand
19850f8248bfSmrg<emphasis>MouseKeys</emphasis>
19860f8248bfSmrgcontrols do not generate specific events. Instead, the latching, unlatching,
19870f8248bfSmrglocking, or unlocking of modifiers using
19880f8248bfSmrg<emphasis>StickyKeys</emphasis>
19890f8248bfSmrggenerates
19900f8248bfSmrg<symbol>XkbStateNotify</symbol>
19910f8248bfSmrgevents as described in <link linkend="Tracking_Keyboard_State">section 5.4</link>. Repeating keys generate normal
19920f8248bfSmrg<symbol>KeyPress</symbol>
19930f8248bfSmrgand
19940f8248bfSmrg<symbol>KeyRelease</symbol>
19950f8248bfSmrgevents, though the auto-repeat can be detected using
19960f8248bfSmrg<emphasis>DetectableAutorepeat</emphasis>
19970f8248bfSmrg(see <link linkend="The_DetectableAutorepeat_Control">section 10.3.3</link>). Finally,
19980f8248bfSmrg<emphasis>MouseKeys</emphasis>
19990f8248bfSmrggenerates pointer events identical to those of the core pointer device.
2000e9fcaa8aSmrg</para>
2001e9fcaa8aSmrg
2002e9fcaa8aSmrg
2003e9fcaa8aSmrg</sect2>
2004eb411b4bSmrg<sect2 id='The_SlowKeys_Control'>
2005e9fcaa8aSmrg<title>The SlowKeys Control</title>
2006e9fcaa8aSmrg
2007e9fcaa8aSmrg<para>
2008e9fcaa8aSmrgSome users may accidentally bump keys while moving a hand or typing stick
2009e9fcaa8aSmrgtoward the key they want. Usually, the keys that are accidentally bumped are
20100f8248bfSmrgjust hit for a very short period of time. The
20110f8248bfSmrg<emphasis>SlowKeys</emphasis>
20120f8248bfSmrgcontrol helps filter these accidental bumps by telling the server to wait a
20130f8248bfSmrgspecified period, called the
20140f8248bfSmrg<firstterm>SlowKeys acceptance delay</firstterm>,
20150f8248bfSmrgbefore delivering key events. If the key is released before this period
2016e9fcaa8aSmrgelapses, no key events are generated. Users can then bump any number of keys on
2017e9fcaa8aSmrgtheir way to the one they want without accidentally getting those characters.
2018e9fcaa8aSmrgOnce they have reached the key they want, they can then hold the desired key
20190f8248bfSmrglong enough for the computer to accept it.
20200f8248bfSmrg<emphasis>SlowKeys</emphasis>
20210f8248bfSmrgis a boolean control with one configurable attribute.
2022e9fcaa8aSmrg</para>
2023e9fcaa8aSmrg
2024e9fcaa8aSmrg<para>
20250f8248bfSmrgWhen the
20260f8248bfSmrg<emphasis>SlowKeys</emphasis>
20270f8248bfSmrgcontrol is active, the server reports the initial key press, subsequent
2028e9fcaa8aSmrgacceptance or rejection, and release of any key to interested clients by
20290f8248bfSmrgsending an appropriate
20300f8248bfSmrg<emphasis>AccessXNotify</emphasis>
20310f8248bfSmrgevent (see <link linkend="AccessXNotify_Events">section 10.6.4</link>).
20320f8248bfSmrg</para>
20330f8248bfSmrg
20340f8248bfSmrg<para>
2035cbfda780SmrgThere are no convenience functions in Xkb for manipulating this control. The
20360f8248bfSmrg<emphasis>SlowKeys</emphasis>
2037cbfda780Smrgcontrol settings are carried in the
2038cbfda780Smrg<structfield>slow_keys_delay</structfield>
2039cbfda780Smrgfield of an
2040cbfda780Smrg<structname>XkbControlsRec</structname>
2041cbfda780Smrgstructure, discussed in <link linkend="The_XkbControlsRec_Structure">section 10.8</link>.
20420f8248bfSmrg</para>
20430f8248bfSmrg
2044cbfda780Smrg</sect2>
2045cbfda780Smrg<sect2 id='The_BounceKeys_Control'>
2046cbfda780Smrg<title>The BounceKeys Control</title>
20470f8248bfSmrg
20480f8248bfSmrg<para>
2049cbfda780SmrgSome users may accidentally <quote>bounce</quote> on a key when they release it.
2050cbfda780SmrgThey press it once, then accidentally press it again after they release it. The
2051cbfda780Smrg<emphasis>BounceKeys</emphasis>
2052cbfda780Smrgcontrol temporarily disables a key after it has been pressed, effectively
2053cbfda780Smrg<quote>debouncing</quote> the keyboard. The period of time the key is disabled
2054cbfda780Smrgafter it is released is known as the
2055cbfda780Smrg<firstterm>BounceKeys delay</firstterm>.
2056cbfda780Smrg<emphasis>BounceKeys</emphasis>
2057cbfda780Smrgis a boolean control.
20580f8248bfSmrg</para>
20590f8248bfSmrg
20600f8248bfSmrg
20610f8248bfSmrg<para>
2062cbfda780SmrgWhen the
2063cbfda780Smrg<emphasis>BounceKeys</emphasis>
2064cbfda780Smrgcontrol is active, the server reports acceptance or rejection of any key to
2065cbfda780Smrginterested clients by sending an appropriate
2066cbfda780Smrg<emphasis>AccessXNotify</emphasis>
2067cbfda780Smrgevent (see <link linkend="AccessXNotify_Events">section 10.6.4</link>).
20680f8248bfSmrg</para>
20690f8248bfSmrg
20700f8248bfSmrg
20710f8248bfSmrg<para>
2072cbfda780SmrgThere are no convenience functions in Xkb for manipulating this control. The
20730f8248bfSmrg<emphasis>BounceKeys</emphasis>
2074cbfda780Smrgcontrol settings are carried in the
2075cbfda780Smrg<structfield>debounce_delay</structfield>
2076cbfda780Smrgfield of an
2077cbfda780Smrg<structname>XkbControlsRec</structname>
2078cbfda780Smrgstructure, discussed in <link linkend="The_XkbControlsRec_Structure">section 10.8</link>.
2079e9fcaa8aSmrg</para>
2080e9fcaa8aSmrg
2081e9fcaa8aSmrg</sect2>
2082eb411b4bSmrg<sect2 id='The_StickyKeys_Control'>
2083e9fcaa8aSmrg<title>The StickyKeys Control</title>
2084e9fcaa8aSmrg
2085e9fcaa8aSmrg<para>
2086e9fcaa8aSmrgSome people find it difficult or even impossible to press two keys at once. For
2087e9fcaa8aSmrgexample, a one-fingered typist or someone using a mouth stick cannot press the
20880f8248bfSmrg<keycap>Shift</keycap>
20890f8248bfSmrgand
20900f8248bfSmrg<keycap>1</keycap>
20910f8248bfSmrgkeys at the same time. The
20920f8248bfSmrg<emphasis>StickyKeys</emphasis>
20930f8248bfSmrgcontrol solves this problem by changing the behavior of the modifier keys.
20940f8248bfSmrgWith
20950f8248bfSmrg<emphasis>StickyKeys</emphasis>,
20960f8248bfSmrgthe user can first press a modifier, release it, then press another key. For
2097e9fcaa8aSmrgexample, to get an exclamation point on a PC-style keyboard, the user can press
20980f8248bfSmrgthe
20990f8248bfSmrg<keycap>Shift</keycap>
21000f8248bfSmrgkey, release it, and then press the
21010f8248bfSmrg<keycap>1</keycap>
21020f8248bfSmrgkey.
2103e9fcaa8aSmrg</para>
2104e9fcaa8aSmrg
2105e9fcaa8aSmrg
2106e9fcaa8aSmrg<para>
21070f8248bfSmrg<emphasis>StickyKeys</emphasis>
21080f8248bfSmrgalso allows users to lock modifier keys without requiring special locking
21090f8248bfSmrgkeys. When
21100f8248bfSmrg<emphasis>StickyKeys</emphasis>
21110f8248bfSmrgis enabled, a modifier is latched when the user presses it just once. The user
2112e9fcaa8aSmrgcan press a modifier twice in a row to lock it, and then unlock it by pressing
2113e9fcaa8aSmrgit one more time.
2114e9fcaa8aSmrg</para>
2115e9fcaa8aSmrg
2116e9fcaa8aSmrg
2117e9fcaa8aSmrg<para>
2118e9fcaa8aSmrgWhen a modifier is latched, it becomes unlatched when the user presses a
2119e9fcaa8aSmrgnonmodifier key or a pointer button. For instance, to enter the sequence
21200f8248bfSmrg<keycombo>
21210f8248bfSmrg<keycap>Shift</keycap>
21220f8248bfSmrg<keycap>Control</keycap>
21230f8248bfSmrg<keycap>Z</keycap>
21240f8248bfSmrg</keycombo>
21250f8248bfSmrgthe user could press and release the
21260f8248bfSmrg<keycap>Shift</keycap>
21270f8248bfSmrgkey to latch it, then press and release the
21280f8248bfSmrg<keycap>Control</keycap>
21290f8248bfSmrgkey to latch it, and finally press and release the
21300f8248bfSmrg<keycap>Z</keycap> key. Because the
21310f8248bfSmrg<keycap>Control</keycap>
21320f8248bfSmrgkey is a modifier key, pressing it does not unlatch the
21330f8248bfSmrg<keycap>Shift</keycap>
21340f8248bfSmrgkey. Thus, after the user presses the
21350f8248bfSmrg<keycap>Control</keycap>
21360f8248bfSmrgkey, both the
21370f8248bfSmrg<symbol>Shift</symbol>
21380f8248bfSmrgand
21390f8248bfSmrg<symbol>Control</symbol>
21400f8248bfSmrgmodifiers are latched. When the user presses the
21410f8248bfSmrg<keycap>Z</keycap>
21420f8248bfSmrgkey, the effect is as though the user had pressed
21430f8248bfSmrg<keycombo>
21440f8248bfSmrg<keycap>Shift</keycap>
21450f8248bfSmrg<keycap>Control</keycap>
21460f8248bfSmrg<keycap>Z</keycap>
21470f8248bfSmrg</keycombo>.
21480f8248bfSmrgIn addition, because the
21490f8248bfSmrg<keycap>Z</keycap>
21500f8248bfSmrgkey is not a modifier key, the
21510f8248bfSmrg<symbol>Shift</symbol>
21520f8248bfSmrgand
21530f8248bfSmrg<symbol>Control</symbol>
21540f8248bfSmrgmodifiers are unlatched.
2155e9fcaa8aSmrg</para>
2156e9fcaa8aSmrg
2157e9fcaa8aSmrg
2158e9fcaa8aSmrg<para>
2159e9fcaa8aSmrgLocking a modifier key means that the modifier affects any key or pointer
2160e9fcaa8aSmrgbutton the user presses until the user unlocks it or it is unlocked
2161e9fcaa8aSmrgprogrammatically. For example, to enter the sequence ("XKB") on a keyboard
2162e9fcaa8aSmrgwhere ‘(’ is a shifted ‘9’, ‘)’ is a shifted ‘0’, and ‘"’
21630f8248bfSmrgis a shifted single quote, the user could press and release the
21640f8248bfSmrg<keycap>Shift</keycap>
21650f8248bfSmrgkey twice to lock the
21660f8248bfSmrg<symbol>Shift</symbol>
21670f8248bfSmrgmodifier. Then, when the user presses the
21680f8248bfSmrg<keycap>9</keycap>,
21690f8248bfSmrg<keycap>'</keycap>,
21700f8248bfSmrg<keycap>x</keycap>,
21710f8248bfSmrg<keycap>k</keycap>,
21720f8248bfSmrg<keycap>b</keycap>,
21730f8248bfSmrg<keycap>'</keycap>,
21740f8248bfSmrgand
21750f8248bfSmrg<keycap>0</keycap>
21760f8248bfSmrgkeys in sequence, it generates ("XKB"). To unlock the
21770f8248bfSmrg<symbol>Shift</symbol>
21780f8248bfSmrgmodifier, the user can press and release the
21790f8248bfSmrg<keycap>Shift</keycap>
21800f8248bfSmrgkey.
2181e9fcaa8aSmrg</para>
2182e9fcaa8aSmrg
2183e9fcaa8aSmrg
2184e9fcaa8aSmrg<para>
2185e9fcaa8aSmrg<emphasis>StickyKeys</emphasis>
21860f8248bfSmrgis a boolean control with two separate attributes that may be individually
2187e9fcaa8aSmrgconfigured: one to automatically disable it, and one to control the latching
2188e9fcaa8aSmrgbehavior of modifier keys.
2189e9fcaa8aSmrg</para>
2190e9fcaa8aSmrg
2191eb411b4bSmrg<sect3 id='StickyKeys_Options'>
2192e9fcaa8aSmrg<title>StickyKeys Options</title>
2193e9fcaa8aSmrg
2194e9fcaa8aSmrg<para>
21950f8248bfSmrgThe
21960f8248bfSmrg<emphasis>StickyKeys</emphasis>
21970f8248bfSmrgcontrol has two options that can be accessed via the
21980f8248bfSmrg<structfield>ax_options</structfield>
21990f8248bfSmrgof an
22000f8248bfSmrg<structname>XkbControlsRec</structname>
22010f8248bfSmrgstructure (see <link linkend="The_XkbControlsRec_Structure">section 10.8</link>). The first option,
22020f8248bfSmrg<emphasis>TwoKeys</emphasis>,
22030f8248bfSmrgspecifies whether
22040f8248bfSmrg<emphasis>StickyKeys</emphasis>
22050f8248bfSmrgshould automatically turn off when two keys are pressed at the same time. This
2206e9fcaa8aSmrgfeature is useful for shared computers so people who do not want them do not
22070f8248bfSmrgneed to turn
22080f8248bfSmrg<emphasis>StickyKeys</emphasis>
22090f8248bfSmrgoff if a previous user left
22100f8248bfSmrg<emphasis>StickyKeys</emphasis>
22110f8248bfSmrgon. The second option,
22120f8248bfSmrg<emphasis>LatchToLock</emphasis>,
22130f8248bfSmrgspecifies whether or not
22140f8248bfSmrg<emphasis>StickyKeys</emphasis>
22150f8248bfSmrglocks a modifier when pressed twice in a row.
2216e9fcaa8aSmrg</para>
2217e9fcaa8aSmrg
22180f8248bfSmrg<para>
2219cbfda780SmrgThere are no convenience functions in Xkb for manipulating this control. The
22200f8248bfSmrg<emphasis>StickyKeys</emphasis>
2221cbfda780Smrgcontrol settings are carried in the
2222cbfda780Smrg<structfield>ax_options</structfield>
2223cbfda780Smrgfield of an
2224cbfda780Smrg<structname>XkbControlsRec</structname>
2225cbfda780Smrgstructure, discussed in <link linkend="The_XkbControlsRec_Structure">section 10.8</link>.
2226e9fcaa8aSmrg</para>
2227e9fcaa8aSmrg
2228e9fcaa8aSmrg</sect3>
2229e9fcaa8aSmrg</sect2>
2230e9fcaa8aSmrg</sect1>
2231eb411b4bSmrg<sect1 id='Controls_for_General_Keyboard_Mapping'>
2232e9fcaa8aSmrg<title>Controls for General Keyboard Mapping</title>
2233e9fcaa8aSmrg
2234e9fcaa8aSmrg<para>
2235e9fcaa8aSmrgThere are several controls that apply to the keyboard mapping in general. They
2236e9fcaa8aSmrgcontrol handling of out-of-range group indices and how modifiers are processed
2237e9fcaa8aSmrgand consumed in the server. These are:
2238e9fcaa8aSmrg
22390f8248bfSmrg  <simplelist type='vert' columns='1'>
22400f8248bfSmrg    <member><emphasis>GroupsWrap</emphasis></member>
22410f8248bfSmrg    <member><emphasis>IgnoreGroupLock</emphasis></member>
22420f8248bfSmrg    <member><emphasis>IgnoreLockMods</emphasis></member>
22430f8248bfSmrg    <member><emphasis>InternalMods</emphasis></member>
22440f8248bfSmrg  </simplelist>
2245e9fcaa8aSmrg</para>
2246e9fcaa8aSmrg
2247e9fcaa8aSmrg<para>
22480f8248bfSmrg<emphasis>IgnoreGroupLock</emphasis>
22490f8248bfSmrgis a boolean control; the rest are always active.
2250e9fcaa8aSmrg</para>
2251e9fcaa8aSmrg
2252e9fcaa8aSmrg
2253e9fcaa8aSmrg<para>
2254e9fcaa8aSmrgWithout the modifier processing options provided by Xkb, passive grabs set via
22550f8248bfSmrgtranslations in a client (for example,
22560f8248bfSmrg<emphasis>Alt&lt;KeyPress&gt;space</emphasis>)
22570f8248bfSmrgdo not trigger if any modifiers other than those specified by the translation
22580f8248bfSmrgare set. This results in problems in the user interface when either
22590f8248bfSmrg<emphasis>NumLock</emphasis>
22600f8248bfSmrgor a secondary keyboard group is active. The
22610f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
22620f8248bfSmrgand
22630f8248bfSmrg<emphasis>IgnoreGroupLock</emphasis>
22640f8248bfSmrgcontrols make it possible to avoid this behavior without exhaustively
2265e9fcaa8aSmrgspecifying a grab for every possible modifier combination.
2266e9fcaa8aSmrg</para>
2267e9fcaa8aSmrg
2268eb411b4bSmrg<sect2 id='The_GroupsWrap_Control'>
2269e9fcaa8aSmrg<title>The GroupsWrap Control</title>
2270e9fcaa8aSmrg
2271e9fcaa8aSmrg<para>
22720f8248bfSmrgThe
22730f8248bfSmrg<emphasis>GroupsWrap</emphasis>
22740f8248bfSmrgcontrol determines how illegal groups are handled on a global basis. There are
2275e9fcaa8aSmrga number of valid keyboard sequences that can cause the effective group number
2276e9fcaa8aSmrgto go out of range. When this happens, the group must be normalized back to a
22770f8248bfSmrgvalid number. The
22780f8248bfSmrg<emphasis>GroupsWrap</emphasis>
22790f8248bfSmrgcontrol specifies how this is done.
2280e9fcaa8aSmrg</para>
2281e9fcaa8aSmrg
2282e9fcaa8aSmrg
2283e9fcaa8aSmrg<para>
2284e9fcaa8aSmrgWhen dealing with group numbers, all computations are done using the group
2285e9fcaa8aSmrgindex, which is the group number minus one. There are three different
22860f8248bfSmrgalgorithms; the
22870f8248bfSmrg<emphasis>GroupsWrap</emphasis>
22880f8248bfSmrgcontrol specifies which one is used:
2289e9fcaa8aSmrg</para>
2290e9fcaa8aSmrg
2291e9fcaa8aSmrg<itemizedlist>
2292e9fcaa8aSmrg<listitem>
2293e9fcaa8aSmrg  <para>XkbRedirectIntoRange</para>
2294e9fcaa8aSmrg  <para>
2295e9fcaa8aSmrgAll invalid group numbers are converted to a valid group number by taking the
22960f8248bfSmrglast four bits of the
22970f8248bfSmrg<emphasis>GroupsWrap</emphasis>
22980f8248bfSmrgcontrol and using them as the group index. If the result is still out of
2299e9fcaa8aSmrgrange, Group one is used.
2300e9fcaa8aSmrg  </para>
2301e9fcaa8aSmrg</listitem>
2302e9fcaa8aSmrg<listitem>
2303e9fcaa8aSmrg  <para>
2304e9fcaa8aSmrgXkbClampIntoRange
2305e9fcaa8aSmrg  </para>
2306e9fcaa8aSmrg  <para>
2307e9fcaa8aSmrgAll invalid group numbers are converted to the nearest valid group number.
2308e9fcaa8aSmrgGroup numbers larger than the highest supported group number are mapped to the
2309e9fcaa8aSmrghighest supported group; those less than one are mapped to group one.
2310e9fcaa8aSmrg  </para>
2311e9fcaa8aSmrg</listitem>
2312e9fcaa8aSmrg<listitem>
2313e9fcaa8aSmrg  <para>XkbWrapIntoRange</para>
2314e9fcaa8aSmrg  <para>
2315e9fcaa8aSmrgAll invalid group numbers are converted to a valid group number using integer
2316e9fcaa8aSmrgmodulus applied to the group index.
2317e9fcaa8aSmrg  </para>
2318e9fcaa8aSmrg</listitem>
2319e9fcaa8aSmrg</itemizedlist>
2320e9fcaa8aSmrg
2321e9fcaa8aSmrg<para>
23220f8248bfSmrgThere are no convenience functions for manipulating the
23230f8248bfSmrg<emphasis>GroupsWrap</emphasis>
23240f8248bfSmrgcontrol. Manipulate the
23250f8248bfSmrg<emphasis>GroupsWrap</emphasis>
23260f8248bfSmrgcontrol via the
23270f8248bfSmrg<structfield>groups_wrap</structfield>
23280f8248bfSmrgfield in the
23290f8248bfSmrg<structname>XkbControlsRec</structname>
23300f8248bfSmrgstructure, then use
23310f8248bfSmrg<function>XkbSetControls</function>
23320f8248bfSmrgand
23330f8248bfSmrg<function>XkbGetControls</function>
23340f8248bfSmrg(see <link linkend="Querying_Controls">section 10.9</link> and <link linkend="Changing_Controls">section 10.10</link>) to query and change this control.
2335e9fcaa8aSmrg</para>
2336e9fcaa8aSmrg
23370f8248bfSmrg<note><para>See also <link linkend="Per_Key_Group_Information">section 15.3.2</link> or a discussion of the related field,
23380f8248bfSmrg<structfield>group_info</structfield>,
23390f8248bfSmrgwhich also normalizes a group under certain circumstances.</para></note>
2340e9fcaa8aSmrg
2341e9fcaa8aSmrg</sect2>
2342eb411b4bSmrg<sect2 id='The_IgnoreLockMods_Control'>
2343e9fcaa8aSmrg<title>The IgnoreLockMods Control</title>
2344e9fcaa8aSmrg
2345e9fcaa8aSmrg<para>
2346e9fcaa8aSmrgThe core protocol does not provide a way to exclude specific modifiers from
2347e9fcaa8aSmrggrab calculations, with the result that locking modifiers sometimes have
2348e9fcaa8aSmrgunanticipated side effects.
2349e9fcaa8aSmrg</para>
2350e9fcaa8aSmrg
2351e9fcaa8aSmrg
2352e9fcaa8aSmrg<para>
23530f8248bfSmrgThe
23540f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
23550f8248bfSmrgcontrol specifies modifiers that should be excluded from grab calculations.
23560f8248bfSmrgThese modifiers are also not reported in any core events except
23570f8248bfSmrg<symbol>KeyPress</symbol>
23580f8248bfSmrgand
23590f8248bfSmrg<symbol>KeyRelease</symbol>
23600f8248bfSmrgevents that do not activate a passive grab and that do not occur while a grab
2361e9fcaa8aSmrgis active.
2362e9fcaa8aSmrg</para>
2363e9fcaa8aSmrg
2364e9fcaa8aSmrg
2365e9fcaa8aSmrg<para>
23660f8248bfSmrgManipulate the
23670f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
23680f8248bfSmrgcontrol via the
23690f8248bfSmrg<structfield>ignore_lock</structfield>
23700f8248bfSmrgfield in the
23710f8248bfSmrg<structname>XkbControlsRec</structname>
23720f8248bfSmrgstructure, then use
23730f8248bfSmrg<function>XkbSetControls</function>
23740f8248bfSmrgand
23750f8248bfSmrg<function>XkbGetControls</function>
23760f8248bfSmrg(see <link linkend="Querying_Controls">section 10.9</link> and <link linkend="Changing_Controls">section 10.10</link>) to query and change this control. Alternatively,
23770f8248bfSmrguse
23780f8248bfSmrg<function>XkbSetIgnoreLockMods</function>.
2379e9fcaa8aSmrg</para>
2380e9fcaa8aSmrg
23810f8248bfSmrg
23820f8248bfSmrg<para>
23830f8248bfSmrgTo set the modifiers that, if locked, are not to be reported in matching events
23840f8248bfSmrgto passive grabs, use
23850f8248bfSmrg<function>XkbSetIgnoreLockMods</function>.
23860f8248bfSmrg</para>
23870f8248bfSmrg
23880f8248bfSmrg<indexterm significance="preferred" zone="XkbSetIgnoreLockMods"><primary><function>XkbSetIgnoreLockMods</function></primary></indexterm>
23890f8248bfSmrg<funcsynopsis id="XkbSetIgnoreLockMods">
23900f8248bfSmrg  <funcprototype>
23910f8248bfSmrg    <funcdef>Bool <function>XkbSetIgnoreLockMods</function></funcdef>
23920f8248bfSmrg<!-- (
23930f8248bfSmrg<parameter>display, device_spec, affect_real, real_values, affect_virtual,
23940f8248bfSmrgvirtual_values</parameter>
23950f8248bfSmrg) -->
23960f8248bfSmrg
23970f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
23980f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
23990f8248bfSmrg    <paramdef>unsigned int <parameter>affect_real</parameter></paramdef>
24000f8248bfSmrg    <paramdef>unsigned int <parameter>real_values</parameter></paramdef>
24010f8248bfSmrg    <paramdef>unsigned int <parameter>affect_virtual</parameter></paramdef>
24020f8248bfSmrg    <paramdef>unsigned int <parameter>virtual_values</parameter></paramdef>
24030f8248bfSmrg  </funcprototype>
24040f8248bfSmrg</funcsynopsis>
24050f8248bfSmrg<variablelist>
24060f8248bfSmrg  <varlistentry>
24070f8248bfSmrg    <term>
24080f8248bfSmrg      <parameter>display</parameter>
24090f8248bfSmrg    </term>
24100f8248bfSmrg    <listitem>
24110f8248bfSmrg      <para>
24120f8248bfSmrg        connection to the X server
24130f8248bfSmrg      </para>
24140f8248bfSmrg    </listitem>
24150f8248bfSmrg  </varlistentry>
24160f8248bfSmrg  <varlistentry>
24170f8248bfSmrg    <term>
24180f8248bfSmrg      <parameter>device_spec</parameter>
24190f8248bfSmrg    </term>
24200f8248bfSmrg    <listitem>
24210f8248bfSmrg      <para>
24220f8248bfSmrg        device ID, or <symbol>XkbUseCoreKbd</symbol>
24230f8248bfSmrg      </para>
24240f8248bfSmrg    </listitem>
24250f8248bfSmrg  </varlistentry>
24260f8248bfSmrg  <varlistentry>
24270f8248bfSmrg    <term>
24280f8248bfSmrg      <parameter>affect_real</parameter>
24290f8248bfSmrg    </term>
24300f8248bfSmrg    <listitem>
24310f8248bfSmrg      <para>
24320f8248bfSmrg        mask of real modifiers affected by this call
24330f8248bfSmrg      </para>
24340f8248bfSmrg    </listitem>
24350f8248bfSmrg  </varlistentry>
24360f8248bfSmrg  <varlistentry>
24370f8248bfSmrg    <term>
24380f8248bfSmrg      <parameter>real_values</parameter>
24390f8248bfSmrg    </term>
24400f8248bfSmrg    <listitem>
24410f8248bfSmrg      <para>
24420f8248bfSmrg        values for affected real modifiers (1&rArr;set, 0&rArr;unset)
24430f8248bfSmrg      </para>
24440f8248bfSmrg    </listitem>
24450f8248bfSmrg  </varlistentry>
24460f8248bfSmrg  <varlistentry>
24470f8248bfSmrg    <term>
24480f8248bfSmrg      <parameter>affect_virtual</parameter>
24490f8248bfSmrg    </term>
24500f8248bfSmrg    <listitem>
24510f8248bfSmrg      <para>
24520f8248bfSmrg        mask of virtual modifiers affected by this call
24530f8248bfSmrg      </para>
24540f8248bfSmrg    </listitem>
24550f8248bfSmrg  </varlistentry>
24560f8248bfSmrg  <varlistentry>
24570f8248bfSmrg    <term>
24580f8248bfSmrg      <parameter>virtual_values</parameter>
24590f8248bfSmrg    </term>
24600f8248bfSmrg    <listitem>
24610f8248bfSmrg      <para>
24620f8248bfSmrg        values for affected virtual modifiers (1&rArr;set, 0&rArr;unset)
24630f8248bfSmrg      </para>
24640f8248bfSmrg    </listitem>
24650f8248bfSmrg  </varlistentry>
24660f8248bfSmrg</variablelist>
24670f8248bfSmrg
24680f8248bfSmrg<para>
24690f8248bfSmrg<function>XkbSetIgnoreLockMods</function>
24700f8248bfSmrgsends a request to the server to change the server’s
24710f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
24720f8248bfSmrgcontrol.
24730f8248bfSmrg<parameter>affect_real</parameter>
24740f8248bfSmrgand
24750f8248bfSmrg<parameter>real_values</parameter>
24760f8248bfSmrgare masks of real modifier bits indicating which real modifiers are to be
24770f8248bfSmrgadded and removed from the server’s
24780f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
24790f8248bfSmrgcontrol. Modifiers selected by both
24800f8248bfSmrg<parameter>affect_real</parameter>
24810f8248bfSmrgand
24820f8248bfSmrg<parameter>real_values</parameter>
24830f8248bfSmrgare added to the server’s
24840f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
24850f8248bfSmrgcontrol; those selected by
24860f8248bfSmrg<parameter>affect_real</parameter>
24870f8248bfSmrgbut not by
24880f8248bfSmrg<parameter>real_values</parameter>
24890f8248bfSmrgare removed from the server’s
24900f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
24910f8248bfSmrgcontrol. Valid values for
24920f8248bfSmrg<parameter>affect_real</parameter>
24930f8248bfSmrgand
24940f8248bfSmrg<parameter>real_values</parameter>
24950f8248bfSmrgconsist of any combination of the eight core modifier bits:
24960f8248bfSmrg<symbol>ShiftMask</symbol>,
24970f8248bfSmrg<symbol>LockMask</symbol>,
24980f8248bfSmrg<symbol>ControlMask</symbol>,
24990f8248bfSmrg<symbol>Mod1Mask</symbol>
25000f8248bfSmrg&ndash;
25010f8248bfSmrg<symbol>Mod5Mask</symbol>.
25020f8248bfSmrg<parameter>affect_virtual</parameter>
25030f8248bfSmrgand
25040f8248bfSmrg<parameter>virtual_values</parameter>
25050f8248bfSmrgare masks of virtual modifier bits indicating which virtual modifiers are to
25060f8248bfSmrgbe added and removed from the server’s
25070f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
25080f8248bfSmrgcontrol. Modifiers selected by both
25090f8248bfSmrg<parameter>affect_virtual</parameter>
25100f8248bfSmrgand
25110f8248bfSmrg<parameter>virtual_values</parameter>
25120f8248bfSmrgare added to the server’s
25130f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
25140f8248bfSmrgcontrol; those selected by
25150f8248bfSmrg<parameter>affect_virtual</parameter>
25160f8248bfSmrgbut not by
25170f8248bfSmrg<parameter>virtual_values</parameter>
25180f8248bfSmrgare removed from the server’s
25190f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
25200f8248bfSmrgcontrol.
25210f8248bfSmrgSee <link linkend="Virtual_Modifier_Names_and_Masks">section 7.1</link> for a discussion of virtual modifier masks to use in
25220f8248bfSmrg<parameter>affect_virtual</parameter>
25230f8248bfSmrgand
25240f8248bfSmrg<parameter>virtual_values</parameter>.
25250f8248bfSmrg<function>XkbSetIgnoreLockMods</function>
25260f8248bfSmrgdoes not wait for a reply from the server. It returns
25270f8248bfSmrg<symbol>True</symbol>
25280f8248bfSmrgif the request was sent, and
25290f8248bfSmrg<symbol>False</symbol>
25300f8248bfSmrgotherwise.
2531e9fcaa8aSmrg</para>
2532e9fcaa8aSmrg
2533e9fcaa8aSmrg</sect2>
2534eb411b4bSmrg<sect2 id='The_IgnoreGroupLock_Control'>
2535e9fcaa8aSmrg<title>The IgnoreGroupLock Control</title>
2536e9fcaa8aSmrg
2537e9fcaa8aSmrg<para>
25380f8248bfSmrgThe
25390f8248bfSmrg<emphasis>IgnoreGroupLock</emphasis>
25400f8248bfSmrgcontrol is a boolean control with no attributes. If enabled, it specifies that
2541e9fcaa8aSmrgthe locked state of the keyboard group should not be considered when activating
2542e9fcaa8aSmrgpassive grabs.
2543e9fcaa8aSmrg</para>
2544e9fcaa8aSmrg
2545e9fcaa8aSmrg<para>
25460f8248bfSmrgBecause
25470f8248bfSmrg<emphasis>IgnoreGroupLock</emphasis>
25480f8248bfSmrgis a boolean control with no attributes, use the general boolean controls
25490f8248bfSmrgfunctions (see <link linkend="Controls_that_Enable_and_Disable_Other_Controls">section 10.1</link>) to change its state.
2550e9fcaa8aSmrg</para>
2551e9fcaa8aSmrg
2552e9fcaa8aSmrg
2553e9fcaa8aSmrg</sect2>
2554eb411b4bSmrg<sect2 id='The_InternalMods_Control'>
2555e9fcaa8aSmrg<title>The InternalMods Control</title>
2556e9fcaa8aSmrg
2557e9fcaa8aSmrg<para>
2558e9fcaa8aSmrgThe core protocol does not provide any means to prevent a modifier from being
2559e9fcaa8aSmrgreported in events sent to clients; Xkb, however makes this possible via the
25600f8248bfSmrg<emphasis>InternalMods</emphasis>
25610f8248bfSmrgcontrol. It specifies modifiers that should be consumed by the server and not
2562e9fcaa8aSmrgreported to clients. When a key is pressed and a modifier that has its bit set
25630f8248bfSmrgin the
25640f8248bfSmrg<emphasis>InternalMods</emphasis>
25650f8248bfSmrgcontrol is reported to the server, the server uses the modifier when
2566e9fcaa8aSmrgdetermining the actions to apply for the key. The server then clears the bit,
2567e9fcaa8aSmrgso it is not actually reported to the client. In addition, modifiers specified
25680f8248bfSmrgin the
25690f8248bfSmrg<emphasis>InternalMods</emphasis>
25700f8248bfSmrgcontrol are not used to determine grabs and are not used to calculate core
2571e9fcaa8aSmrgprotocol compatibility state.
2572e9fcaa8aSmrg</para>
2573e9fcaa8aSmrg
2574e9fcaa8aSmrg
2575e9fcaa8aSmrg<para>
25760f8248bfSmrgManipulate the
25770f8248bfSmrg<emphasis>InternalMods</emphasis>
25780f8248bfSmrgcontrol via the
25790f8248bfSmrg<structfield>internal</structfield>
25800f8248bfSmrgfield in the
25810f8248bfSmrg<structname>XkbControlsRec</structname>
25820f8248bfSmrgstructure, using
25830f8248bfSmrg<function>XkbSetControls</function>
25840f8248bfSmrgand
25850f8248bfSmrg<function>XkbGetControls</function>
25860f8248bfSmrg(see <link linkend="Querying_Controls">section 10.9</link>
25870f8248bfSmrgand <link linkend="Changing_Controls">section 10.10</link>). Alternatively, use
25880f8248bfSmrg<function>XkbSetServerInternalMods</function>.
2589e9fcaa8aSmrg</para>
2590e9fcaa8aSmrg
2591e9fcaa8aSmrg
2592e9fcaa8aSmrg<para>
2593e9fcaa8aSmrgTo set the modifiers that are consumed by the server before events are
25940f8248bfSmrgdelivered to the client, use
25950f8248bfSmrg<function>XkbSetServerInternalMods</function>.
25960f8248bfSmrg</para>
25970f8248bfSmrg
25980f8248bfSmrg<indexterm significance="preferred" zone="XkbSetServerInternalMods"><primary><function>XkbSetServerInternalMods</function></primary></indexterm>
25990f8248bfSmrg<funcsynopsis id="XkbSetServerInternalMods">
26000f8248bfSmrg  <funcprototype>
26010f8248bfSmrg    <funcdef>Bool <function>XkbSetServerInternalMods</function></funcdef>
26020f8248bfSmrg<!-- (
26030f8248bfSmrg<parameter>display, device_spec, affect_real, real_values, affect_virtual,
26040f8248bfSmrgvirtual_values</parameter>
26050f8248bfSmrg) -->
26060f8248bfSmrg
26070f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
26080f8248bfSmrg    <paramdef>unsigned int <parameter>device_spec</parameter></paramdef>
26090f8248bfSmrg    <paramdef>unsigned int <parameter>affect_real</parameter></paramdef>
26100f8248bfSmrg    <paramdef>unsigned int <parameter>real_values</parameter></paramdef>
26110f8248bfSmrg    <paramdef>unsigned int <parameter>affect_virtual</parameter></paramdef>
26120f8248bfSmrg    <paramdef>unsigned int <parameter>virtual_values</parameter></paramdef>
26130f8248bfSmrg  </funcprototype>
26140f8248bfSmrg</funcsynopsis>
26150f8248bfSmrg<variablelist>
26160f8248bfSmrg  <varlistentry>
26170f8248bfSmrg    <term>
26180f8248bfSmrg      <parameter>display</parameter>
26190f8248bfSmrg    </term>
26200f8248bfSmrg    <listitem>
26210f8248bfSmrg      <para>
26220f8248bfSmrg        connection to the X server
26230f8248bfSmrg      </para>
26240f8248bfSmrg    </listitem>
26250f8248bfSmrg  </varlistentry>
26260f8248bfSmrg  <varlistentry>
26270f8248bfSmrg    <term>
26280f8248bfSmrg      <parameter>device_spec</parameter>
26290f8248bfSmrg    </term>
26300f8248bfSmrg    <listitem>
26310f8248bfSmrg      <para>
26320f8248bfSmrg        ‘device ID, or <symbol>XkbUseCoreKbd</symbol>
26330f8248bfSmrg      </para>
26340f8248bfSmrg    </listitem>
26350f8248bfSmrg  </varlistentry>
26360f8248bfSmrg  <varlistentry>
26370f8248bfSmrg    <term>
26380f8248bfSmrg      <parameter>affect_real</parameter>
26390f8248bfSmrg    </term>
26400f8248bfSmrg    <listitem>
26410f8248bfSmrg      <para>
26420f8248bfSmrg        mask of real modifiers affected by this call
26430f8248bfSmrg      </para>
26440f8248bfSmrg    </listitem>
26450f8248bfSmrg  </varlistentry>
26460f8248bfSmrg  <varlistentry>
26470f8248bfSmrg    <term>
26480f8248bfSmrg      <parameter>real_values</parameter>
26490f8248bfSmrg    </term>
26500f8248bfSmrg    <listitem>
26510f8248bfSmrg      <para>
26520f8248bfSmrg        values for affected real modifiers (1&rArr;set, 0&rArr;unset)
26530f8248bfSmrg      </para>
26540f8248bfSmrg    </listitem>
26550f8248bfSmrg  </varlistentry>
26560f8248bfSmrg  <varlistentry>
26570f8248bfSmrg    <term>
26580f8248bfSmrg      <parameter>affect_virtual</parameter>
26590f8248bfSmrg    </term>
26600f8248bfSmrg    <listitem>
26610f8248bfSmrg      <para>
26620f8248bfSmrg        mask of virtual modifiers affected by this call
26630f8248bfSmrg      </para>
26640f8248bfSmrg    </listitem>
26650f8248bfSmrg  </varlistentry>
26660f8248bfSmrg  <varlistentry>
26670f8248bfSmrg    <term>
26680f8248bfSmrg      <parameter>virtual_values</parameter>
26690f8248bfSmrg    </term>
26700f8248bfSmrg    <listitem>
26710f8248bfSmrg      <para>
26720f8248bfSmrg        values for affected virtual modifiers (1&rArr;set, 0&rArr;unset)
26730f8248bfSmrg      </para>
26740f8248bfSmrg    </listitem>
26750f8248bfSmrg  </varlistentry>
26760f8248bfSmrg</variablelist>
26770f8248bfSmrg
26780f8248bfSmrg<para>
26790f8248bfSmrg<function>XkbSetServerInternalMods</function>
26800f8248bfSmrgsends a request to the server to change the internal modifiers consumed by the
26810f8248bfSmrgserver.
26820f8248bfSmrg<parameter>affect_real</parameter>
26830f8248bfSmrgand
26840f8248bfSmrg<parameter>real_values</parameter>
26850f8248bfSmrgare masks of real modifier bits indicating which real modifiers are to be
2686e9fcaa8aSmrgadded and removed from the server’s internal modifiers control. Modifiers
26870f8248bfSmrgselected by both
26880f8248bfSmrg<parameter>affect_real</parameter>
26890f8248bfSmrgand
26900f8248bfSmrg<parameter>real_values</parameter>
26910f8248bfSmrgare added to the server’s internal modifiers control; those selected by
26920f8248bfSmrg<parameter>affect_real</parameter>
26930f8248bfSmrgbut not by
26940f8248bfSmrg<parameter>real_values</parameter>
26950f8248bfSmrgare removed from the server’s internal modifiers mask. Valid values for
26960f8248bfSmrg<parameter>affect_real</parameter>
26970f8248bfSmrgand
26980f8248bfSmrg<parameter>real_values</parameter>
26990f8248bfSmrgconsist of any combination of the eight core modifier bits:
27000f8248bfSmrg<symbol>ShiftMask</symbol>,
27010f8248bfSmrg<symbol>LockMask</symbol>,
27020f8248bfSmrg<symbol>ControlMask</symbol>,
27030f8248bfSmrg<symbol>Mod1Mask</symbol>
27040f8248bfSmrg&ndash;
27050f8248bfSmrg<symbol>Mod5Mask</symbol>.
27060f8248bfSmrg<parameter>affect_virtual</parameter>
27070f8248bfSmrgand
27080f8248bfSmrg<parameter>virtual_values</parameter>
27090f8248bfSmrgare masks of virtual modifier bits indicating which virtual modifiers are to
2710e9fcaa8aSmrgbe added and removed from the server’s internal modifiers control. Modifiers
27110f8248bfSmrgselected by both
27120f8248bfSmrg<parameter>affect_virtual</parameter>
27130f8248bfSmrgand
27140f8248bfSmrg<parameter>virtual_values</parameter>
27150f8248bfSmrgare added to the server’s internal modifiers control; those selected by
27160f8248bfSmrg<parameter>affect_virtual</parameter>
27170f8248bfSmrgbut not by
27180f8248bfSmrg<parameter>virtual_values</parameter>
27190f8248bfSmrgare removed from the server’s internal modifiers control.
27200f8248bfSmrgSee <link linkend="Virtual_Modifier_Names_and_Masks">section 7.1</link> for a discussion of virtual modifier masks to use in
27210f8248bfSmrg<parameter>affect_virtual</parameter>
27220f8248bfSmrgand
27230f8248bfSmrg<parameter>virtual_values</parameter>.
27240f8248bfSmrg<function>XkbSetServerInternalMods</function>
27250f8248bfSmrgdoes not wait for a reply from the server. It returns
27260f8248bfSmrg<symbol>True</symbol>
27270f8248bfSmrgif the request was sent and
27280f8248bfSmrg<symbol>False</symbol>
27290f8248bfSmrgotherwise.
2730e9fcaa8aSmrg</para>
2731e9fcaa8aSmrg
2732e9fcaa8aSmrg
2733e9fcaa8aSmrg</sect2>
2734e9fcaa8aSmrg</sect1>
2735eb411b4bSmrg<sect1 id='The_XkbControlsRec_Structure'>
2736e9fcaa8aSmrg<title>The XkbControlsRec Structure</title>
2737e9fcaa8aSmrg
27380f8248bfSmrg<indexterm significance="preferred" zone="The_XkbControlsRec_Structure">
27390f8248bfSmrg<primary><structname>XkbControlsRec</structname></primary></indexterm>
27400f8248bfSmrg
2741e9fcaa8aSmrg<para>
2742e9fcaa8aSmrgMany of the individual controls described in sections 10.1 through 10.7 may be
2743e9fcaa8aSmrgmanipulated via convenience functions discussed in those sections. Some of
27440f8248bfSmrgthem, however, have no convenience functions. The
27450f8248bfSmrg<structname>XkbControlsRec</structname>
27460f8248bfSmrgstructure allows the manipulation of one or more of the controls in a single
27470f8248bfSmrgoperation and to track changes to any of them in conjunction with the
27480f8248bfSmrg<function>XkbGetControls</function>
27490f8248bfSmrgand
27500f8248bfSmrg<function>XkbSetControls</function>
27510f8248bfSmrgfunctions. This is the only way to manipulate those controls that have no
2752e9fcaa8aSmrgconvenience functions.
2753e9fcaa8aSmrg</para>
2754e9fcaa8aSmrg
2755e9fcaa8aSmrg
2756e9fcaa8aSmrg<para>
27570f8248bfSmrgThe
27580f8248bfSmrg<structname>XkbControlsRec</structname>
27590f8248bfSmrgstructure is defined as follows:
2760e9fcaa8aSmrg
2761e9fcaa8aSmrg<programlisting>
2762e9fcaa8aSmrg#define      XkbMaxLegalKeyCode       255
2763e9fcaa8aSmrg#define      XkbPerKeyBitArraySize    ((XkbMaxLegalKeyCode+1)/8)
27640f8248bfSmrg
2765e9fcaa8aSmrgtypedef struct {
27660f8248bfSmrg    unsigned char     mk_dflt_btn;       /* default button for
27670f8248bfSmrg                                             keyboard driven mouse */
27680f8248bfSmrg    unsigned char     num_groups;        /* number of keyboard groups */
27690f8248bfSmrg    unsigned char     groups_wrap;       /* how to wrap out-of-bounds groups */
27700f8248bfSmrg    XkbModsRec        internal;          /* defines server internal modifiers */
27710f8248bfSmrg    XkbModsRec        ignore_lock;       /* modifiers to ignore when
27720f8248bfSmrg                                             checking for grab */
27730f8248bfSmrg    unsigned int      enabled_ctrls;     /* 1 bit &rArr; corresponding
27740f8248bfSmrg                                             boolean control enabled */
27750f8248bfSmrg    unsigned short    repeat_delay;      /* ms delay until first repeat */
27760f8248bfSmrg    unsigned short    repeat_interval;   /* ms delay between repeats */
27770f8248bfSmrg    unsigned short    slow_keys_delay;   /* ms minimum time key must be
27780f8248bfSmrg                                             down to be ok */
27790f8248bfSmrg    unsigned short    debounce_delay;    /* ms delay before key reactivated */
27800f8248bfSmrg    unsigned short    mk_delay;          /* ms delay to second mouse
27810f8248bfSmrg                                             motion event */
27820f8248bfSmrg    unsigned short    mk_interval;       /* ms delay between repeat mouse
27830f8248bfSmrg                                             events */
27840f8248bfSmrg    unsigned short    mk_time_to_max;    /* # intervals until constant
27850f8248bfSmrg                                             mouse move */
27860f8248bfSmrg    unsigned short    mk_max_speed;      /* multiplier for maximum mouse speed */
27870f8248bfSmrg    short             mk_curve;          /* determines mouse move curve type */
27880f8248bfSmrg    unsigned short    ax_options;        /* 1 bit &rArr; Access X option enabled */
27890f8248bfSmrg    unsigned short    ax_timeout;        /* seconds until Access X disabled */
27900f8248bfSmrg    unsigned short    axt_opts_mask;     /* 1 bit &rArr; options to reset
27910f8248bfSmrg                                             on Access X timeout */
27920f8248bfSmrg    unsigned short    axt_opts_values;   /* 1 bit &rArr; turn option on, 0&rArr; off */
27930f8248bfSmrg    unsigned int      axt_ctrls_mask;    /* which bits in <structfield>enabled_ctrls</structfield>
27940f8248bfSmrg                                             to modify */
27950f8248bfSmrg    unsigned int      axt_ctrls_values;  /* values for new bits in
27960f8248bfSmrg                                             <structfield>enabled_ctrls</structfield> */
27970f8248bfSmrg    unsigned char     per_key_repeat[XkbPerKeyBitArraySize];
27980f8248bfSmrg                                         /* per key auto repeat */
27990f8248bfSmrg} <structname>XkbControlsRec</structname>, *XkbControlsPtr;
2800e9fcaa8aSmrg</programlisting>
2801e9fcaa8aSmrg</para>
2802e9fcaa8aSmrg
2803e9fcaa8aSmrg<para>
28040f8248bfSmrgThe general-purpose functions that work with the
28050f8248bfSmrg<structname>XkbControlsRec</structname>
28060f8248bfSmrgstructure use a mask to specify which controls are to be manipulated.
28070f8248bfSmrg<link linkend="table10.6">Table 10.6</link>
28080f8248bfSmrglists these controls, the masks used to select them in the general
28090f8248bfSmrgfunction calls
28100f8248bfSmrg(<structfield>which</structfield>
28110f8248bfSmrgparameter), and the data fields in the
28120f8248bfSmrg<structname>XkbControlsRec</structname>
28130f8248bfSmrgstructure that comprise each of the individual controls. Also listed are the
2814e9fcaa8aSmrgbit used to turn boolean controls on and off and the section where each control
2815e9fcaa8aSmrgis described in more detail.
2816e9fcaa8aSmrg</para>
2817e9fcaa8aSmrg
28180f8248bfSmrg<table id='table10.6' frame='topbot'>
2819e9fcaa8aSmrg<title>Xkb Controls</title>
2820eb411b4bSmrg<?dbfo keep-together="auto" ?>
2821eb411b4bSmrg<tgroup cols='5' align='left' colsep='0' rowsep='0'>
2822eb411b4bSmrg<colspec colname='c1' colwidth='2.0*'/>
2823eb411b4bSmrg<colspec colname='c2' colwidth='3.1*'/>
2824eb411b4bSmrg<colspec colname='c3' colwidth='2.2*'/>
2825eb411b4bSmrg<colspec colname='c4' colwidth='2.6*'/>
2826eb411b4bSmrg<colspec colname='c5' colwidth='1.0*'/>
2827e9fcaa8aSmrg<thead>
2828eb411b4bSmrg<row rowsep='1'>
2829e9fcaa8aSmrg  <entry>Control</entry>
2830e9fcaa8aSmrg  <entry>Control Selection Mask (which parameter)</entry>
2831e9fcaa8aSmrg  <entry>Relevant XkbControlsRec Data Fields</entry>
2832e9fcaa8aSmrg  <entry>Boolean Control enabled_ctrls bit</entry>
2833e9fcaa8aSmrg  <entry>Section</entry>
2834e9fcaa8aSmrg  </row>
2835e9fcaa8aSmrg</thead>
2836e9fcaa8aSmrg<tbody>
2837eb411b4bSmrg  <row>
2838e9fcaa8aSmrg    <entry>AccessXFeedback</entry>
28390f8248bfSmrg    <entry><symbol>XkbAccessXFeedbackMask</symbol></entry>
2840e9fcaa8aSmrg    <entry>ax_options:      XkbAX_*FBMask</entry>
2841eb411b4bSmrg    <entry>XkbAccessXFeedback&#xAD;Mask</entry>
28420f8248bfSmrg    <entry><link linkend="The_AccessXFeedback_Control">10.6.3</link></entry>
2843e9fcaa8aSmrg  </row>
2844eb411b4bSmrg  <row>
2845e9fcaa8aSmrg    <entry>AccessXKeys</entry>
2846e9fcaa8aSmrg    <entry></entry>
2847e9fcaa8aSmrg    <entry></entry>
2848eb411b4bSmrg    <entry>XkbAccessXKeys&#xAD;Mask</entry>
28490f8248bfSmrg    <entry><link linkend="The_AccessXKeys_Control">10.6.1</link></entry>
2850e9fcaa8aSmrg  </row>
2851eb411b4bSmrg  <row>
2852e9fcaa8aSmrg    <entry>AccessXTimeout</entry>
28530f8248bfSmrg    <entry><symbol>XkbAccessXTimeoutMask</symbol></entry>
2854e9fcaa8aSmrg    <entry>
2855e9fcaa8aSmrg      <para>ax_timeout</para>
2856e9fcaa8aSmrg      <para>axt_opts_mask</para>
2857e9fcaa8aSmrg      <para>axt_opts_values</para>
2858e9fcaa8aSmrg      <para>axt_ctrls_mask</para>
2859e9fcaa8aSmrg      <para>axt_ctrls_values</para>
2860e9fcaa8aSmrg    </entry>
2861eb411b4bSmrg    <entry>XkbAccessXTimeout&#xAD;Mask</entry>
28620f8248bfSmrg    <entry><link linkend="The_AccessXTimeout_Control">10.6.2</link></entry>
2863e9fcaa8aSmrg  </row>
2864eb411b4bSmrg  <row>
2865e9fcaa8aSmrg    <entry>AudibleBell</entry>
2866e9fcaa8aSmrg    <entry></entry>
2867e9fcaa8aSmrg    <entry></entry>
28680f8248bfSmrg    <entry><symbol>XkbAudibleBellMask</symbol></entry>
28690f8248bfSmrg    <entry><link linkend="Audible_Bells">9.2</link></entry>
2870e9fcaa8aSmrg  </row>
2871eb411b4bSmrg  <row>
2872e9fcaa8aSmrg    <entry>AutoReset</entry>
2873e9fcaa8aSmrg    <entry></entry>
2874e9fcaa8aSmrg    <entry></entry>
2875e9fcaa8aSmrg    <entry></entry>
28760f8248bfSmrg    <entry><link linkend="The_AutoReset_Control">10.1.2</link></entry>
2877e9fcaa8aSmrg  </row>
2878eb411b4bSmrg  <row>
2879e9fcaa8aSmrg    <entry>BounceKeys</entry>
28800f8248bfSmrg    <entry><symbol>XkbBounceKeysMask</symbol></entry>
2881e9fcaa8aSmrg    <entry>debounce_delay</entry>
28820f8248bfSmrg    <entry><symbol>XkbBounceKeysMask</symbol></entry>
28830f8248bfSmrg    <entry><link linkend="The_BounceKeys_Control">10.6.7</link></entry>
2884e9fcaa8aSmrg  </row>
2885eb411b4bSmrg  <row>
2886e9fcaa8aSmrg    <entry>Detectable-Autorepeat</entry>
2887e9fcaa8aSmrg    <entry></entry>
2888e9fcaa8aSmrg    <entry></entry>
2889e9fcaa8aSmrg    <entry></entry>
28900f8248bfSmrg    <entry><link linkend="The_DetectableAutorepeat_Control">10.3.3</link></entry>
2891e9fcaa8aSmrg  </row>
2892eb411b4bSmrg  <row>
2893e9fcaa8aSmrg    <entry>EnabledControls</entry>
28940f8248bfSmrg    <entry><symbol>XkbControlsEnabledMask</symbol></entry>
2895e9fcaa8aSmrg    <entry>enabled_ctrls</entry>
2896e9fcaa8aSmrg    <entry><emphasis>Non-Boolean Control</emphasis></entry>
28970f8248bfSmrg    <entry><link linkend="The_EnabledControls_Control">10.1.1</link></entry>
2898e9fcaa8aSmrg  </row>
2899eb411b4bSmrg  <row>
2900e9fcaa8aSmrg    <entry>GroupsWrap</entry>
29010f8248bfSmrg    <entry><symbol>XkbGroupsWrapMask</symbol></entry>
2902e9fcaa8aSmrg    <entry>groups_wrap</entry>
2903e9fcaa8aSmrg    <entry><emphasis>Non-Boolean Control</emphasis></entry>
29040f8248bfSmrg    <entry><link linkend="The_GroupsWrap_Control">10.7.1</link></entry>
2905e9fcaa8aSmrg  </row>
2906eb411b4bSmrg  <row>
2907e9fcaa8aSmrg    <entry>IgnoreGroupLock</entry>
2908e9fcaa8aSmrg    <entry></entry>
2909e9fcaa8aSmrg    <entry></entry>
2910eb411b4bSmrg    <entry>XkbIgnoreGroupLock&#xAD;Mask</entry>
29110f8248bfSmrg    <entry><link linkend="The_IgnoreGroupLock_Control">10.7.3</link></entry>
2912e9fcaa8aSmrg  </row>
2913eb411b4bSmrg  <row>
2914e9fcaa8aSmrg    <entry>IgnoreLockMods</entry>
29150f8248bfSmrg    <entry><symbol>XkbIgnoreLockModsMask</symbol></entry>
2916e9fcaa8aSmrg    <entry>ignore_lock</entry>
2917e9fcaa8aSmrg    <entry><emphasis>Non-Boolean Control</emphasis></entry>
29180f8248bfSmrg    <entry><link linkend="Keyboard_State_Description">5.1</link></entry>
2919e9fcaa8aSmrg  </row>
2920eb411b4bSmrg  <row>
2921e9fcaa8aSmrg    <entry>InternalMods</entry>
29220f8248bfSmrg    <entry><symbol>XkbInternalModsMask</symbol></entry>
2923e9fcaa8aSmrg    <entry>internal</entry>
2924e9fcaa8aSmrg    <entry><emphasis>Non-Boolean Control</emphasis></entry>
29250f8248bfSmrg    <entry><link linkend="Keyboard_State_Description">5.1</link></entry>
2926e9fcaa8aSmrg  </row>
2927eb411b4bSmrg  <row>
2928e9fcaa8aSmrg    <entry>MouseKeys</entry>
29290f8248bfSmrg    <entry><symbol>XkbMouseKeysMask</symbol></entry>
2930e9fcaa8aSmrg    <entry>mk_dflt_btn</entry>
29310f8248bfSmrg    <entry><symbol>XkbMouseKeysMask</symbol></entry>
29320f8248bfSmrg    <entry><link linkend="The_MouseKeys_Control">10.5.1</link></entry>
2933e9fcaa8aSmrg  </row>
2934eb411b4bSmrg  <row>
2935e9fcaa8aSmrg    <entry>MouseKeysAccel</entry>
29360f8248bfSmrg    <entry><symbol>XkbMouseKeysAccelMask</symbol></entry>
2937e9fcaa8aSmrg    <entry>
2938e9fcaa8aSmrg      <para>mk_delay</para>
2939e9fcaa8aSmrg      <para>mk_interval</para>
2940e9fcaa8aSmrg      <para>mk_time_to_max</para>
2941e9fcaa8aSmrg      <para>mk_max_speed</para>
2942e9fcaa8aSmrg      <para>mk_curve</para>
2943e9fcaa8aSmrg    </entry>
2944eb411b4bSmrg    <entry>XkbMouseKeysAccel&#xAD;Mask</entry>
29450f8248bfSmrg    <entry><link linkend="The_MouseKeysAccel_Control">10.5.2</link></entry>
2946e9fcaa8aSmrg  </row>
2947eb411b4bSmrg  <row>
2948e9fcaa8aSmrg    <entry>Overlay1</entry>
2949e9fcaa8aSmrg    <entry></entry>
2950e9fcaa8aSmrg    <entry></entry>
29510f8248bfSmrg    <entry><symbol>XkbOverlay1Mask</symbol></entry>
29520f8248bfSmrg    <entry><link linkend="Controls_for_Keyboard_Overlays_Overlay1_and_Overlay2_Controls">10.4</link></entry>
2953e9fcaa8aSmrg  </row>
2954eb411b4bSmrg  <row>
2955e9fcaa8aSmrg    <entry>Overlay2</entry>
2956e9fcaa8aSmrg    <entry></entry>
2957e9fcaa8aSmrg    <entry></entry>
29580f8248bfSmrg    <entry><symbol>XkbOverlay2Mask</symbol></entry>
29590f8248bfSmrg    <entry><link linkend="Controls_for_Keyboard_Overlays_Overlay1_and_Overlay2_Controls">10.4</link></entry>
2960e9fcaa8aSmrg  </row>
2961eb411b4bSmrg  <row>
2962e9fcaa8aSmrg    <entry>PerKeyRepeat</entry>
29630f8248bfSmrg    <entry><symbol>XkbPerKeyRepeatMask</symbol></entry>
2964e9fcaa8aSmrg    <entry>per_key_repeat</entry>
2965e9fcaa8aSmrg    <entry><emphasis>Non-Boolean Control</emphasis></entry>
29660f8248bfSmrg    <entry><link linkend="The_PerKeyRepeat_Control">10.3.1</link></entry>
2967e9fcaa8aSmrg  </row>
2968eb411b4bSmrg  <row>
2969e9fcaa8aSmrg    <entry>RepeatKeys</entry>
29700f8248bfSmrg    <entry><symbol>XkbRepeatKeysMask</symbol></entry>
2971e9fcaa8aSmrg    <entry>
2972e9fcaa8aSmrg      <para>repeat_delay</para>
2973e9fcaa8aSmrg      <para>repeat_interval</para>
2974e9fcaa8aSmrg    </entry>
29750f8248bfSmrg    <entry><symbol>XkbRepeatKeysMask</symbol></entry>
29760f8248bfSmrg    <entry><link linkend="Controls_for_Repeat_Key_Behavior">10.3</link></entry>
2977e9fcaa8aSmrg  </row>
2978eb411b4bSmrg  <row>
2979e9fcaa8aSmrg    <entry>SlowKeys</entry>
29800f8248bfSmrg    <entry><symbol>XkbSlowKeysMask</symbol></entry>
2981e9fcaa8aSmrg    <entry>slow_keys_delay</entry>
29820f8248bfSmrg    <entry><symbol>XkbSlowKeysMask</symbol></entry>
29830f8248bfSmrg    <entry><link linkend="The_SlowKeys_Control">10.6.6</link></entry>
2984e9fcaa8aSmrg  </row>
2985eb411b4bSmrg  <row>
2986e9fcaa8aSmrg    <entry>StickyKeys</entry>
29870f8248bfSmrg    <entry><symbol>XkbStickyKeysMask</symbol></entry>
2988e9fcaa8aSmrg    <entry>
2989e9fcaa8aSmrg      <para>ax_options:</para>
2990eb411b4bSmrg      <para>XkbAX_Two&#xAD;KeysMask</para>
2991eb411b4bSmrg      <para>XkbAX_Latch&#xAD;ToLockMask</para>
2992e9fcaa8aSmrg    </entry>
29930f8248bfSmrg    <entry><symbol>XkbStickyKeysMask</symbol></entry>
29940f8248bfSmrg    <entry><link linkend="The_StickyKeys_Control">10.6.8</link></entry>
2995e9fcaa8aSmrg  </row>
2996e9fcaa8aSmrg</tbody>
2997e9fcaa8aSmrg</tgroup>
2998e9fcaa8aSmrg</table>
2999e9fcaa8aSmrg
3000e9fcaa8aSmrg<para>
30010f8248bfSmrg<link linkend="table10.7">Table 10.7</link>
30020f8248bfSmrgshows the actual values for the individual mask bits used to select
3003e9fcaa8aSmrgcontrols for modification and to enable and disable the control. Note that the
3004e9fcaa8aSmrgsame mask bit is used to specify general modifications to the parameters used
30050f8248bfSmrgto configure the control
30060f8248bfSmrg(<structfield>which</structfield>),
30070f8248bfSmrgand to enable and disable the control
30080f8248bfSmrg(<structfield>enabled_ctrls</structfield>).
30090f8248bfSmrgThe anomalies in the table (no <quote>ok</quote> in column) are for controls that have no
3010e9fcaa8aSmrgconfigurable attributes; and for controls that are not boolean controls and
3011e9fcaa8aSmrgtherefore cannot be enabled or disabled.
3012e9fcaa8aSmrg</para>
3013e9fcaa8aSmrg
30140f8248bfSmrg<table id='table10.7' frame='topbot'>
3015e9fcaa8aSmrg<title>Controls Mask Bits</title>
3016eb411b4bSmrg<?dbfo keep-together="always" ?>
3017eb411b4bSmrg<tgroup cols='4' align='left' colsep='0' rowsep='0'>
3018eb411b4bSmrg<colspec colname='c1' colwidth='2.6*'/>
3019eb411b4bSmrg<colspec colname='c2' colwidth='2.0*'/>
3020eb411b4bSmrg<colspec colname='c3' colwidth='1.3*'/>
3021eb411b4bSmrg<colspec colname='c4' colwidth='2.0*'/>
3022e9fcaa8aSmrg<thead>
3023eb411b4bSmrg<row rowsep='1'>
3024e9fcaa8aSmrg  <entry>Mask Bit</entry>
3025e9fcaa8aSmrg  <entry>which or changed_ctrls</entry>
3026e9fcaa8aSmrg  <entry>enabled_ctrls</entry>
3027e9fcaa8aSmrg  <entry>Value</entry>
3028e9fcaa8aSmrg</row>
3029e9fcaa8aSmrg</thead>
3030e9fcaa8aSmrg<tbody>
3031eb411b4bSmrg<row>
30320f8248bfSmrg    <entry><symbol>XkbRepeatKeysMask</symbol></entry>
3033e9fcaa8aSmrg    <entry>ok</entry>
3034e9fcaa8aSmrg    <entry>ok</entry>
3035e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
3036e9fcaa8aSmrg  </row>
3037eb411b4bSmrg  <row>
30380f8248bfSmrg    <entry><symbol>XkbSlowKeysMask</symbol></entry>
3039e9fcaa8aSmrg    <entry>ok</entry>
3040e9fcaa8aSmrg    <entry>ok</entry>
3041e9fcaa8aSmrg    <entry>(1L&lt;&lt;1)</entry>
3042e9fcaa8aSmrg  </row>
3043eb411b4bSmrg  <row>
30440f8248bfSmrg    <entry><symbol>XkbBounceKeysMask</symbol></entry>
3045e9fcaa8aSmrg    <entry>ok</entry>
3046e9fcaa8aSmrg    <entry>ok</entry>
3047e9fcaa8aSmrg    <entry>(1L&lt;&lt;2)</entry>
3048e9fcaa8aSmrg  </row>
3049eb411b4bSmrg  <row>
30500f8248bfSmrg    <entry><symbol>XkbStickyKeysMask</symbol></entry>
3051e9fcaa8aSmrg    <entry>ok</entry>
3052e9fcaa8aSmrg    <entry>ok</entry>
3053e9fcaa8aSmrg    <entry>(1L&lt;&lt;3)</entry>
3054e9fcaa8aSmrg  </row>
3055eb411b4bSmrg  <row>
30560f8248bfSmrg    <entry><symbol>XkbMouseKeysMask</symbol></entry>
3057e9fcaa8aSmrg    <entry>ok</entry>
3058e9fcaa8aSmrg    <entry>ok</entry>
3059e9fcaa8aSmrg    <entry>(1L&lt;&lt;4)</entry>
3060e9fcaa8aSmrg  </row>
3061eb411b4bSmrg  <row>
30620f8248bfSmrg    <entry><symbol>XkbMouseKeysAccelMask</symbol></entry>
3063e9fcaa8aSmrg    <entry>ok</entry>
3064e9fcaa8aSmrg    <entry>ok</entry>
3065e9fcaa8aSmrg    <entry>(1L&lt;&lt;5)</entry>
3066e9fcaa8aSmrg  </row>
3067eb411b4bSmrg  <row>
30680f8248bfSmrg    <entry><symbol>XkbAccessXKeysMask</symbol></entry>
3069e9fcaa8aSmrg    <entry>ok</entry>
3070e9fcaa8aSmrg    <entry>ok</entry>
3071e9fcaa8aSmrg    <entry>(1L&lt;&lt;6)</entry>
3072e9fcaa8aSmrg  </row>
3073eb411b4bSmrg  <row>
30740f8248bfSmrg    <entry><symbol>XkbAccessXTimeoutMask</symbol></entry>
3075e9fcaa8aSmrg    <entry>ok</entry>
3076e9fcaa8aSmrg    <entry>ok</entry>
3077e9fcaa8aSmrg    <entry>(1L&lt;&lt;7)</entry>
3078e9fcaa8aSmrg  </row>
3079eb411b4bSmrg  <row>
30800f8248bfSmrg    <entry><symbol>XkbAccessXFeedbackMask</symbol></entry>
3081e9fcaa8aSmrg    <entry>ok</entry>
3082e9fcaa8aSmrg    <entry>ok</entry>
3083e9fcaa8aSmrg    <entry>(1L&lt;&lt;8)</entry>
3084e9fcaa8aSmrg  </row>
3085eb411b4bSmrg  <row>
30860f8248bfSmrg    <entry><symbol>XkbAudibleBellMask</symbol></entry>
3087e9fcaa8aSmrg    <entry></entry>
3088e9fcaa8aSmrg    <entry>ok</entry>
3089e9fcaa8aSmrg    <entry>(1L&lt;&lt;9)</entry>
3090e9fcaa8aSmrg  </row>
3091eb411b4bSmrg  <row>
30920f8248bfSmrg    <entry><symbol>XkbOverlay1Mask</symbol></entry>
3093e9fcaa8aSmrg    <entry></entry>
3094e9fcaa8aSmrg    <entry>ok</entry>
3095e9fcaa8aSmrg    <entry>(1L&lt;&lt;10)</entry>
3096e9fcaa8aSmrg  </row>
3097eb411b4bSmrg  <row>
30980f8248bfSmrg    <entry><symbol>XkbOverlay2Mask</symbol></entry>
3099e9fcaa8aSmrg    <entry></entry>
3100e9fcaa8aSmrg    <entry>ok</entry>
3101e9fcaa8aSmrg    <entry>(1L&lt;&lt;11)</entry>
3102e9fcaa8aSmrg  </row>
3103eb411b4bSmrg  <row>
31040f8248bfSmrg    <entry><symbol>XkbIgnoreGroupLockMask</symbol></entry>
3105e9fcaa8aSmrg    <entry></entry>
3106e9fcaa8aSmrg    <entry>ok</entry>
3107e9fcaa8aSmrg    <entry>(1L&lt;&lt;12)</entry>
3108e9fcaa8aSmrg</row>
3109eb411b4bSmrg<row>
31100f8248bfSmrg    <entry><symbol>XkbGroupsWrapMask</symbol></entry>
3111e9fcaa8aSmrg    <entry>ok</entry>
3112e9fcaa8aSmrg    <entry></entry>
3113e9fcaa8aSmrg    <entry>(1L&lt;&lt;27)</entry>
3114e9fcaa8aSmrg</row>
3115eb411b4bSmrg<row>
31160f8248bfSmrg    <entry><symbol>XkbInternalModsMask</symbol></entry>
3117e9fcaa8aSmrg    <entry>ok</entry>
3118e9fcaa8aSmrg    <entry></entry>
3119e9fcaa8aSmrg    <entry>(1L&lt;&lt;28)</entry>
3120e9fcaa8aSmrg</row>
3121eb411b4bSmrg<row>
31220f8248bfSmrg    <entry><symbol>XkbIgnoreLockModsMask</symbol></entry>
3123e9fcaa8aSmrg    <entry>ok</entry>
3124e9fcaa8aSmrg    <entry></entry>
3125e9fcaa8aSmrg    <entry>(1L&lt;&lt;29)</entry>
3126e9fcaa8aSmrg</row>
3127eb411b4bSmrg<row>
31280f8248bfSmrg    <entry><symbol>XkbPerKeyRepeatMask</symbol></entry>
3129e9fcaa8aSmrg    <entry>ok</entry>
3130e9fcaa8aSmrg    <entry></entry>
3131e9fcaa8aSmrg    <entry>(1L&lt;&lt;30)</entry>
3132e9fcaa8aSmrg</row>
3133eb411b4bSmrg<row>
31340f8248bfSmrg    <entry><symbol>XkbControlsEnabledMask</symbol></entry>
3135e9fcaa8aSmrg    <entry>ok</entry>
3136e9fcaa8aSmrg    <entry></entry>
3137e9fcaa8aSmrg    <entry>(1L&lt;&lt;31)</entry>
3138e9fcaa8aSmrg</row>
3139eb411b4bSmrg<row>
31400f8248bfSmrg    <entry><symbol>XkbAccessXOptionsMask</symbol></entry>
3141e9fcaa8aSmrg    <entry>ok</entry>
3142e9fcaa8aSmrg    <entry>ok</entry>
3143e9fcaa8aSmrg    <entry>(XkbStickyKeysMask | XkbAccessXFeedbackMask)</entry>
3144e9fcaa8aSmrg  </row>
3145eb411b4bSmrg  <row>
31460f8248bfSmrg    <entry><symbol>XkbAllBooleanCtrlsMask</symbol></entry>
3147e9fcaa8aSmrg    <entry></entry>
3148e9fcaa8aSmrg    <entry>ok</entry>
3149e9fcaa8aSmrg    <entry>(0x00001FFF) </entry>
3150e9fcaa8aSmrg  </row>
3151eb411b4bSmrg  <row>
31520f8248bfSmrg    <entry><symbol>XkbAllControlsMask</symbol></entry>
3153e9fcaa8aSmrg    <entry>ok</entry>
3154e9fcaa8aSmrg    <entry></entry>
3155e9fcaa8aSmrg    <entry>(0xF8001FFF)</entry>
3156e9fcaa8aSmrg  </row>
3157e9fcaa8aSmrg</tbody>
3158e9fcaa8aSmrg</tgroup>
3159e9fcaa8aSmrg</table>
3160e9fcaa8aSmrg
3161e9fcaa8aSmrg<para>
31620f8248bfSmrgThe individual fields of the
31630f8248bfSmrg<structname>XkbControlsRec</structname>
31640f8248bfSmrgstructure are defined as follows.
3165e9fcaa8aSmrg</para>
3166e9fcaa8aSmrg
3167e9fcaa8aSmrg<sect2>
3168e9fcaa8aSmrg<title/>
3169e9fcaa8aSmrg<sect3 id='mk_dflt_btn'>
3170e9fcaa8aSmrg<title>mk_dflt_btn</title>
3171e9fcaa8aSmrg
3172e9fcaa8aSmrg<para>
31730f8248bfSmrg<structfield>mk_dflt_btn</structfield> is an attribute of the
31740f8248bfSmrg<emphasis>MouseKeys</emphasis>
31750f8248bfSmrgcontrol
31760f8248bfSmrg(see <link linkend="Controls_for_Using_the_Mouse_from_the_Keyboard">section 10.5</link>). It
31770f8248bfSmrgspecifies the mouse button number to use for keyboard simulated mouse button
31780f8248bfSmrgoperations. Its value should be one of the core symbols
31790f8248bfSmrg<symbol>Button1</symbol>
31800f8248bfSmrg&ndash;
31810f8248bfSmrg<symbol>Button5</symbol>.
3182e9fcaa8aSmrg</para>
3183e9fcaa8aSmrg
3184e9fcaa8aSmrg
3185e9fcaa8aSmrg</sect3>
3186e9fcaa8aSmrg<sect3 id='num_groups'>
3187e9fcaa8aSmrg<title>num_groups</title>
3188e9fcaa8aSmrg
3189e9fcaa8aSmrg<para>
31900f8248bfSmrg<structfield>num_groups</structfield>
31910f8248bfSmrgis not a part of any control, but is reported in the
31920f8248bfSmrg<structname>XkbControlsRec</structname>
31930f8248bfSmrgstructure whenever any of its components are fetched from the server. It
3194e9fcaa8aSmrgreports the number of groups the particular keyboard configuration uses and is
3195e9fcaa8aSmrgcomputed automatically by the server whenever the keyboard mapping changes.
3196e9fcaa8aSmrg</para>
3197e9fcaa8aSmrg
3198e9fcaa8aSmrg
3199e9fcaa8aSmrg</sect3>
3200e9fcaa8aSmrg<sect3 id='groups_wrap'>
3201e9fcaa8aSmrg<title>groups_wrap</title>
3202e9fcaa8aSmrg
3203e9fcaa8aSmrg<para>
32040f8248bfSmrg<structfield>groups_wrap</structfield>
32050f8248bfSmrgis an attribute of the
32060f8248bfSmrg<emphasis>GroupsWrap</emphasis>
32070f8248bfSmrgcontrol (see <link linkend="The_GroupsWrap_Control">section 10.7.1</link>). It specifies the handling of illegal groups on a
32080f8248bfSmrgglobal basis. Valid values for
32090f8248bfSmrg<structfield>groups_wrap</structfield>
32100f8248bfSmrgare shown in <link linkend="table10.8">Table 10.8</link>.
3211e9fcaa8aSmrg</para>
3212e9fcaa8aSmrg
32130f8248bfSmrg<table id='table10.8' frame='topbot'>
3214e9fcaa8aSmrg<title>GroupsWrap options (groups_wrap field)</title>
3215eb411b4bSmrg<?dbfo keep-together="always" ?>
3216eb411b4bSmrg<tgroup cols='2' align='left' colsep='0' rowsep='0'>
3217eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
3218eb411b4bSmrg<colspec colname='c2' colwidth='1.0*'/>
3219e9fcaa8aSmrg<thead>
3220eb411b4bSmrg<row rowsep='1'>
3221e9fcaa8aSmrg  <entry>groups_wrap symbolic name</entry>
3222e9fcaa8aSmrg  <entry>value</entry>
3223e9fcaa8aSmrg  </row>
3224e9fcaa8aSmrg</thead>
3225e9fcaa8aSmrg<tbody>
3226eb411b4bSmrg  <row>
32270f8248bfSmrg    <entry><symbol>XkbWrapIntoRange</symbol></entry>
3228e9fcaa8aSmrg    <entry>(0x00)</entry>
3229e9fcaa8aSmrg  </row>
3230eb411b4bSmrg  <row>
32310f8248bfSmrg    <entry><symbol>XkbClampIntoRange</symbol></entry>
3232e9fcaa8aSmrg    <entry>(0x40)</entry>
3233e9fcaa8aSmrg  </row>
3234eb411b4bSmrg  <row>
32350f8248bfSmrg    <entry><symbol>XkbRedirectIntoRange</symbol></entry>
3236e9fcaa8aSmrg    <entry>(0x80)</entry>
3237e9fcaa8aSmrg  </row>
3238e9fcaa8aSmrg</tbody>
3239e9fcaa8aSmrg</tgroup>
3240e9fcaa8aSmrg</table>
3241e9fcaa8aSmrg
3242e9fcaa8aSmrg<para>
32430f8248bfSmrgWhen
32440f8248bfSmrg<structfield>groups_wrap</structfield>
32450f8248bfSmrgis set to
32460f8248bfSmrg<symbol>XkbRedirectIntoRange</symbol>,
32470f8248bfSmrgits four low-order bits specify the index of the group to use.
3248e9fcaa8aSmrg</para>
3249e9fcaa8aSmrg
3250e9fcaa8aSmrg
3251e9fcaa8aSmrg</sect3>
3252e9fcaa8aSmrg<sect3 id='internal'>
3253e9fcaa8aSmrg<title>internal</title>
3254e9fcaa8aSmrg
3255e9fcaa8aSmrg<para>
32560f8248bfSmrg<structfield>internal</structfield>
32570f8248bfSmrgis an attribute of the
32580f8248bfSmrg<emphasis>InternalMods</emphasis>
32590f8248bfSmrgcontrol (see <link linkend="The_InternalMods_Control">section 10.7.4</link>). It specifies modifiers to be consumed in the
3260e9fcaa8aSmrgserver and not passed on to clients when events are reported. Valid values
32610f8248bfSmrgconsist of any combination of the eight core modifier bits:
32620f8248bfSmrg<symbol>ShiftMask</symbol>,
32630f8248bfSmrg<symbol>LockMask</symbol>,
32640f8248bfSmrg<symbol>ControlMask</symbol>,
32650f8248bfSmrg<symbol>Mod1Mask</symbol>
32660f8248bfSmrg&ndash;
32670f8248bfSmrg<symbol>Mod5Mask</symbol>.
3268e9fcaa8aSmrg</para>
3269e9fcaa8aSmrg
3270e9fcaa8aSmrg
3271e9fcaa8aSmrg</sect3>
3272e9fcaa8aSmrg<sect3 id='ignore_lock'>
3273e9fcaa8aSmrg<title>ignore_lock</title>
3274e9fcaa8aSmrg
3275e9fcaa8aSmrg<para>
32760f8248bfSmrg<structfield>ignore_lock</structfield>
32770f8248bfSmrgis an attribute of the
32780f8248bfSmrg<emphasis>IgnoreLockMods</emphasis>
32790f8248bfSmrgcontrol (see <link linkend="The_IgnoreLockMods_Control">section 10.7.2</link>). It specifies modifiers to be ignored in grab
3280e9fcaa8aSmrgcalculations. Valid values consist of any combination of the eight core
32810f8248bfSmrgmodifier bits:
32820f8248bfSmrg<symbol>ShiftMask</symbol>,
32830f8248bfSmrg<symbol>LockMask</symbol>,
32840f8248bfSmrg<symbol>ControlMask</symbol>,
32850f8248bfSmrg<symbol>Mod1Mask</symbol>
32860f8248bfSmrg&ndash;
32870f8248bfSmrg<symbol>Mod5Mask</symbol>.
3288e9fcaa8aSmrg</para>
3289e9fcaa8aSmrg
3290e9fcaa8aSmrg
3291e9fcaa8aSmrg</sect3>
3292e9fcaa8aSmrg<sect3 id='enabled_ctrls'>
3293e9fcaa8aSmrg<title>enabled_ctrls</title>
3294e9fcaa8aSmrg
3295e9fcaa8aSmrg<para>
32960f8248bfSmrg<structfield>enabled_ctrls</structfield>
32970f8248bfSmrgis an attribute of the
32980f8248bfSmrg<emphasis>EnabledControls</emphasis>
32990f8248bfSmrgcontrol (see <link linkend="The_EnabledControls_Control">section 10.1.1</link>). It contains one bit per boolean control. Each
3300e9fcaa8aSmrgbit determines whether the corresponding control is enabled or disabled; a one
3301e9fcaa8aSmrgbit means the control is enabled. The mask bits used to enable these controls
33020f8248bfSmrgare listed in <link linkend="table10.7">Table 10.7</link>,
33030f8248bfSmrgusing only those masks with <quote>ok</quote> in the
33040f8248bfSmrg<structfield>enabled_ctrls</structfield>
33050f8248bfSmrgcolumn.
3306e9fcaa8aSmrg</para>
3307e9fcaa8aSmrg
3308e9fcaa8aSmrg
3309e9fcaa8aSmrg</sect3>
3310e9fcaa8aSmrg<sect3 id='repeat_delay_and_repeat_interval'>
3311e9fcaa8aSmrg<title>repeat_delay and repeat_interval</title>
3312e9fcaa8aSmrg
3313e9fcaa8aSmrg<para>
33140f8248bfSmrg<structfield>repeat_delay</structfield>
33150f8248bfSmrgand
33160f8248bfSmrg<structfield>repeat_interval</structfield>
33170f8248bfSmrgare attributes of the
33180f8248bfSmrg<emphasis>RepeatKeys</emphasis>
33190f8248bfSmrgcontrol (see <link linkend="The_RepeatKeys_Control">section 10.3.2</link>).
33200f8248bfSmrg<structfield>repeat_delay</structfield>
33210f8248bfSmrgis the initial delay before a key begins repeating, in milliseconds;
33220f8248bfSmrg<structfield>repeat_interval</structfield>
33230f8248bfSmrgis the delay between subsequent key events, in milliseconds.
3324e9fcaa8aSmrg</para>
3325e9fcaa8aSmrg
3326e9fcaa8aSmrg
3327e9fcaa8aSmrg</sect3>
3328e9fcaa8aSmrg<sect3 id='slow_keys_delay'>
3329e9fcaa8aSmrg<title>slow_keys_delay</title>
3330e9fcaa8aSmrg
3331e9fcaa8aSmrg<para>
33320f8248bfSmrg<structfield>slow_keys_delay</structfield>
33330f8248bfSmrgis an attribute of the
33340f8248bfSmrg<emphasis>SlowKeys</emphasis>
33350f8248bfSmrgcontrol (see <link linkend="The_SlowKeys_Control">section 10.6.6</link>). Its value specifies the
33360f8248bfSmrg<emphasis>SlowKeys</emphasis>
33370f8248bfSmrgacceptance delay period in milliseconds before a key press is accepted by the
3338e9fcaa8aSmrgserver.
3339e9fcaa8aSmrg</para>
3340e9fcaa8aSmrg
3341e9fcaa8aSmrg
3342e9fcaa8aSmrg</sect3>
3343e9fcaa8aSmrg<sect3 id='debounce_delay'>
3344e9fcaa8aSmrg<title>debounce_delay</title>
3345e9fcaa8aSmrg
3346e9fcaa8aSmrg<para>
33470f8248bfSmrg<structfield>debounce_delay</structfield>
33480f8248bfSmrgis an attribute of the
33490f8248bfSmrg<emphasis>BounceKeys</emphasis>
33500f8248bfSmrgcontrol (see <link linkend="The_BounceKeys_Control">section 10.6.7</link>). Its value specifies the
33510f8248bfSmrg<emphasis>BounceKeys</emphasis>
33520f8248bfSmrgdelay period in milliseconds for which the key is disabled after having been
3353e9fcaa8aSmrgpressed before another press of the same key is accepted by the server.
3354e9fcaa8aSmrg</para>
3355e9fcaa8aSmrg
3356e9fcaa8aSmrg
3357e9fcaa8aSmrg</sect3>
3358e9fcaa8aSmrg<sect3 id='mk_delay_mk_interval_mk_time_to_max_mk_max_speed_and_mk_curve'>
3359e9fcaa8aSmrg<title>mk_delay, mk_interval, mk_time_to_max, mk_max_speed, and mk_curve</title>
3360e9fcaa8aSmrg
3361e9fcaa8aSmrg<para>
33620f8248bfSmrg<structfield>mk_delay</structfield>,
33630f8248bfSmrg<structfield>mk_interval</structfield>,
33640f8248bfSmrg<structfield>mk_time_to_max</structfield>,
33650f8248bfSmrg<structfield>mk_max_speed</structfield>,
33660f8248bfSmrgand
33670f8248bfSmrg<structfield>mk_curve</structfield>
33680f8248bfSmrgare attributes of the
33690f8248bfSmrg<emphasis>MouseKeysAccel</emphasis>
33700f8248bfSmrgcontrol. Refer to <link linkend="The_MouseKeysAccel_Control">section 10.5.2</link> for a description of these fields and the
3371e9fcaa8aSmrgunits involved.
3372e9fcaa8aSmrg</para>
3373e9fcaa8aSmrg
3374e9fcaa8aSmrg
3375e9fcaa8aSmrg</sect3>
3376e9fcaa8aSmrg<sect3 id='ax_options'>
3377e9fcaa8aSmrg<title>ax_options</title>
3378e9fcaa8aSmrg
3379e9fcaa8aSmrg<para>
33800f8248bfSmrgThe
33810f8248bfSmrg<structfield>ax_options</structfield>
33820f8248bfSmrgfield contains attributes used to configure two different controls, the
33830f8248bfSmrg<emphasis>StickyKeys</emphasis>
33840f8248bfSmrgcontrol (see <link linkend="The_StickyKeys_Control">section 10.6.8</link>) and the
33850f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
33860f8248bfSmrgcontrol (see <link linkend="The_AccessXFeedback_Control">section 10.6.3</link>). The
33870f8248bfSmrg<structfield>ax_options</structfield>
33880f8248bfSmrgfield is a bitmask and may include any combination of the bits defined in
33890f8248bfSmrg<link linkend="table10.9">Table 10.9</link>.
3390e9fcaa8aSmrg</para>
3391e9fcaa8aSmrg
33920f8248bfSmrg<table id='table10.9' frame='topbot'>
3393e9fcaa8aSmrg<title>Access X Enable/Disable Bits (ax_options field)</title>
3394eb411b4bSmrg<?dbfo keep-together="always" ?>
3395eb411b4bSmrg<tgroup cols='3' align='left' colsep='0' rowsep='0'>
3396eb411b4bSmrg<colspec colname='c1' colwidth='1.0*'/>
3397eb411b4bSmrg<colspec colname='c2' colwidth='1.3*'/>
3398eb411b4bSmrg<colspec colname='c3' colwidth='0.7*'/>
3399e9fcaa8aSmrg<thead>
3400eb411b4bSmrg<row rowsep='1'>
3401e9fcaa8aSmrg  <entry>Access X Control</entry>
3402e9fcaa8aSmrg  <entry>ax_options bit</entry>
3403e9fcaa8aSmrg  <entry>value</entry>
3404e9fcaa8aSmrg  </row>
3405e9fcaa8aSmrg</thead>
3406e9fcaa8aSmrg<tbody>
3407eb411b4bSmrg  <row>
3408e9fcaa8aSmrg    <entry>AccessXFeedback</entry>
34090f8248bfSmrg    <entry><symbol>XkbAX_SKPressFBMask</symbol></entry>
3410e9fcaa8aSmrg    <entry>(1L&lt;&lt;0)</entry>
3411e9fcaa8aSmrg  </row>
3412eb411b4bSmrg  <row>
3413e9fcaa8aSmrg    <entry></entry>
34140f8248bfSmrg    <entry><symbol>XkbAX_SKAcceptFBMask</symbol></entry>
3415e9fcaa8aSmrg    <entry>(1L &lt;&lt; 1)</entry>
3416e9fcaa8aSmrg  </row>
3417eb411b4bSmrg  <row>
3418e9fcaa8aSmrg    <entry></entry>
34190f8248bfSmrg    <entry><symbol>XkbAX_FeatureFBMask</symbol></entry>
3420e9fcaa8aSmrg    <entry>(1L &lt;&lt; 2)</entry>
3421e9fcaa8aSmrg  </row>
3422eb411b4bSmrg  <row>
3423e9fcaa8aSmrg    <entry></entry>
34240f8248bfSmrg    <entry><symbol>XkbAX_SlowWarnFBMask</symbol></entry>
3425e9fcaa8aSmrg    <entry>(1L &lt;&lt; 3)</entry>
3426e9fcaa8aSmrg  </row>
3427eb411b4bSmrg  <row>
3428e9fcaa8aSmrg    <entry></entry>
34290f8248bfSmrg    <entry><symbol>XkbAX_IndicatorFBMask</symbol></entry>
3430e9fcaa8aSmrg    <entry>(1L &lt;&lt; 4)</entry>
3431e9fcaa8aSmrg  </row>
3432eb411b4bSmrg  <row>
3433e9fcaa8aSmrg    <entry></entry>
34340f8248bfSmrg    <entry><symbol>XkbAX_StickyKeysFBMask</symbol></entry>
3435e9fcaa8aSmrg    <entry>(1L &lt;&lt; 5)</entry>
3436e9fcaa8aSmrg  </row>
3437eb411b4bSmrg  <row>
3438e9fcaa8aSmrg    <entry></entry>
34390f8248bfSmrg    <entry><symbol>XkbAX_SKReleaseFBMask</symbol></entry>
3440e9fcaa8aSmrg    <entry>(1L &lt;&lt; 8)</entry>
3441e9fcaa8aSmrg  </row>
3442eb411b4bSmrg  <row>
3443e9fcaa8aSmrg    <entry></entry>
34440f8248bfSmrg    <entry><symbol>XkbAX_SKRejectFBMask</symbol></entry>
3445e9fcaa8aSmrg    <entry>(1L &lt;&lt; 9)</entry>
3446e9fcaa8aSmrg  </row>
3447eb411b4bSmrg  <row>
3448e9fcaa8aSmrg    <entry></entry>
34490f8248bfSmrg    <entry><symbol>XkbAX_BKRejectFBMask</symbol></entry>
3450e9fcaa8aSmrg    <entry>(1L &lt;&lt; 10)</entry>
3451e9fcaa8aSmrg  </row>
3452eb411b4bSmrg  <row>
3453e9fcaa8aSmrg    <entry></entry>
34540f8248bfSmrg    <entry><symbol>XkbAX_DumbBellFBMask</symbol></entry>
3455e9fcaa8aSmrg    <entry>(1L &lt;&lt; 11)</entry>
3456e9fcaa8aSmrg  </row>
3457eb411b4bSmrg  <row>
3458e9fcaa8aSmrg    <entry>StickyKeys</entry>
34590f8248bfSmrg    <entry><symbol>XkbAX_TwoKeysMask</symbol></entry>
3460e9fcaa8aSmrg    <entry>(1L &lt;&lt; 6)</entry>
3461e9fcaa8aSmrg  </row>
3462eb411b4bSmrg  <row>
3463e9fcaa8aSmrg    <entry></entry>
34640f8248bfSmrg    <entry><symbol>XkbAX_LatchToLockMask</symbol></entry>
3465e9fcaa8aSmrg    <entry>(1L &lt;&lt; 7)</entry>
3466e9fcaa8aSmrg  </row>
3467eb411b4bSmrg  <row>
3468e9fcaa8aSmrg    <entry></entry>
34690f8248bfSmrg    <entry><symbol>XkbAX_AllOptionsMask</symbol></entry>
3470e9fcaa8aSmrg    <entry>(0xFFF)</entry>
3471e9fcaa8aSmrg  </row>
3472e9fcaa8aSmrg</tbody>
3473e9fcaa8aSmrg</tgroup>
3474e9fcaa8aSmrg</table>
3475e9fcaa8aSmrg
3476e9fcaa8aSmrg<para>
3477e9fcaa8aSmrgThe fields pertaining to each control are relevant only when the control is
34780f8248bfSmrgenabled
34790f8248bfSmrg(<symbol>XkbAccessXFeedbackMask</symbol>
34800f8248bfSmrgor
34810f8248bfSmrg<symbol>XkbStickyKeysMask</symbol>
34820f8248bfSmrgbit is turned on in the
34830f8248bfSmrg<structfield>enabled_ctrls</structfield>
34840f8248bfSmrgfield).
3485e9fcaa8aSmrg</para>
3486e9fcaa8aSmrg
3487e9fcaa8aSmrg
3488e9fcaa8aSmrg<para>
34890f8248bfSmrgXkb provides a set of convenience macros for working with the
34900f8248bfSmrg<structfield>ax_options</structfield>
34910f8248bfSmrgfield of an
34920f8248bfSmrg<structname>XkbControlsRec</structname>
34930f8248bfSmrgstructure:
3494e9fcaa8aSmrg
34950f8248bfSmrg<programlisting>
34960f8248bfSmrg#define      <symbol>XkbAX_NeedOption</symbol>(c,w)      ((c)-&gt;ax_options &amp; (w))
3497e9fcaa8aSmrg</programlisting></para>
3498e9fcaa8aSmrg
3499e9fcaa8aSmrg<para>
35000f8248bfSmrgThe
35010f8248bfSmrg<symbol>XkbAX_NeedOption</symbol>
35020f8248bfSmrgmacro is useful for determining whether a particular AccessX option is enabled
35030f8248bfSmrgor not. It accepts a pointer to an
35040f8248bfSmrg<structname>XkbControlsRec</structname>
35050f8248bfSmrgstructure and a valid mask bit from
35060f8248bfSmrg<link linkend="table10.9">Table 10.9</link>.
35070f8248bfSmrgIf the specified mask bit in the
35080f8248bfSmrg<structfield>ax_options</structfield>
35090f8248bfSmrgfield of the controls structure is set, the macro returns the mask bit.
3510e9fcaa8aSmrgOtherwise, it returns zero. Thus,
3511e9fcaa8aSmrg
35120f8248bfSmrg<programlisting>
35130f8248bfSmrg    XkbAX_NeedOption(ctlrec, XkbAX_LatchToLockMask)
35140f8248bfSmrg</programlisting>
3515e9fcaa8aSmrg
3516e9fcaa8aSmrgis nonzero if the latch to lock transition for latching keys is enabled, and
35170f8248bfSmrgzero if it is disabled. Note that
35180f8248bfSmrg<symbol>XkbAX_NeedOption</symbol>
35190f8248bfSmrgonly determines whether or not the particular capability is configured to
35200f8248bfSmrgoperate; the
35210f8248bfSmrg<symbol>XkbAccessXFeedbackMask</symbol>
35220f8248bfSmrgbit must also be turned on in
35230f8248bfSmrg<structfield>enabled_ctrls</structfield>
35240f8248bfSmrgfor the capability to actually be functioning.
3525e9fcaa8aSmrg</para>
3526e9fcaa8aSmrg
3527e9fcaa8aSmrg<para><programlisting>
35280f8248bfSmrg#define      <symbol>XkbAX_AnyFeedback</symbol>(c) \
35290f8248bfSmrg                 ((c)-&gt;enabled_ctrls &amp; XkbAccessXFeedbackMask)
3530e9fcaa8aSmrg</programlisting></para>
3531e9fcaa8aSmrg
3532e9fcaa8aSmrg<para>
35330f8248bfSmrgThe
35340f8248bfSmrg<symbol>XkbAX_AnyFeedback</symbol>
35350f8248bfSmrgmacro accepts a pointer to an
35360f8248bfSmrg<structname>XkbControlsRec</structname>
35370f8248bfSmrgstructure and tells whether the
35380f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
35390f8248bfSmrgcontrol is enabled or not. If the
35400f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
35410f8248bfSmrgcontrol is enabled, the macro returns
35420f8248bfSmrg<symbol>XkbAccessXFeedbackMask</symbol>.
35430f8248bfSmrgOtherwise, it returns zero.
3544e9fcaa8aSmrg</para>
3545e9fcaa8aSmrg
3546e9fcaa8aSmrg<para><programlisting>
35470f8248bfSmrg#define      <symbol>XkbAX_NeedFeedback</symbol>(c,w) \
35480f8248bfSmrg                 (XkbAX_AnyFeedback(c) &amp;&amp; XkbAX_NeedOption(c,w))
3549e9fcaa8aSmrg</programlisting></para>
3550e9fcaa8aSmrg
3551e9fcaa8aSmrg<para>
35520f8248bfSmrgThe
35530f8248bfSmrg<symbol>XkbAX_NeedFeedback</symbol>
35540f8248bfSmrgmacro is useful for determining if both the
35550f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
35560f8248bfSmrgcontrol and a particular AccessX feedback option are enabled. The macro
35570f8248bfSmrgaccepts a pointer to an
35580f8248bfSmrg<structname>XkbControlsRec</structname>
35590f8248bfSmrgstructure and a feedback option from the table above. If both the
35600f8248bfSmrg<emphasis>AccessXFeedback</emphasis>
35610f8248bfSmrgcontrol and the specified feedback option are enabled, the macro returns
35620f8248bfSmrg<symbol>True</symbol>.
35630f8248bfSmrgOtherwise it returns
35640f8248bfSmrg<symbol>False</symbol>.
3565e9fcaa8aSmrg</para>
3566e9fcaa8aSmrg
3567e9fcaa8aSmrg
3568e9fcaa8aSmrg</sect3>
3569e9fcaa8aSmrg<sect3
3570e9fcaa8aSmrgid='ax_timeout_axt_opts_mask_axt_opts_values_axt_ctrls_mask_and_axt_ctrls_values'>
3571e9fcaa8aSmrg<title>ax_timeout, axt_opts_mask, axt_opts_values, axt_ctrls_mask, and axt_ctrls_values</title>
3572e9fcaa8aSmrg
3573e9fcaa8aSmrg<para>
35740f8248bfSmrg<structfield>ax_timeout</structfield>,
35750f8248bfSmrg<structfield>axt_opts_mask</structfield>,
35760f8248bfSmrg<structfield>axt_opts_values</structfield>,
35770f8248bfSmrg<structfield>axt_ctrls_mask</structfield>,
35780f8248bfSmrgand
35790f8248bfSmrg<structfield>axt_ctrls_values</structfield>
35800f8248bfSmrgare attributes of the
35810f8248bfSmrg<emphasis>AccessXTimeout</emphasis>
35820f8248bfSmrgcontrol. Refer to <link linkend="The_AccessXTimeout_Control">section 10.6.2</link> for a description of these fields and the
3583e9fcaa8aSmrgunits involved.
3584e9fcaa8aSmrg</para>
3585e9fcaa8aSmrg
3586e9fcaa8aSmrg
3587e9fcaa8aSmrg</sect3>
3588e9fcaa8aSmrg<sect3 id='per_key_repeat'>
3589e9fcaa8aSmrg<title>per_key_repeat</title>
3590e9fcaa8aSmrg
3591e9fcaa8aSmrg<para>
35920f8248bfSmrgThe
35930f8248bfSmrg<structfield>per_key_repeat</structfield>
35940f8248bfSmrgfield mirrors the
35950f8248bfSmrg<structfield>auto_repeats</structfield>
35960f8248bfSmrgfield of the core protocol
35970f8248bfSmrg<structname>XKeyboardState</structname>
35980f8248bfSmrgstructure: changing the
35990f8248bfSmrg<structfield>auto_repeats</structfield>
36000f8248bfSmrgfield automatically changes
36010f8248bfSmrg<structfield>per_key_repeat</structfield>
36020f8248bfSmrgand vice versa. It is provided for convenience and to reduce protocol traffic.
3603e9fcaa8aSmrgFor example, to obtain the individual repeat key behavior as well as the repeat
36040f8248bfSmrgdelay and rate, use
36050f8248bfSmrg<function>XkbGetControls</function>.
36060f8248bfSmrgIf the
36070f8248bfSmrg<structfield>per_key_repeat</structfield>
36080f8248bfSmrgwere not in this structure, you would have to call both
36090f8248bfSmrg<function>XGetKeyboardControl</function>
36100f8248bfSmrgand
36110f8248bfSmrg<function>XkbGetControls</function>
36120f8248bfSmrgto get this information. The bits correspond to keycodes. The first seven keys
36130f8248bfSmrg(keycodes 1&ndash;7) are indicated in
36140f8248bfSmrg<structfield>per_key_repeat</structfield>[0],
36150f8248bfSmrgwith bit position 0 (low order) corresponding to the fictitious keycode 0.
3616e9fcaa8aSmrgFollowing array elements correspond to 8 keycodes per element. A 1 bit
3617e9fcaa8aSmrgindicates that the key is a repeating key.
3618e9fcaa8aSmrg</para>
3619e9fcaa8aSmrg
3620e9fcaa8aSmrg
3621e9fcaa8aSmrg</sect3>
3622e9fcaa8aSmrg</sect2>
3623e9fcaa8aSmrg</sect1>
3624eb411b4bSmrg<sect1 id='Querying_Controls'>
3625e9fcaa8aSmrg<title>Querying Controls</title>
3626e9fcaa8aSmrg
3627e9fcaa8aSmrg<para>
36280f8248bfSmrgUse
36290f8248bfSmrg<function>XkbGetControls</function>
36300f8248bfSmrgto find the current state of Xkb server controls.
36310f8248bfSmrg</para>
36320f8248bfSmrg
36330f8248bfSmrg<indexterm significance="preferred" zone="XkbGetControls"><primary><function>XkbGetControls</function></primary></indexterm>
36340f8248bfSmrg<funcsynopsis id="XkbGetControls">
36350f8248bfSmrg  <funcprototype>
36360f8248bfSmrg    <funcdef>Status <function>XkbGetControls</function></funcdef>
36370f8248bfSmrg<!-- (
36380f8248bfSmrg<parameter>display, which, xkb)</parameter> -->
36390f8248bfSmrg
36400f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
36410f8248bfSmrg    <paramdef>unsigned long <parameter>which</parameter></paramdef>
36420f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
36430f8248bfSmrg  </funcprototype>
36440f8248bfSmrg</funcsynopsis>
36450f8248bfSmrg<variablelist>
36460f8248bfSmrg  <varlistentry>
36470f8248bfSmrg    <term>
36480f8248bfSmrg      <parameter>display</parameter>
36490f8248bfSmrg    </term>
36500f8248bfSmrg    <listitem>
36510f8248bfSmrg      <para>
36520f8248bfSmrg        connection to X server
36530f8248bfSmrg      </para>
36540f8248bfSmrg    </listitem>
36550f8248bfSmrg  </varlistentry>
36560f8248bfSmrg  <varlistentry>
36570f8248bfSmrg    <term>
36580f8248bfSmrg      <parameter>which</parameter>
36590f8248bfSmrg    </term>
36600f8248bfSmrg    <listitem>
36610f8248bfSmrg      <para>
36620f8248bfSmrg        mask of controls requested
36630f8248bfSmrg      </para>
36640f8248bfSmrg    </listitem>
36650f8248bfSmrg  </varlistentry>
36660f8248bfSmrg  <varlistentry>
36670f8248bfSmrg    <term>
36680f8248bfSmrg      <parameter>xkb</parameter>
36690f8248bfSmrg    </term>
36700f8248bfSmrg    <listitem>
36710f8248bfSmrg      <para>
36720f8248bfSmrg        keyboard description for controls information
36730f8248bfSmrg      </para>
36740f8248bfSmrg    </listitem>
36750f8248bfSmrg  </varlistentry>
36760f8248bfSmrg</variablelist>
36770f8248bfSmrg
36780f8248bfSmrg<para>
36790f8248bfSmrg<function>XkbGetControls</function>
36800f8248bfSmrgqueries the server for the requested control information, waits for a reply,
3681e9fcaa8aSmrgand then copies the server’s values for the requested information into the
36820f8248bfSmrg<structfield>ctrls</structfield>
36830f8248bfSmrgstructure of the
36840f8248bfSmrg<parameter>xkb</parameter>
36850f8248bfSmrgargument. Only those components specified by the
36860f8248bfSmrg<parameter>which</parameter>
36870f8248bfSmrgparameter are copied. Valid values for
36880f8248bfSmrg<parameter>which</parameter>
36890f8248bfSmrgare any combination of the masks listed in
36900f8248bfSmrg<link linkend="table10.7">Table 10.7</link> that have <quote>ok</quote> in the
36910f8248bfSmrg<parameter>which</parameter>
36920f8248bfSmrgcolumn.
3693e9fcaa8aSmrg</para>
3694e9fcaa8aSmrg
3695e9fcaa8aSmrg
3696e9fcaa8aSmrg<para>
36970f8248bfSmrgIf
36980f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>
36990f8248bfSmrgis
37000f8248bfSmrg<symbol>NULL</symbol>,
37010f8248bfSmrg<function>XkbGetControls</function>
37020f8248bfSmrgallocates and initializes it before obtaining the values specified by
37030f8248bfSmrg<parameter>which</parameter>.
37040f8248bfSmrgIf
37050f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>
37060f8248bfSmrgis not
37070f8248bfSmrg<symbol>NULL</symbol>,
37080f8248bfSmrg<function>XkbGetControls</function>
37090f8248bfSmrgmodifies only those portions of
37100f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>
37110f8248bfSmrgcorresponding to the values specified by
37120f8248bfSmrg<parameter>which</parameter>.
3713e9fcaa8aSmrg</para>
3714e9fcaa8aSmrg
3715e9fcaa8aSmrg
3716e9fcaa8aSmrg<para>
37170f8248bfSmrg<function>XkbGetControls</function>
37180f8248bfSmrgreturns
37190f8248bfSmrg<symbol>Success</symbol>
37200f8248bfSmrgif successful; otherwise, it returns
37210f8248bfSmrg<errorname>BadAlloc</errorname>
37220f8248bfSmrgif it cannot obtain sufficient storage,
37230f8248bfSmrg<errorname>BadMatch</errorname>
37240f8248bfSmrgif
37250f8248bfSmrg<parameter>xkb</parameter>
37260f8248bfSmrgis
37270f8248bfSmrg<symbol>NULL</symbol>
37280f8248bfSmrgor
37290f8248bfSmrg<parameter>which</parameter>
37300f8248bfSmrgis empty, or
37310f8248bfSmrg<errorname>BadImplementation</errorname>.
3732e9fcaa8aSmrg</para>
3733e9fcaa8aSmrg
3734e9fcaa8aSmrg
3735e9fcaa8aSmrg<para>
37360f8248bfSmrgTo free the
37370f8248bfSmrg<structfield>ctrls</structfield>
37380f8248bfSmrgmember of a keyboard description, use
37390f8248bfSmrg<function>XkbFreeControls</function>
37400f8248bfSmrg(see <link linkend="Allocating_and_Freeing_an_XkbControlsRec">section 10.12</link>)
3741e9fcaa8aSmrg</para>
3742e9fcaa8aSmrg
3743e9fcaa8aSmrg
3744e9fcaa8aSmrg<para>
37450f8248bfSmrgThe
37460f8248bfSmrg<structfield>num_groups</structfield>
37470f8248bfSmrgfield in the
37480f8248bfSmrg<structfield>ctrls</structfield>
37490f8248bfSmrgstructure is always filled in by
37500f8248bfSmrg<function>XkbGetControls</function>,
37510f8248bfSmrgregardless of which bits are selected by
37520f8248bfSmrg<parameter>which</parameter>.
3753e9fcaa8aSmrg</para>
3754e9fcaa8aSmrg
3755e9fcaa8aSmrg
37560f8248bfSmrg</sect1>
37570f8248bfSmrg<sect1 id='Changing_Controls'>
37580f8248bfSmrg<title>Changing Controls</title>
37590f8248bfSmrg
3760e9fcaa8aSmrg<para>
37610f8248bfSmrgThere are two ways to make changes to controls: either change a local copy
37620f8248bfSmrgkeyboard description and call
37630f8248bfSmrg<function>XkbSetControls</function>,
37640f8248bfSmrgor, to reduce network traffic, use an
37650f8248bfSmrg<structname>XkbControlsChangesRec</structname>
37660f8248bfSmrgstructure and call
37670f8248bfSmrg<function>XkbChangeControls</function>.
37680f8248bfSmrg</para>
37690f8248bfSmrg
37700f8248bfSmrg
37710f8248bfSmrg<para>
37720f8248bfSmrgTo change the state of one or more controls, first modify the
37730f8248bfSmrg<structfield>ctrls</structfield>
37740f8248bfSmrgstructure in a local copy of the keyboard description and then use
37750f8248bfSmrg<function>XkbSetControls</function>
37760f8248bfSmrgto copy those changes to the X server.
37770f8248bfSmrg</para>
37780f8248bfSmrg
37790f8248bfSmrg<indexterm significance="preferred" zone="XkbSetControls"><primary><function>XkbSetControls</function></primary></indexterm>
37800f8248bfSmrg<funcsynopsis id="XkbSetControls">
37810f8248bfSmrg  <funcprototype>
37820f8248bfSmrg    <funcdef>Bool <function>XkbSetControls</function></funcdef>
37830f8248bfSmrg<!-- (
37840f8248bfSmrg<parameter>display, which, xkb)</parameter> -->
37850f8248bfSmrg
37860f8248bfSmrg    <paramdef>Display *<parameter>display</parameter></paramdef>
37870f8248bfSmrg    <paramdef>unsigned long <parameter>which</parameter></paramdef>
37880f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
37890f8248bfSmrg  </funcprototype>
37900f8248bfSmrg</funcsynopsis>
37910f8248bfSmrg<variablelist>
37920f8248bfSmrg  <varlistentry>
37930f8248bfSmrg    <term>
37940f8248bfSmrg      <parameter>display</parameter>
37950f8248bfSmrg    </term>
37960f8248bfSmrg    <listitem>
37970f8248bfSmrg      <para>
37980f8248bfSmrg        connection to X server
37990f8248bfSmrg      </para>
38000f8248bfSmrg    </listitem>
38010f8248bfSmrg  </varlistentry>
38020f8248bfSmrg  <varlistentry>
38030f8248bfSmrg    <term>
38040f8248bfSmrg      <parameter>which</parameter>
38050f8248bfSmrg    </term>
38060f8248bfSmrg    <listitem>
38070f8248bfSmrg      <para>
38080f8248bfSmrg        mask of controls to change
38090f8248bfSmrg      </para>
38100f8248bfSmrg    </listitem>
38110f8248bfSmrg  </varlistentry>
38120f8248bfSmrg  <varlistentry>
38130f8248bfSmrg    <term>
38140f8248bfSmrg      <parameter>xkb</parameter>
38150f8248bfSmrg    </term>
38160f8248bfSmrg    <listitem>
38170f8248bfSmrg      <para>
38180f8248bfSmrg        <structfield>ctrls</structfield> field contains new values to be set
38190f8248bfSmrg      </para>
38200f8248bfSmrg    </listitem>
38210f8248bfSmrg  </varlistentry>
38220f8248bfSmrg</variablelist>
38230f8248bfSmrg
38240f8248bfSmrg<para>
38250f8248bfSmrgFor each bit that is set in the
38260f8248bfSmrg<parameter>which</parameter>
38270f8248bfSmrgparameter,
38280f8248bfSmrg<function>XkbSetControls</function>
38290f8248bfSmrgsends the corresponding values from the
38300f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>
38310f8248bfSmrgfield to the server. Valid values for
38320f8248bfSmrg<parameter>which</parameter>
38330f8248bfSmrgare any combination of the masks listed in
38340f8248bfSmrg<link linkend="table10.7">Table 10.7</link> that have <quote>ok</quote> in the
38350f8248bfSmrg<parameter>which</parameter>
38360f8248bfSmrgcolumn.
38370f8248bfSmrg</para>
38380f8248bfSmrg
38390f8248bfSmrg
38400f8248bfSmrg<para>
38410f8248bfSmrgIf
38420f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>
38430f8248bfSmrgis
38440f8248bfSmrg<symbol>NULL</symbol>,
38450f8248bfSmrgthe server does not support a compatible version of Xkb, or the Xkb extension
38460f8248bfSmrghas not been properly initialized,
38470f8248bfSmrg<function>XkbSetControls</function>
38480f8248bfSmrgreturns
38490f8248bfSmrg<symbol>False</symbol>.
38500f8248bfSmrgOtherwise, it sends the request to the X server and returns
38510f8248bfSmrg<symbol>True</symbol>.
38520f8248bfSmrg</para>
38530f8248bfSmrg
38540f8248bfSmrg
38550f8248bfSmrg<para>
38560f8248bfSmrgNote that changes to attributes of controls in the
38570f8248bfSmrg<structname>XkbControlsRec</structname>
38580f8248bfSmrgstructure are apparent only when the associated control is enabled, although
3859e9fcaa8aSmrgthe corresponding values are still updated in the X server. For example, the
38600f8248bfSmrg<structfield>repeat_delay</structfield>
38610f8248bfSmrgand
38620f8248bfSmrg<structfield>repeat_interval</structfield>
38630f8248bfSmrgfields are ignored unless the
38640f8248bfSmrg<emphasis>RepeatKeys</emphasis>
38650f8248bfSmrgcontrol is enabled (that is, the X server’s equivalent of
38660f8248bfSmrg<structfield>xkb-&gt;ctrls</structfield>
38670f8248bfSmrghas
38680f8248bfSmrg<symbol>XkbRepeatKeysMask</symbol>
38690f8248bfSmrgset in
38700f8248bfSmrg<structfield>enabled_ctrls</structfield>).
38710f8248bfSmrgIt is permissible to modify the attributes of a control in one call to
38720f8248bfSmrgXkbSetControls and enable the control in a subsequent call. See <link linkend="The_EnabledControls_Control">section 10.1.1</link>
3873e9fcaa8aSmrgfor more information on enabling and disabling controls.
3874e9fcaa8aSmrg</para>
3875e9fcaa8aSmrg
3876e9fcaa8aSmrg
3877e9fcaa8aSmrg<para>
38780f8248bfSmrgNote that the
38790f8248bfSmrg<structfield>enabled_ctrls</structfield>
38800f8248bfSmrgfield is itself a control — the
38810f8248bfSmrg<emphasis>EnabledControls</emphasis>
38820f8248bfSmrgcontrol. As such, to set a specific configuration of enabled and disabled
38830f8248bfSmrgboolean controls, you must set
38840f8248bfSmrg<structfield>enabled_ctrls</structfield>
38850f8248bfSmrgto the appropriate bits to enable only the controls you want and disable all
38860f8248bfSmrgothers, then specify the
38870f8248bfSmrg<symbol>XkbControlsEnabledMask</symbol>
38880f8248bfSmrgin a call to
38890f8248bfSmrg<function>XkbSetControls</function>.
38900f8248bfSmrgBecause this is somewhat awkward if all you want to do is enable and disable
3891e9fcaa8aSmrgcontrols, and not modify any of their attributes, a convenience function is
38920f8248bfSmrgalso provided for this purpose
38930f8248bfSmrg(<function>XkbChangeEnabledControls</function>,
38940f8248bfSmrg<link linkend="The_EnabledControls_Control">section 10.1.1</link>).
3895e9fcaa8aSmrg</para>
3896e9fcaa8aSmrg
3897e9fcaa8aSmrg
3898eb411b4bSmrg<sect2 id='The_XkbControlsChangesRec_Structure'>
3899e9fcaa8aSmrg<title>The XkbControlsChangesRec Structure</title>
3900e9fcaa8aSmrg
39010f8248bfSmrg<indexterm significance="preferred" zone="The_XkbControlsChangesRec_Structure">
39020f8248bfSmrg<primary><structname>XkbControlsChangesRec</structname></primary></indexterm>
39030f8248bfSmrg
3904e9fcaa8aSmrg<para>
39050f8248bfSmrgThe
39060f8248bfSmrg<structname>XkbControlsChangesRec</structname>
39070f8248bfSmrgstructure allows applications to track modifications to an
39080f8248bfSmrg<structname>XkbControlsRec</structname>
39090f8248bfSmrgstructure and thereby reduce the amount of traffic sent to the server. The
39100f8248bfSmrgsame
39110f8248bfSmrg<structname>XkbControlsChangesRec</structname>
39120f8248bfSmrgstructure may be used in several successive modifications to the same
39130f8248bfSmrg<structname>XkbControlsRec</structname>
39140f8248bfSmrgstructure, then subsequently used to cause all of the changes, and only the
39150f8248bfSmrgchanges, to be propagated to the server. The
39160f8248bfSmrg<structname>XkbControlsChangesRec</structname>
39170f8248bfSmrgstructure is defined as follows:
3918e9fcaa8aSmrg
39190f8248bfSmrg<programlisting>
3920e9fcaa8aSmrgtypedef struct _XkbControlsChanges {
39210f8248bfSmrg    unsigned int changed_ctrls;          /* bits indicating changed
39220f8248bfSmrg                                             control data */
39230f8248bfSmrg    unsigned int enabled_ctrls_changes;  /* bits indicating
39240f8248bfSmrg                                             enabled/disabled controls */
39250f8248bfSmrg    Bool         num_groups_changed;     /* <symbol>True</symbol> if number of keyboard
39260f8248bfSmrg                                             groups changed */
39270f8248bfSmrg} <structname>XkbControlsChangesRec</structname>, *XkbControlsChangesPtr;
3928e9fcaa8aSmrg</programlisting></para>
3929e9fcaa8aSmrg
3930e9fcaa8aSmrg<para>
39310f8248bfSmrgThe
39320f8248bfSmrg<structfield>changed_ctrls</structfield>
39330f8248bfSmrgfield is a mask specifying which logical sets of data in the controls
39340f8248bfSmrgstructure have been modified. In this context, modified means
39350f8248bfSmrg<emphasis>set</emphasis>,
39360f8248bfSmrgthat is, if a value is set to the same value it previously contained, it has
39370f8248bfSmrgstill been modified, and is noted as changed. Valid values for
39380f8248bfSmrg<structfield>changed_ctrls</structfield>
39390f8248bfSmrgare any combination of the masks listed in
39400f8248bfSmrg<link linkend="table10.7">Table 10.7</link> that have <quote>ok</quote> in the
39410f8248bfSmrg<structfield>changed_ctrls</structfield>
39420f8248bfSmrgcolumn. Setting a bit implies the corresponding data fields from the
39430f8248bfSmrg<quote>Relevant XkbControlsRec Data Fields</quote> column in
39440f8248bfSmrg<link linkend="table10.6">Table 10.6</link> have been modified. The
39450f8248bfSmrg<structfield>enabled_ctrls_changes</structfield>
39460f8248bfSmrgfield specifies which bits in the
39470f8248bfSmrg<structfield>enabled_ctrls</structfield>
39480f8248bfSmrgfield have changed. If the number of keyboard groups has changed, the
39490f8248bfSmrg<structfield>num_groups_changed</structfield>
39500f8248bfSmrgfield is set to <symbol>True</symbol>.
3951e9fcaa8aSmrg</para>
3952e9fcaa8aSmrg
3953e9fcaa8aSmrg
3954e9fcaa8aSmrg<para>
3955e9fcaa8aSmrgIf you have an Xkb description with controls that have been modified and an
39560f8248bfSmrg<structname>XkbControlsChangesRec</structname>
39570f8248bfSmrgthat describes the changes that have been made, the
39580f8248bfSmrg<function>XkbChangeControls</function>
39590f8248bfSmrgfunction provides a flexible method for updating the controls in a server to
3960e9fcaa8aSmrgmatch those in the changed keyboard description.
3961e9fcaa8aSmrg</para>
3962e9fcaa8aSmrg
39630f8248bfSmrg<indexterm significance="preferred" zone="XkbChangeControls"><primary><function>XkbChangeControls</function></primary></indexterm>
39640f8248bfSmrg<funcsynopsis id="XkbChangeControls">
39650f8248bfSmrg  <funcprototype>
39660f8248bfSmrg    <funcdef>Bool <function>XkbChangeControls</function></funcdef>
39670f8248bfSmrg<!-- (
39680f8248bfSmrg<parameter>dpy, xkb, changes</parameter>
39690f8248bfSmrg) -->
39700f8248bfSmrg
39710f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
39720f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
39730f8248bfSmrg    <paramdef>XkbControlsChangesPtr <parameter>changes</parameter></paramdef>
39740f8248bfSmrg  </funcprototype>
39750f8248bfSmrg</funcsynopsis>
39760f8248bfSmrg<variablelist>
39770f8248bfSmrg  <varlistentry>
39780f8248bfSmrg    <term>
39790f8248bfSmrg      <parameter>dpy</parameter>
39800f8248bfSmrg    </term>
39810f8248bfSmrg    <listitem>
39820f8248bfSmrg      <para>
39830f8248bfSmrg        connection to X server
39840f8248bfSmrg      </para>
39850f8248bfSmrg    </listitem>
39860f8248bfSmrg  </varlistentry>
39870f8248bfSmrg  <varlistentry>
39880f8248bfSmrg    <term>
39890f8248bfSmrg      <parameter>xkb</parameter>
39900f8248bfSmrg    </term>
39910f8248bfSmrg    <listitem>
39920f8248bfSmrg      <para>
39930f8248bfSmrg        keyboard description with changed <structfield>xkb-&gt;ctrls</structfield>
39940f8248bfSmrg      </para>
39950f8248bfSmrg    </listitem>
39960f8248bfSmrg  </varlistentry>
39970f8248bfSmrg  <varlistentry>
39980f8248bfSmrg    <term>
39990f8248bfSmrg      <parameter>changes</parameter>
40000f8248bfSmrg    </term>
40010f8248bfSmrg    <listitem>
40020f8248bfSmrg      <para>
40030f8248bfSmrg        which parts of <structfield>xkb-&gt;ctrls</structfield> have changed
40040f8248bfSmrg      </para>
40050f8248bfSmrg    </listitem>
40060f8248bfSmrg  </varlistentry>
40070f8248bfSmrg</variablelist>
40080f8248bfSmrg
40090f8248bfSmrg<para>
40100f8248bfSmrg<function>XkbChangeControls</function>
40110f8248bfSmrgcopies any controls fields specified by
40120f8248bfSmrg<parameter>changes</parameter>
40130f8248bfSmrgfrom the keyboard description controls structure,
40140f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>,
40150f8248bfSmrgto the server specified by
40160f8248bfSmrg<parameter>dpy</parameter>.
4017e9fcaa8aSmrg</para>
4018e9fcaa8aSmrg
4019e9fcaa8aSmrg
4020e9fcaa8aSmrg</sect2>
4021e9fcaa8aSmrg</sect1>
4022eb411b4bSmrg<sect1 id='Tracking_Changes_to_Keyboard_Controls'>
4023e9fcaa8aSmrg<title>Tracking Changes to Keyboard Controls</title>
4024e9fcaa8aSmrg
40250f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Changes_to_Keyboard_Controls">
40260f8248bfSmrg<primary>events</primary><secondary><symbol>XkbControlsNotify</symbol></secondary></indexterm>
40270f8248bfSmrg<indexterm significance="preferred" zone="Tracking_Changes_to_Keyboard_Controls">
40280f8248bfSmrg<primary><structname>XkbControlsNotifyEvent</structname></primary></indexterm>
40290f8248bfSmrg
4030e9fcaa8aSmrg<para>
4031e9fcaa8aSmrgWhenever a field in the controls structure changes in the server’s keyboard
40320f8248bfSmrgdescription, the server sends an
40330f8248bfSmrg<symbol>XkbControlsNotify</symbol>
40340f8248bfSmrgevent to all interested clients.To receive
40350f8248bfSmrg<symbol>XkbControlsNotify</symbol>
40360f8248bfSmrgevents under all possible conditions, use
40370f8248bfSmrg<function>XkbSelectEvents</function>
40380f8248bfSmrg(see <link linkend="Selecting_Xkb_Events">section 4.3</link>) and pass
40390f8248bfSmrg<symbol>XkbControlsNotifyMask</symbol>
40400f8248bfSmrgin both
40410f8248bfSmrg<parameter>bits_to_change</parameter>
40420f8248bfSmrgand
40430f8248bfSmrg<parameter>values_for_bits</parameter>.
4044e9fcaa8aSmrg</para>
4045e9fcaa8aSmrg
4046e9fcaa8aSmrg
4047e9fcaa8aSmrg<para>
40480f8248bfSmrgTo receive
40490f8248bfSmrg<symbol>XkbControlsNotify</symbol>
40500f8248bfSmrgevents only under certain conditions, use
40510f8248bfSmrg<function>XkbSelectEventDetails</function>
40520f8248bfSmrgusing
40530f8248bfSmrg<symbol>XkbControlsNotify</symbol>
40540f8248bfSmrgas the
40550f8248bfSmrg<structfield>event_type</structfield>
40560f8248bfSmrgand specifying the desired state changes in
40570f8248bfSmrg<parameter>bits_to_change</parameter>
40580f8248bfSmrgand
40590f8248bfSmrg<parameter>values_for_bits</parameter>
40600f8248bfSmrgusing mask bits from <link linkend="table10.7">Table 10.7</link>.
4061e9fcaa8aSmrg</para>
4062e9fcaa8aSmrg
4063e9fcaa8aSmrg
4064e9fcaa8aSmrg<para>
40650f8248bfSmrgThe structure for the
40660f8248bfSmrg<symbol>XkbControlsNotify</symbol>
40670f8248bfSmrgevent is defined as follows:
4068e9fcaa8aSmrg
40690f8248bfSmrg<programlisting>
4070e9fcaa8aSmrgtypedef struct {
40710f8248bfSmrg    int            type;          /* Xkb extension base event code */
40720f8248bfSmrg    unsigned long  serial;        /* X server serial number for event */
40730f8248bfSmrg    Bool           send_event;    /* <symbol>True</symbol> &rArr; synthetically generated */
40740f8248bfSmrg    Display *      display;       /* server connection where event generated */
40750f8248bfSmrg    Time           time;          /* server time when event generated */
40760f8248bfSmrg    int            xkb_type;      /* <symbol>XkbCompatMapNotify</symbol> */
40770f8248bfSmrg    int            device;        /* Xkb device ID,
40780f8248bfSmrg                                     will not be <symbol>XkbUseCoreKbd</symbol> */
40790f8248bfSmrg    unsigned int   changed_ctrls; /* bits indicating which controls
40800f8248bfSmrg                                     data have changed */
40810f8248bfSmrg    unsigned int   enabled_ctrls; /* controls currently enabled in server */
40820f8248bfSmrg    unsigned int   enabled_ctrl_changes;  /* bits indicating
40830f8248bfSmrg                                             enabled/disabled controls */
40840f8248bfSmrg    int            num_groups;    /* current number of keyboard groups */
40850f8248bfSmrg    KeyCode        keycode;       /* != 0 &rArr; keycode of key causing change */
40860f8248bfSmrg    char           event_type;    /* Type of event causing change */
40870f8248bfSmrg    char           req_major;     /* major event code of event causing change */
40880f8248bfSmrg    char           req_minor;     /* minor event code of event causing change */
40890f8248bfSmrg} <structname>XkbControlsNotifyEvent</structname>;
4090e9fcaa8aSmrg</programlisting></para>
4091e9fcaa8aSmrg
4092e9fcaa8aSmrg<para>
40930f8248bfSmrgThe
40940f8248bfSmrg<structfield>changed_ctrls</structfield>
40950f8248bfSmrgfield specifies the controls components that have changed and consists of bits
40960f8248bfSmrgtaken from the masks defined in
40970f8248bfSmrg<link linkend="table10.7">Table 10.7</link> with <quote>ok</quote> in the
40980f8248bfSmrg<structfield>changed_ctrls</structfield>
40990f8248bfSmrgcolumn.
4100e9fcaa8aSmrg</para>
4101e9fcaa8aSmrg
4102e9fcaa8aSmrg
4103e9fcaa8aSmrg<para>
41040f8248bfSmrgThe controls currently enabled in the server are reported in the
41050f8248bfSmrg<structfield>enabled_ctrls</structfield>
41060f8248bfSmrgfield. If any controls were just enabled or disabled (that is, the contents of
41070f8248bfSmrgthe
41080f8248bfSmrg<structfield>enabled_ctrls</structfield>
41090f8248bfSmrgfield changed), they are flagged in the
41100f8248bfSmrg<structfield>enabled_ctrl_changes</structfield>
41110f8248bfSmrgfield. The valid bits for these fields are the masks listed in
41120f8248bfSmrg<link linkend="table10.7">Table 10.7</link> with
41130f8248bfSmrg<quote>ok</quote> in the
41140f8248bfSmrg<structfield>enabled_ctrls</structfield>
41150f8248bfSmrgcolumn. The
41160f8248bfSmrg<structfield>num_groups</structfield>
41170f8248bfSmrgfield reports the number of groups bound to the key belonging to the most
4118e9fcaa8aSmrgnumber of groups and is automatically updated when the keyboard mapping changes.
4119e9fcaa8aSmrg</para>
4120e9fcaa8aSmrg
4121e9fcaa8aSmrg
4122e9fcaa8aSmrg<para>
41230f8248bfSmrgIf the change was caused by a request from a client, the
41240f8248bfSmrg<structfield>keycode</structfield>
41250f8248bfSmrgand
41260f8248bfSmrg<structfield>event_type</structfield>
41270f8248bfSmrgfields are set to
41280f8248bfSmrg<emphasis>zero</emphasis>
41290f8248bfSmrgand the
41300f8248bfSmrg<structfield>req_major</structfield>
41310f8248bfSmrgand
41320f8248bfSmrg<structfield>req_minor</structfield>
41330f8248bfSmrgfields identify the request. The
41340f8248bfSmrg<structfield>req_major</structfield>
41350f8248bfSmrgvalue is the same as the major extension opcode. Otherwise,
41360f8248bfSmrg<structfield>event_type</structfield>
41370f8248bfSmrgis set to the type of event that caused the change (one of
41380f8248bfSmrg<symbol>KeyPress</symbol>,
41390f8248bfSmrg<symbol>KeyRelease</symbol>,
41400f8248bfSmrg<symbol>DeviceKeyPress</symbol>,
41410f8248bfSmrg<symbol>DeviceKeyRelease</symbol>,
41420f8248bfSmrg<symbol>ButtonPress</symbol>
41430f8248bfSmrgor
41440f8248bfSmrg<symbol>ButtonRelease</symbol>),
41450f8248bfSmrgand
41460f8248bfSmrg<structfield>req_major</structfield>
41470f8248bfSmrgand
41480f8248bfSmrg<structfield>req_minor</structfield>
41490f8248bfSmrgare undefined. If
41500f8248bfSmrg<structfield>event_type</structfield>
41510f8248bfSmrgis
41520f8248bfSmrg<symbol>KeyPress</symbol>,
41530f8248bfSmrg<symbol>KeyRelease</symbol>,
41540f8248bfSmrg<symbol>DeviceKeyPress</symbol>,
41550f8248bfSmrgor
41560f8248bfSmrg<symbol>DeviceKeyRelease</symbol>,
41570f8248bfSmrgthe
41580f8248bfSmrg<structfield>keycode</structfield>
41590f8248bfSmrgfield is set to the key that caused the change. If
41600f8248bfSmrg<structfield>event_type</structfield>
41610f8248bfSmrgis
41620f8248bfSmrg<symbol>ButtonPress</symbol>
41630f8248bfSmrgor
41640f8248bfSmrg<symbol>ButtonRelease</symbol>,
41650f8248bfSmrg<structfield>keycode</structfield>
41660f8248bfSmrgcontains the button number.
41670f8248bfSmrg</para>
41680f8248bfSmrg
41690f8248bfSmrg
41700f8248bfSmrg<para>
41710f8248bfSmrgWhen a client receives an
41720f8248bfSmrg<symbol>XkbControlsNotify</symbol>
41730f8248bfSmrgevent, it can note the changes in a changes structure using
41740f8248bfSmrg<function>XkbNoteControlsChanges</function>.
41750f8248bfSmrg</para>
41760f8248bfSmrg
41770f8248bfSmrg<indexterm significance="preferred" zone="XkbNoteControlsChanges"><primary><function>XkbNoteControlsChanges</function></primary></indexterm>
41780f8248bfSmrg<funcsynopsis id="XkbNoteControlsChanges">
41790f8248bfSmrg  <funcprototype>
41800f8248bfSmrg    <funcdef>void <function>XkbNoteControlsChanges</function></funcdef>
41810f8248bfSmrg<!-- (
41820f8248bfSmrg<parameter>changes</parameter>,
41830f8248bfSmrg<parameter>new</parameter>,
41840f8248bfSmrg<parameter>wanted</parameter>
41850f8248bfSmrg) -->
41860f8248bfSmrg
41870f8248bfSmrg    <paramdef>XkbControlsChangesPtr <parameter>changes</parameter></paramdef>
41880f8248bfSmrg    <paramdef>XkbControlsNotifyEvent *<parameter>new</parameter></paramdef>
41890f8248bfSmrg    <paramdef>unsigned int <parameter>wanted</parameter></paramdef>
41900f8248bfSmrg  </funcprototype>
41910f8248bfSmrg</funcsynopsis>
41920f8248bfSmrg<variablelist>
41930f8248bfSmrg  <varlistentry>
41940f8248bfSmrg    <term>
41950f8248bfSmrg      <parameter>changes</parameter>
41960f8248bfSmrg    </term>
41970f8248bfSmrg    <listitem>
41980f8248bfSmrg      <para>
41990f8248bfSmrg        records changes indicated by new
42000f8248bfSmrg      </para>
42010f8248bfSmrg    </listitem>
42020f8248bfSmrg  </varlistentry>
42030f8248bfSmrg  <varlistentry>
42040f8248bfSmrg    <term>
42050f8248bfSmrg      <parameter>new</parameter>
42060f8248bfSmrg    </term>
42070f8248bfSmrg    <listitem>
42080f8248bfSmrg      <para>
42090f8248bfSmrg        tells which things have changed
42100f8248bfSmrg      </para>
42110f8248bfSmrg    </listitem>
42120f8248bfSmrg  </varlistentry>
42130f8248bfSmrg  <varlistentry>
42140f8248bfSmrg    <term>
42150f8248bfSmrg      <parameter>wanted</parameter>
42160f8248bfSmrg    </term>
42170f8248bfSmrg    <listitem>
42180f8248bfSmrg      <para>
42190f8248bfSmrg        tells which parts of new to record in changes
42200f8248bfSmrg      </para>
42210f8248bfSmrg    </listitem>
42220f8248bfSmrg  </varlistentry>
42230f8248bfSmrg</variablelist>
42240f8248bfSmrg
42250f8248bfSmrg<para>
42260f8248bfSmrgThe
42270f8248bfSmrg<parameter>wanted</parameter>
42280f8248bfSmrgparameter is a bitwise inclusive OR of bits taken from the set of masks
42290f8248bfSmrgspecified in <link linkend="table10.7">Table 10.7</link> with <quote>ok</quote>
42300f8248bfSmrgin the
42310f8248bfSmrg<structfield>changed_ctrls</structfield>
42320f8248bfSmrgcolumn.
42330f8248bfSmrg<function>XkbNoteControlsChanges</function>
42340f8248bfSmrgcopies any changes reported in
42350f8248bfSmrg<parameter>new</parameter>
42360f8248bfSmrgand specified in
42370f8248bfSmrg<parameter>wanted</parameter>
42380f8248bfSmrginto the changes record specified by
42390f8248bfSmrg<parameter>changes</parameter>.
42400f8248bfSmrg</para>
42410f8248bfSmrg
42420f8248bfSmrg
42430f8248bfSmrg<para>
42440f8248bfSmrgUse
42450f8248bfSmrg<function>XkbGetControlsChanges</function>
42460f8248bfSmrgto update a local copy of a keyboard description with the changes previously
42470f8248bfSmrgnoted by one or more calls to
42480f8248bfSmrg<function>XkbNoteControlsChanges</function>.
42490f8248bfSmrg</para>
42500f8248bfSmrg
42510f8248bfSmrg
42520f8248bfSmrg<indexterm significance="preferred" zone="XkbGetControlsChanges"><primary><function>XkbGetControlsChanges</function></primary></indexterm>
42530f8248bfSmrg<funcsynopsis id="XkbGetControlsChanges">
42540f8248bfSmrg  <funcprototype>
42550f8248bfSmrg    <funcdef>Status <function>XkbGetControlsChanges</function></funcdef>
42560f8248bfSmrg<!-- (
42570f8248bfSmrg<parameter>dpy</parameter>,
42580f8248bfSmrg<parameter>xkb</parameter>,
42590f8248bfSmrg<parameter>changes</parameter>
42600f8248bfSmrg) -->
42610f8248bfSmrg
42620f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
42630f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
42640f8248bfSmrg    <paramdef>XkbNameChangesPtr <parameter>changes</parameter></paramdef>
42650f8248bfSmrg  </funcprototype>
42660f8248bfSmrg</funcsynopsis>
42670f8248bfSmrg<variablelist>
42680f8248bfSmrg  <varlistentry>
42690f8248bfSmrg    <term>
42700f8248bfSmrg      <parameter>dpy</parameter>
42710f8248bfSmrg    </term>
42720f8248bfSmrg    <listitem>
42730f8248bfSmrg      <para>
42740f8248bfSmrg        connection to X server
42750f8248bfSmrg      </para>
42760f8248bfSmrg    </listitem>
42770f8248bfSmrg  </varlistentry>
42780f8248bfSmrg  <varlistentry>
42790f8248bfSmrg    <term>
42800f8248bfSmrg      <parameter>xkb</parameter>
42810f8248bfSmrg    </term>
42820f8248bfSmrg    <listitem>
42830f8248bfSmrg      <para>
42840f8248bfSmrg        <structfield>xkb-&gt;ctrls</structfield> will be updated
42850f8248bfSmrg      </para>
42860f8248bfSmrg    </listitem>
42870f8248bfSmrg  </varlistentry>
42880f8248bfSmrg  <varlistentry>
42890f8248bfSmrg    <term>
42900f8248bfSmrg      <parameter>changes</parameter>
42910f8248bfSmrg    </term>
42920f8248bfSmrg    <listitem>
42930f8248bfSmrg      <para>
42940f8248bfSmrg        indicates which parts of <structfield>xkb-&gt;ctrls</structfield> to update
42950f8248bfSmrg      </para>
42960f8248bfSmrg    </listitem>
42970f8248bfSmrg  </varlistentry>
42980f8248bfSmrg</variablelist>
42990f8248bfSmrg
43000f8248bfSmrg<para>
43010f8248bfSmrg<function>XkbGetControlsChanges</function>
43020f8248bfSmrgexamines the
43030f8248bfSmrg<parameter>changes</parameter>
43040f8248bfSmrgparameter, queries the server for the necessary information, and copies the
43050f8248bfSmrgresults into the
43060f8248bfSmrg<parameter>xkb</parameter>-&gt;<structfield>ctrls</structfield>
43070f8248bfSmrgkeyboard description. If the
43080f8248bfSmrg<structfield>ctrls</structfield>
43090f8248bfSmrgfield of
43100f8248bfSmrg<parameter>xkb</parameter>
43110f8248bfSmrgis
43120f8248bfSmrg<symbol>NULL</symbol>,
43130f8248bfSmrg<function>XkbGetControlsChanges</function>
43140f8248bfSmrgallocates and initializes it. To free the
43150f8248bfSmrg<structfield>ctrls</structfield>
43160f8248bfSmrgfield, use
43170f8248bfSmrg<function>XkbFreeControls</function>
43180f8248bfSmrg(see <link linkend="Allocating_and_Freeing_an_XkbControlsRec">section 10.12</link>).
43190f8248bfSmrg</para>
43200f8248bfSmrg
43210f8248bfSmrg
43220f8248bfSmrg<para>
43230f8248bfSmrg<function>XkbGetControlsChanges</function>
43240f8248bfSmrgreturns
43250f8248bfSmrg<symbol>Success</symbol>
43260f8248bfSmrgif successful and can generate
43270f8248bfSmrg<errorname>BadAlloc</errorname>,
43280f8248bfSmrg<errorname>BadImplementation</errorname>,
43290f8248bfSmrgand
43300f8248bfSmrg<errorname>BadMatch</errorname>
43310f8248bfSmrgerrors.
4332e9fcaa8aSmrg</para>
4333e9fcaa8aSmrg
4334e9fcaa8aSmrg
4335e9fcaa8aSmrg</sect1>
4336eb411b4bSmrg<sect1 id='Allocating_and_Freeing_an_XkbControlsRec'>
4337e9fcaa8aSmrg<title>Allocating and Freeing an XkbControlsRec</title>
4338e9fcaa8aSmrg
4339e9fcaa8aSmrg<para>
43400f8248bfSmrgThe need to allocate an
43410f8248bfSmrg<structname>XkbControlsRec</structname>
43420f8248bfSmrgstructure seldom arises; Xkb creates one when an application calls
43430f8248bfSmrg<function>XkbGetControls</function>
43440f8248bfSmrgor a related function. For those situations where there is not an
43450f8248bfSmrg<structname>XkbControlsRec</structname>
43460f8248bfSmrgstructure allocated in the
43470f8248bfSmrg<structname>XkbDescRec</structname>,
43480f8248bfSmrgallocate one by calling
43490f8248bfSmrg<function>XkbAllocControls</function>.
43500f8248bfSmrg</para>
43510f8248bfSmrg
43520f8248bfSmrg<indexterm significance="preferred" zone="XkbAllocControls"><primary><function>XkbAllocControls</function></primary></indexterm>
43530f8248bfSmrg<funcsynopsis id="XkbAllocControls">
43540f8248bfSmrg  <funcprototype>
43550f8248bfSmrg    <funcdef>Status <function>XkbAllocControls</function></funcdef>
43560f8248bfSmrg<!-- (
43570f8248bfSmrg<parameter>xkb, which</parameter>
43580f8248bfSmrg) -->
43590f8248bfSmrg
43600f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
43610f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
43620f8248bfSmrg  </funcprototype>
43630f8248bfSmrg</funcsynopsis>
43640f8248bfSmrg<variablelist>
43650f8248bfSmrg  <varlistentry>
43660f8248bfSmrg    <term>
43670f8248bfSmrg      <parameter>xkb</parameter>
43680f8248bfSmrg    </term>
43690f8248bfSmrg    <listitem>
43700f8248bfSmrg      <para>
43710f8248bfSmrg        Xkb description in which to allocate ctrls rec
43720f8248bfSmrg      </para>
43730f8248bfSmrg    </listitem>
43740f8248bfSmrg  </varlistentry>
43750f8248bfSmrg  <varlistentry>
43760f8248bfSmrg    <term>
43770f8248bfSmrg      <parameter>which</parameter>
43780f8248bfSmrg    </term>
43790f8248bfSmrg    <listitem>
43800f8248bfSmrg      <para>
43810f8248bfSmrg        mask of components of <structfield>ctrls</structfield> to allocate
43820f8248bfSmrg      </para>
43830f8248bfSmrg    </listitem>
43840f8248bfSmrg  </varlistentry>
43850f8248bfSmrg</variablelist>
43860f8248bfSmrg
43870f8248bfSmrg<para>
43880f8248bfSmrg<function>XkbAllocControls</function>
43890f8248bfSmrgallocates the
43900f8248bfSmrg<structfield>ctrls</structfield>
43910f8248bfSmrgfield of the
43920f8248bfSmrg<parameter>xkb</parameter>
43930f8248bfSmrgparameter, initializes all fields to zero, and returns
43940f8248bfSmrg<symbol>Success</symbol>.
43950f8248bfSmrgIf the
43960f8248bfSmrg<structfield>ctrls</structfield>
43970f8248bfSmrgfield is not
43980f8248bfSmrg<symbol>NULL</symbol>,
43990f8248bfSmrg<function>XkbAllocControls</function>
44000f8248bfSmrgsimply returns
44010f8248bfSmrg<symbol>Success</symbol>.
44020f8248bfSmrgIf
44030f8248bfSmrg<parameter>xkb</parameter>
44040f8248bfSmrgis
44050f8248bfSmrg<symbol>NULL</symbol>,
44060f8248bfSmrg<function>XkbAllocControls</function>
44070f8248bfSmrgreports a
44080f8248bfSmrg<errorname>BadMatch</errorname>
44090f8248bfSmrgerror. If the
44100f8248bfSmrg<structfield>ctrls</structfield>
44110f8248bfSmrgfield could not be allocated, it reports a
44120f8248bfSmrg<errorname>BadAlloc</errorname>
44130f8248bfSmrgerror.
44140f8248bfSmrg</para>
44150f8248bfSmrg
44160f8248bfSmrg
44170f8248bfSmrg<para>
44180f8248bfSmrgThe
44190f8248bfSmrg<parameter>which</parameter>
44200f8248bfSmrgmask specifies the individual fields of the
44210f8248bfSmrg<structfield>ctrls</structfield>
44220f8248bfSmrgstructure to be allocated and can contain any of the valid masks defined in
44230f8248bfSmrg<link linkend="table10.7">Table 10.7</link>.
44240f8248bfSmrgBecause none of the currently existing controls have any structures
4425e9fcaa8aSmrgassociated with them, which is currently of little practical value in this call.
4426e9fcaa8aSmrg</para>
4427e9fcaa8aSmrg
4428e9fcaa8aSmrg
4429e9fcaa8aSmrg<para>
44300f8248bfSmrgTo free memory used by the
44310f8248bfSmrg<structfield>ctrls</structfield>
44320f8248bfSmrgmember of an
44330f8248bfSmrg<structname>XkbDescRec</structname>
44340f8248bfSmrgstructure, use
44350f8248bfSmrg<function>XkbFreeControls</function>:
44360f8248bfSmrg</para>
44370f8248bfSmrg
44380f8248bfSmrg
44390f8248bfSmrg<indexterm significance="preferred" zone="XkbFreeControls"><primary><function>XkbFreeControls</function></primary></indexterm>
44400f8248bfSmrg<funcsynopsis id="XkbFreeControls">
44410f8248bfSmrg  <funcprototype>
44420f8248bfSmrg    <funcdef>void <function>XkbFreeControls</function></funcdef>
44430f8248bfSmrg<!-- (
44440f8248bfSmrg<parameter>xkb, which, free_all</parameter>
44450f8248bfSmrg) -->
44460f8248bfSmrg
44470f8248bfSmrg    <paramdef>XkbDescPtr <parameter>xkb</parameter></paramdef>
44480f8248bfSmrg    <paramdef>unsigned int <parameter>which</parameter></paramdef>
44490f8248bfSmrg    <paramdef>Bool <parameter>free_all</parameter></paramdef>
44500f8248bfSmrg  </funcprototype>
44510f8248bfSmrg</funcsynopsis>
44520f8248bfSmrg<variablelist>
44530f8248bfSmrg  <varlistentry>
44540f8248bfSmrg    <term>
44550f8248bfSmrg      <parameter>xkb</parameter>
44560f8248bfSmrg    </term>
44570f8248bfSmrg    <listitem>
44580f8248bfSmrg      <para>
44590f8248bfSmrg        Xkb description in which to free controls components
44600f8248bfSmrg      </para>
44610f8248bfSmrg    </listitem>
44620f8248bfSmrg  </varlistentry>
44630f8248bfSmrg  <varlistentry>
44640f8248bfSmrg    <term>
44650f8248bfSmrg      <parameter>which</parameter>
44660f8248bfSmrg    </term>
44670f8248bfSmrg    <listitem>
44680f8248bfSmrg      <para>
44690f8248bfSmrg        mask of components of <structfield>ctrls</structfield> to free
44700f8248bfSmrg      </para>
44710f8248bfSmrg    </listitem>
44720f8248bfSmrg  </varlistentry>
44730f8248bfSmrg  <varlistentry>
44740f8248bfSmrg    <term>
44750f8248bfSmrg      <parameter>free_all</parameter>
44760f8248bfSmrg    </term>
44770f8248bfSmrg    <listitem>
44780f8248bfSmrg      <para>
44790f8248bfSmrg        <symbol>True</symbol> &rArr; free everything + ctrls itself
44800f8248bfSmrg      </para>
44810f8248bfSmrg    </listitem>
44820f8248bfSmrg  </varlistentry>
44830f8248bfSmrg</variablelist>
44840f8248bfSmrg
44850f8248bfSmrg<para>
44860f8248bfSmrg<function>XkbFreeControls</function>
44870f8248bfSmrgfrees the specified components of the
44880f8248bfSmrg<structfield>ctrls</structfield>
44890f8248bfSmrgfield in the
44900f8248bfSmrg<parameter>xkb</parameter>
44910f8248bfSmrgkeyboard description and sets the corresponding structure component values to
44920f8248bfSmrg<symbol>NULL</symbol>
44930f8248bfSmrgor
44940f8248bfSmrg<emphasis>zero</emphasis>.
44950f8248bfSmrgThe
44960f8248bfSmrg<parameter>which</parameter>
44970f8248bfSmrgmask specifies the fields of
44980f8248bfSmrg<structfield>ctrls</structfield>
44990f8248bfSmrgto be freed and can contain any of the controls components specified in
45000f8248bfSmrg<link linkend="table10.7">Table 10.7</link>.
45010f8248bfSmrg</para>
45020f8248bfSmrg
45030f8248bfSmrg
45040f8248bfSmrg<para>
45050f8248bfSmrgIf
45060f8248bfSmrg<parameter>free_all</parameter>
45070f8248bfSmrgis
45080f8248bfSmrg<symbol>True</symbol>,
45090f8248bfSmrg<function>XkbFreeControls</function>
45100f8248bfSmrgfrees every non-
45110f8248bfSmrg<symbol>NULL</symbol>
45120f8248bfSmrgstructure component in the controls, frees the
45130f8248bfSmrg<structname>XkbControlsRec</structname>
45140f8248bfSmrgstructure referenced by the
45150f8248bfSmrg<structfield>ctrls</structfield>
45160f8248bfSmrgmember of
45170f8248bfSmrg<parameter>xkb</parameter>,
45180f8248bfSmrgand sets
45190f8248bfSmrg<structfield>ctrls</structfield>
45200f8248bfSmrgto
45210f8248bfSmrg<symbol>NULL</symbol>.
4522e9fcaa8aSmrg</para>
4523e9fcaa8aSmrg
4524e9fcaa8aSmrg</sect1>
4525eb411b4bSmrg<sect1 id='The_Miscellaneous_Per_client_Controls'>
4526e9fcaa8aSmrg<title>The Miscellaneous Per-client Controls</title>
4527e9fcaa8aSmrg
4528e9fcaa8aSmrg<para>
4529e9fcaa8aSmrgYou can configure the boolean per-client controls which affect the state
45300f8248bfSmrgreported in button and key events. See
45310f8248bfSmrg<olink targetdoc='xkbproto' targetptr='Setting_a_Passive_Grab_for_an_XKB_State'>section 12.1.1</olink>,
45320f8248bfSmrg<olink targetdoc='xkbproto' targetptr='Effects_of_XKB_on_Core_Protocol_Events'>12.3</olink>,
45330f8248bfSmrg<olink targetdoc='xkbproto' targetptr='Sending_Events_to_Clients'>12.5</olink>,
45340f8248bfSmrgand
45350f8248bfSmrg<olink targetdoc='xkbproto' targetptr='Querying_and_Changing_Per_Client_Flags'>16.3.11</olink>
45360f8248bfSmrgof the
45370f8248bfSmrg<olink targetdoc='xkbproto' targetptr='xkbproto'><citetitle>XKB Protocol specification</citetitle></olink>
45380f8248bfSmrgfor more details.
45390f8248bfSmrg</para>
45400f8248bfSmrg
45410f8248bfSmrg
45420f8248bfSmrg<para>
45430f8248bfSmrgTo get the current values of the
45440f8248bfSmrg<emphasis>per-client</emphasis>
45450f8248bfSmrgcontrols, use
45460f8248bfSmrg<function>XkbGetPerClientControls</function>.
45470f8248bfSmrg</para>
45480f8248bfSmrg
45490f8248bfSmrg<indexterm significance="preferred" zone="XkbGetPerClientControls"><primary><function>XkbGetPerClientControls</function></primary></indexterm>
45500f8248bfSmrg<funcsynopsis id="XkbGetPerClientControls">
45510f8248bfSmrg  <funcprototype>
45520f8248bfSmrg    <funcdef>Bool <function>XkbGetPerClientControls</function></funcdef>
45530f8248bfSmrg<!-- (
45540f8248bfSmrg<parameter>dpy</parameter>,
45550f8248bfSmrg<parameter>ctrls</parameter>
45560f8248bfSmrg) -->
45570f8248bfSmrg
45580f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
45590f8248bfSmrg    <paramdef>unsigned int *<parameter>ctrls</parameter></paramdef>
45600f8248bfSmrg  </funcprototype>
45610f8248bfSmrg</funcsynopsis>
45620f8248bfSmrg<variablelist>
45630f8248bfSmrg  <varlistentry>
45640f8248bfSmrg    <term>
45650f8248bfSmrg      <parameter>dpy</parameter>
45660f8248bfSmrg    </term>
45670f8248bfSmrg    <listitem>
45680f8248bfSmrg      <para>
45690f8248bfSmrg        connection to X server
45700f8248bfSmrg      </para>
45710f8248bfSmrg    </listitem>
45720f8248bfSmrg  </varlistentry>
45730f8248bfSmrg  <varlistentry>
45740f8248bfSmrg    <term>
45750f8248bfSmrg      <parameter>ctrls</parameter>
45760f8248bfSmrg    </term>
45770f8248bfSmrg    <listitem>
45780f8248bfSmrg      <para>
45790f8248bfSmrg        1 bit &rArr; corresponding control is on
45800f8248bfSmrg      </para>
45810f8248bfSmrg    </listitem>
45820f8248bfSmrg  </varlistentry>
45830f8248bfSmrg</variablelist>
45840f8248bfSmrg
45850f8248bfSmrg<para>
45860f8248bfSmrg<function>XkbGetPerClientControls</function>
45870f8248bfSmrgbackfills
45880f8248bfSmrg<parameter>ctrls</parameter>
45890f8248bfSmrgwith the
45900f8248bfSmrg<emphasis>per-client</emphasis>
45910f8248bfSmrgcontrol attributes for this particular client. It returns
45920f8248bfSmrg<symbol>True</symbol>
45930f8248bfSmrgif successful, and
45940f8248bfSmrg<symbol>False</symbol>
45950f8248bfSmrgotherwise.
45960f8248bfSmrg</para>
45970f8248bfSmrg
45980f8248bfSmrg
45990f8248bfSmrg<para>
46000f8248bfSmrgTo change the current values of the
46010f8248bfSmrg<emphasis>per-client</emphasis>
46020f8248bfSmrgcontrol attributes, use
46030f8248bfSmrg<function>XkbSetPerClientControls</function>.
46040f8248bfSmrg</para>
46050f8248bfSmrg
46060f8248bfSmrg
46070f8248bfSmrg<indexterm significance="preferred" zone="XkbSetPerClientControls"><primary><function>XkbSetPerClientControls</function></primary></indexterm>
46080f8248bfSmrg<funcsynopsis id="XkbSetPerClientControls">
46090f8248bfSmrg  <funcprototype>
46100f8248bfSmrg    <funcdef>Bool <function>XkbSetPerClientControls</function></funcdef>
46110f8248bfSmrg<!-- (
46120f8248bfSmrg<parameter>dpy</parameter>,
46130f8248bfSmrg<parameter>ctrls</parameter>
46140f8248bfSmrg) -->
46150f8248bfSmrg
46160f8248bfSmrg    <paramdef>Display *<parameter>dpy</parameter></paramdef>
46170f8248bfSmrg    <paramdef>unsigned int <parameter>change</parameter></paramdef>
46180f8248bfSmrg    <paramdef>unsigned int *<parameter>value</parameter></paramdef>
46190f8248bfSmrg  </funcprototype>
46200f8248bfSmrg</funcsynopsis>
46210f8248bfSmrg<variablelist>
46220f8248bfSmrg  <varlistentry>
46230f8248bfSmrg    <term>
46240f8248bfSmrg      <parameter>dpy</parameter>
46250f8248bfSmrg    </term>
46260f8248bfSmrg    <listitem>
46270f8248bfSmrg      <para>
46280f8248bfSmrg        connection to X server
46290f8248bfSmrg      </para>
46300f8248bfSmrg    </listitem>
46310f8248bfSmrg  </varlistentry>
46320f8248bfSmrg  <varlistentry>
46330f8248bfSmrg    <term>
46340f8248bfSmrg      <parameter>change</parameter>
46350f8248bfSmrg    </term>
46360f8248bfSmrg    <listitem>
46370f8248bfSmrg      <para>
46380f8248bfSmrg        1 bit &rArr; change control
46390f8248bfSmrg      </para>
46400f8248bfSmrg    </listitem>
46410f8248bfSmrg  </varlistentry>
46420f8248bfSmrg  <varlistentry>
46430f8248bfSmrg    <term>
46440f8248bfSmrg      <parameter>value</parameter>
46450f8248bfSmrg    </term>
46460f8248bfSmrg    <listitem>
46470f8248bfSmrg      <para>
46480f8248bfSmrg        1 bit &rArr; control on
46490f8248bfSmrg      </para>
46500f8248bfSmrg    </listitem>
46510f8248bfSmrg  </varlistentry>
46520f8248bfSmrg</variablelist>
46530f8248bfSmrg
46540f8248bfSmrg<para>
46550f8248bfSmrg<function>XkbSetPerClientControls</function>
46560f8248bfSmrgchanges the per-client values for the controls selected by
46570f8248bfSmrg<parameter>change</parameter> to the corresponding value in
46580f8248bfSmrg<parameter>value</parameter>. Legal values for
46590f8248bfSmrg<parameter>change</parameter> and <parameter>value</parameter>
4660e9fcaa8aSmrgare: XkbPCF_GrabsUseXKBStateMask, XkbPCF_LookupStateWhenGrabbed, and
4661e9fcaa8aSmrgXkbPCF_SendEventUsesXKBState. More than one control may be changed at one time
4662e9fcaa8aSmrgby OR-ing the values together. XkbSetPerClientControls backfills value with the
46630f8248bfSmrg<emphasis>per-client</emphasis>
46640f8248bfSmrgcontrol attributes for this particular client.
46650f8248bfSmrgIt returns
46660f8248bfSmrg<symbol>True</symbol>
46670f8248bfSmrgif successful, and
46680f8248bfSmrg<symbol>False</symbol>
46690f8248bfSmrgotherwise.
4670e9fcaa8aSmrg</para>
4671e9fcaa8aSmrg
4672e9fcaa8aSmrg</sect1>
4673e9fcaa8aSmrg</chapter>
4674