xenocara/proto/kbproto/specs/ch04.xml

866 lines
25 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<chapter id='Global_Keyboard_Controls'>
<title>Global Keyboard Controls</title>
<para>
The X Keyboard Extension supports a number of <emphasis>
global key controls</emphasis>
, which affect the way that XKB handles the keyboard as a whole. Many of these
controls make the keyboard more accessible to the physically impaired and are
based on the AccessDOS package<footnote><para>
AccessDOS provides access to the DOS operating system for people with physical
impairments and was developed by the Trace R&amp;D Center at the University of
Wisconsin. For more information on AccessDOS, contact the Trace R&amp;D Center,
Waisman Center and Department of Industrial Engineering, University of
Wisconsin-Madison WI 53705-2280. Phone: 608-262-6966. e-mail:
info@trace.wisc.edu.</para></footnote>.
</para>
<sect1 id='The_RepeatKeys_Control'>
<title>The RepeatKeys Control</title>
<para>
The core protocol only allows control over whether or not the entire keyboard
or individual keys should autorepeat when held down. The <emphasis>
RepeatKeys</emphasis>
control extends this capability by adding control over the delay until a key
begins to repeat and the rate at which it repeats. <emphasis>
RepeatKeys</emphasis>
is also coupled with the core autorepeat control; changes to one are always
reflected in the other.
</para>
<para>
The <emphasis>
RepeatKeys</emphasis>
control has two parameters. The <emphasis>
autorepeat delay</emphasis>
specifies the delay between the initial press of an autorepeating key and the
first generated repeat event in milliseconds. The <emphasis>
autorepeat interval</emphasis>
specifies the delay between all subsequent generated repeat events in
milliseconds.
</para>
<sect2 id='The_PerKeyRepeat_Control'>
<title>The PerKeyRepeat Control</title>
<para>
When <emphasis>
RepeatKeys</emphasis>
are active, the <emphasis>
PerKeyRepeat</emphasis>
control specifies whether or not individual keys should autorepeat when held
down. XKB provides the <emphasis>
PerKeyRepeat</emphasis>
for convenience only, and it always parallels the <emphasis>
auto-repeats</emphasis>
field of the core protocol <emphasis>
GetKeyboardControl</emphasis>
request — changes to one are always reflected in the other.
</para>
</sect2>
<sect2 id='Detectable_Autorepeat'>
<title>Detectable Autorepeat</title>
<para>
The X server usually generates both press and release events whenever an
autorepeating key is held down. If an XKB-aware client enables the <emphasis>
DetectableAutorepeat</emphasis>
per-client option for a keyboard, the server sends that client a key release
event only when the key is <emphasis>
physically</emphasis>
released. For example, holding down a key to generate three characters without
detectable autorepeat yields:
</para>
<literallayout class='monospaced'>
Press <emphasis>-></emphasis> Release <emphasis>-></emphasis> Press <emphasis>-></emphasis> Release <emphasis>-></emphasis> Press <emphasis>-></emphasis> Release
</literallayout>
<para>
If detectable autorepeat is enabled, the client instead receives:
</para>
<literallayout class='monospaced'>
Press<emphasis>-></emphasis> Press <emphasis>-></emphasis> Press <emphasis>-></emphasis> Release
</literallayout>
<para>
Note that only clients that request detectable autorepeat are affected; other
clients continue to receive both press and release events for autorepeating
keys. Also note that support for detectable autorepeat is optional; servers are
not required to support detectable autorepeat, but they must correctly report
whether or not it is supported.
</para>
<para>
<link linkend='Querying_and_Changing_Per_Client_Flags'>Querying and Changing Per-Client
Flags</link> describes the <emphasis>
XkbPerClientFlags</emphasis>
request, which reports or changes values for all of the per-client flags, and
which lists the per-client flags that are supported.
</para>
</sect2>
</sect1>
<sect1 id='The_SlowKeys_Control'>
<title>The SlowKeys Control</title>
<para>
Some users often bump keys accidentally while moving their hand or typing stick
toward the key they want. Usually, the keys that are bumped accidentally are
hit only for a very short period of time. The <emphasis>
SlowKeys</emphasis>
control helps filter these accidental bumps by telling the server to wait a
specified period, called the <emphasis>
SlowKeys acceptance delay</emphasis>
, before delivering key events. If the key is released before this period
elapses, no key events are generated. The user can then bump any number of keys
on their way to the one they want without generating unwanted characters. Once
they have reached the key they want, they can then hold it long enough for
<emphasis>
SlowKeys</emphasis>
to accept it.
</para>
<para>
The <emphasis>
SlowKeys</emphasis>
control has one parameter; the <emphasis>
slow keys delay</emphasis>
specifies the length of time, in milliseconds, that a key must be held down
before it is accepted.
</para>
<para>
When <emphasis>
SlowKeys</emphasis>
are active, the X Keyboard Extension reports the initial press, acceptance,
rejection or release of any key to interested clients using <emphasis>
AccessXNotify</emphasis>
events. The <emphasis>
AccessXNotify</emphasis>
event is described in more detail in <link linkend='Events'>Events</link>.
</para>
</sect1>
<sect1 id='The_BounceKeys_Control'>
<title>The BounceKeys Control</title>
<para>
Some people with physical impairments accidentally "bounce" on a key when they
press it. That is, they press it once, then accidentally press it again
immediately. The <emphasis>
BounceKeys</emphasis>
control temporarily disables a key after it has been pressed, effectively
"debouncing" the keyboard.
</para>
<para>
The <emphasis>
BounceKeys</emphasis>
has a single parameter. The <emphasis>
BounceKeys delay</emphasis>
specifies the period of time, in milliseconds, that the key is disabled after
it is pressed.
</para>
<para>
When <emphasis>
BounceKeys</emphasis>
are active, the server reports the acceptance or rejection of any key to
interested clients by sending an <emphasis>
AccessXNotify</emphasis>
event. The <emphasis>
AccessXNotify</emphasis>
event is described in more detail in <link linkend='Events'>Events</link>.
</para>
</sect1>
<sect1 id='The_StickyKeys_Control'>
<title>The StickyKeys Control</title>
<para>
Some people find it difficult or impossible to press two keys at once. The
<emphasis>
StickyKeys</emphasis>
control makes it easier for them to type by changing the behavior of the
modifier keys. When <emphasis>
StickyKeys</emphasis>
are enabled, a modifier is latched when the user presses it just once, so the
user can first press a modifier, release it, then press another key. For
example, to get an exclamation point (!) on a PC-style keyboard, the user can
press the <emphasis>
Shift</emphasis>
key, release it, then press the <emphasis>
1</emphasis>
key.
</para>
<para>
By default, <emphasis>
StickyKeys</emphasis>
also allows users to lock modifier keys without requiring special locking
keys. The user can press a modifier twice in a row to lock it, and then unlock
it by pressing it one more time.
</para>
<para>
Modifiers are automatically unlatched when the user presses a non-modifier key.
For instance, to enter the sequence <emphasis>
Shift</emphasis>
+<emphasis>
Ctrl</emphasis>
+<emphasis>
Z</emphasis>
the user could press and release the <emphasis>
Shift</emphasis>
key to latch the <emphasis>
Shift</emphasis>
modifier, then press and release the <emphasis>
Ctrl</emphasis>
key to latch the <emphasis>
Control</emphasis>
modifier — the <emphasis>
Ctrl</emphasis>
key is a modifier key, so pressing it does not unlatch the <emphasis>
Shift</emphasis>
modifier, but leaves both the <emphasis>
Shift</emphasis>
and <emphasis>
Control</emphasis>
modifiers latched, instead. When the user presses the <emphasis>
Z</emphasis>
key, it will be as though the user pressed <emphasis>
Shift</emphasis>
+<emphasis>
Ctrl</emphasis>
+<emphasis>
Z</emphasis>
simultaneously. The <emphasis>
Z</emphasis>
key is not a modifier key, so the <emphasis>
Shift</emphasis>
and <emphasis>
Control</emphasis>
modifiers are unlatched after the event is generated.
</para>
<para>
A locked a modifier remains in effect until the user unlocks it. For example,
to enter the sequence ("XKB") on a PC-style keyboard with a typical US/ASCII
layout, the user could press and release the <emphasis>
Shift</emphasis>
key twice to lock the <emphasis>
Shift</emphasis>
modifier. Then, when the user presses the <emphasis>
9</emphasis>
, <emphasis>
</emphasis>
, <emphasis>
x</emphasis>
, <emphasis>
k</emphasis>
, <emphasis>
b</emphasis>
, <emphasis>
</emphasis>
, and <emphasis>
0</emphasis>
keys in sequence, it will generate ("XKB"). To unlock the <emphasis>
Shift</emphasis>
modifier, the user can press and release the <emphasis>
Shift</emphasis>
key.
</para>
<para>
Two option flags modify the behavior of the <emphasis>
StickyKeys</emphasis>
control:
</para>
<itemizedlist>
<listitem>
<para>If the <emphasis>
XkbAX_TwoKeys</emphasis>
flag is set, XKB automatically turns <emphasis>
StickyKeys</emphasis>
off if the user presses two or more keys at once. This serves to automatically
disable StickyKeys when a user who does not require sticky keys is using the
keyboard.
</para>
</listitem>
<listitem>
<para>The <emphasis>
XkbAX_LatchToLock</emphasis>
controls the locking behavior of <emphasis>
StickyKeys</emphasis>
; the <emphasis>
StickyKeys</emphasis>
control only locks modifiers as described above if the <emphasis>
XkbAX_LatchToLock</emphasis>
flag is set.
</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id='The_MouseKeys_Control'>
<title>The MouseKeys Control</title>
<para>
The <emphasis>
MouseKeys</emphasis>
control lets a user control all the mouse functions from the keyboard. When
<emphasis>
MouseKeys</emphasis>
are enabled, all keys with <emphasis>
MouseKeys</emphasis>
actions bound to them generate core pointer events instead of normal key press
and release events.
</para>
<para>
The <emphasis>
MouseKeys</emphasis>
control has a single parameter, the <emphasis>
mouse keys default button</emphasis>
, which specifies the core pointer button to be used by mouse keys actions that
do not explicitly specify a button.
</para>
</sect1>
<sect1 id='The_MouseKeysAccel_Control'>
<title>The MouseKeysAccel Control</title>
<para>
If the <emphasis>
MouseKeysAccel</emphasis>
control is enabled, the effect of a pointer motion action changes as a key is
held down. The <emphasis>
mouse keys delay</emphasis>
specifies the amount of time between the initial key press and the first
repeated motion event. The <emphasis>
mouse keys interval</emphasis>
specifies the amount of time between repeated mouse keys events. The <emphasis>
steps to maximum acceleration</emphasis>
field specifies the total number of events before the key is travelling at
maximum speed. The <emphasis>
maximum acceleration</emphasis>
field specifies the maximum acceleration. The <emphasis>
curve</emphasis>
parameter controls the ramp used to reach maximum acceleration.
</para>
<para>
When <emphasis>
MouseKeys</emphasis>
are active and a <emphasis>
SA_MovePtr</emphasis>
key action (see <link linkend='Key_Actions'>Key
Actions</link>) is activated, a pointer motion event is generated immediately.
If <emphasis>
MouseKeysAccel</emphasis>
is enabled and if acceleration is enabled for the key in question, a second
event is generated after <emphasis>
mouse keys delay </emphasis>
milliseconds, and additional events are generated every <emphasis>
mouse keys interval</emphasis>
milliseconds for as long as the key is held down.
</para>
<sect2 id='Relative_Pointer_Motion'>
<title>Relative Pointer Motion</title>
<para>
If the <emphasis>
SA_MovePtr</emphasis>
action specifies relative motion, events are generated as follows: The initial
event always moves the cursor the distance specified in the action; after
<emphasis>
steps to maximum acceleration</emphasis>
events have been generated, all subsequent events move the pointer the
distance specified in the action times the <emphasis>
maximum acceleration.</emphasis>
Events after the first but before maximum acceleration has been achieved are
accelerated according to the formula:
</para>
<mediaobject>
<imageobject>
<imagedata format="SVG" fileref="XKBproto-1.svg"/>
</imageobject>
</mediaobject>
<para>
Where <emphasis>
action_delta</emphasis>
is the offset specified by the mouse keys action, <emphasis>
max_accel </emphasis>
and <emphasis>
steps_to_max</emphasis>
are parameters to the <emphasis>
MouseKeysAccel</emphasis>
ctrl, and the curveFactor is computed using the <emphasis>
MouseKeysAccel</emphasis>
<emphasis>
curve</emphasis>
parameter as follows:
</para>
<mediaobject>
<imageobject> <imagedata format="SVG" fileref="XKBproto-2.svg"/>
</imageobject>
</mediaobject>
<para>
With the result that a <emphasis>
curve</emphasis>
of <emphasis>
0</emphasis>
causes the distance moved to increase linearly from <emphasis>
action_delta</emphasis>
to <mediaobject>
<imageobject> <imagedata format="SVG" fileref="XKBproto-3.svg"/>
</imageobject>
</mediaobject>
, and the minimum legal <emphasis>
curve</emphasis>
of -<emphasis>
1000</emphasis>
causes all events after the first move at <emphasis>
max_accel</emphasis>
. A negative <emphasis>
curve</emphasis>
causes an initial sharp increase in acceleration which tapers off, while a
positive curve yields a slower initial increase in acceleration followed by a
sharp increase as the number of pointer events generated by the action
approaches <emphasis>
steps_to_max</emphasis>
.
</para>
</sect2>
<sect2 id='Absolute_Pointer_Motion'>
<title>Absolute Pointer Motion</title>
<para>
If an <emphasis>
SA_MovePtr</emphasis>
action specifies an absolute position for one of the coordinates but still
allows acceleration, all repeated events contain any absolute coordinates
specified in the action.
</para>
</sect2>
</sect1>
<sect1 id='The_AccessXKeys_Control'>
<title>The AccessXKeys Control</title>
<para>
If <emphasis>
AccessXKeys</emphasis>
is enabled many controls can also be turned on or off from the keyboard by
entering the following standard key sequences:
</para>
<itemizedlist>
<listitem>
<para>Holding down a shift key by itself for eight seconds toggles the
<emphasis>
SlowKeys</emphasis>
control.
</para>
</listitem>
<listitem>
<para>Pressing and releasing a shift key five times in a row without any
intervening key events and with less than 30 seconds delay between consecutive
presses toggles the state of the <emphasis>
StickyKeys</emphasis>
control.
</para>
</listitem>
<listitem>
<para>Simultaneously operating two or more modifier keys deactivates the
<emphasis>
StickyKeys</emphasis>
control.
</para>
</listitem>
</itemizedlist>
<para>
Some of these key sequences optionally generate audible feedback of the change
in state, as described in <link linkend='The_AccessXFeedback_Control'>The
AccessXFeedback Control</link>, or cause <emphasis>
XkbAccessXNotify</emphasis>
events as described in <link linkend='Events'>Events</link>.
</para>
</sect1>
<sect1 id='The_AccessXTimeout_Control'>
<title>The AccessXTimeout Control</title>
<para>
In environments where computers are shared, features such as <emphasis>
SlowKeys</emphasis>
present a problem: if <emphasis>
SlowKeys</emphasis>
is on, the keyboard can appear to be unresponsive because keys have no effect
unless they are held for a certain period of time. To help address this
problem, XKB provides an <emphasis>
AccessXTimeout</emphasis>
control to automatically change the value of any global controls or AccessX
options if the keyboard is idle for a specified period of time.
</para>
<para>
The AccessXTimeout control has a number of parameters which affect the duration
of the timeout and the features changed when the timeout expires.
</para>
<para>
The <emphasis>
AccessX Timeout</emphasis>
field specifies the number of seconds the keyboard must be idle before the
global controls and AccessX options are modified. The <emphasis>
AccessX Options Mask</emphasis>
field specifies which values in the <emphasis>
AccessX Options</emphasis>
field are to be changed, and the <emphasis>
AccessX Options Values</emphasis>
field specifies the new values for those options. The <emphasis>
AccessX Controls Mask</emphasis>
field specifies which controls are to be changed in the global set of
<emphasis>
enabled controls</emphasis>
, and the <emphasis>
AccessX Controls Values</emphasis>
field specifies the new values for those controls.
</para>
</sect1>
<sect1 id='The_AccessXFeedback_Control'>
<title>The AccessXFeedback Control</title>
<para>
If <emphasis>
AccessXFeedback</emphasis>
is enabled, special beep-codes indicate changes in keyboard controls (or some
key events when <emphasis>
SlowKeys</emphasis>
or <emphasis>
StickyKeys</emphasis>
are active). Many beep codes sound as multiple tones, but XKB reports a single
<emphasis>
XkbBellNotify</emphasis>
event for the entire sequence of tones.
</para>
<para>
All feedback tones are governed by the <emphasis>
AudibleBell</emphasis>
control. Individual feedback tones can be explicitly enabled or disabled using
the <emphasis>
accessX options mask</emphasis>
or set to deactivate after an idle period using the <emphasis>
accessX timeout options mask</emphasis>
. XKB defines the following feedback tones:
</para>
<informaltable frame='topbot'>
<?dbfo keep-together="always" ?>
<tgroup cols='4' align='left' colsep='0' rowsep='0'>
<colspec colname='c1' colwidth='1.0*'/>
<colspec colname='c2' colwidth='1.5*'/>
<colspec colname='c3' colwidth='1.5*'/>
<colspec colname='c4' colwidth='1.5*'/>
<thead>
<row rowsep='1'>
<entry>Feedback Name</entry>
<entry>Bell Name</entry>
<entry>Default Sound</entry>
<entry>Indicates</entry>
</row>
</thead>
<tbody>
<row>
<entry>FeatureFB</entry>
<entry>AX_FeatureOn</entry>
<entry>rising tone</entry>
<entry>Keyboard control enabled</entry>
</row>
<row>
<entry>&#x0020;</entry>
<entry>AX_FeatureOff</entry>
<entry>falling tone</entry>
<entry>Keyboard control disabled</entry>
</row>
<row>
<entry>&#x0020;</entry>
<entry>AX_FeatureChange</entry>
<entry>two tones</entry>
<entry>Several controls changed state</entry>
</row>
<row>
<entry>IndicatorFB</entry>
<entry>AX_IndicatorOn</entry>
<entry>high tone</entry>
<entry>Indicator Lit</entry>
</row>
<row>
<entry>&#x0020;</entry>
<entry>AX_IndicatorOff</entry>
<entry>low tone</entry>
<entry>Indicator Extinguished</entry>
</row>
<row>
<entry>&#x0020;</entry>
<entry>AX_IndicatorChange</entry>
<entry>two high tones</entry>
<entry>Several indicators changed state</entry>
</row>
<row>
<entry>SlowWarnFB</entry>
<entry>AX_SlowKeysWarning</entry>
<entry>three high tones</entry>
<entry>Shift key held for four seconds</entry>
</row>
<row>
<entry>SKPressFB</entry>
<entry>AX_SlowKeyPress</entry>
<entry>single tone</entry>
<entry>Key press while <emphasis>
SlowKeys</emphasis>
are on</entry>
</row>
<row>
<entry>SKReleaseFB</entry>
<entry>AX_SlowKeyRelease</entry>
<entry>single tone</entry>
<entry>Key release while <emphasis>
SlowKeys</emphasis>
are on</entry>
</row>
<row>
<entry>SKAcceptFB</entry>
<entry>AX_SlowKeyAccept</entry>
<entry>single tone</entry>
<entry>Key event accepted by <emphasis>
SlowKeys</emphasis>
</entry>
</row>
<row>
<entry>SKRejectFB</entry>
<entry>AX_SlowKeyReject</entry>
<entry>low tone</entry>
<entry>Key event rejected by <emphasis>
SlowKeys</emphasis>
</entry>
</row>
<row>
<entry>StickyKeysFB</entry>
<entry>AX_StickyLatch</entry>
<entry>low tone then high tone</entry>
<entry>Modifier latched by <emphasis>
StickyKeys</emphasis>
</entry>
</row>
<row>
<entry>&#x0020;</entry>
<entry>AX_StickyLock</entry>
<entry>high tone</entry>
<entry>Modifier locked by <emphasis>
StickyKeys</emphasis>
</entry>
</row>
<row>
<entry>&#x0020;</entry>
<entry>AX_StickyUnlock</entry>
<entry>low tone</entry>
<entry>Modifier unlocked by <emphasis>
StickyKeys</emphasis>
</entry>
</row>
<row>
<entry>BKRejectFB</entry>
<entry>AX_BounceKeysReject</entry>
<entry>low tone</entry>
<entry>Key event rejected by <emphasis>
BounceKeys</emphasis>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<para>
Implementations that cannot generate continuous tones may generate multiple
beeps instead of falling and rising tones; for example, they can generate a
high-pitched beep followed by a low-pitched beep instead of a continuous
falling tone.
</para>
<para>
If the physical keyboard bell is not very capable, attempts to simulate a
continuous tone with multiple bells can sound horrible. Set the <emphasis>
DumbBellFB</emphasis>
AccessX option to inform the server that the keyboard bell is not very capable
and that XKB should use only simple bell combinations. Keyboard capabilities
vary wildly, so the sounds generated for the individual bells when the
<emphasis>
DumbBellFB</emphasis>
option is set are implementation specific.
</para>
</sect1>
<sect1 id='The_Overlay1_and_Overlay2_Controls'>
<title>The Overlay1 and Overlay2 Controls</title>
<para>
A keyboard overlay allows some subset of the keyboard to report alternate
keycodes when the overlay is enabled. For example a keyboard overlay can be
used to simulate a numeric or editing keypad on keyboard that does not actually
have one by generating alternate of keycodes for some keys when the overlay is
enabled. This technique is very common on portable computers and embedded
systems with small keyboards.
</para>
<para>
XKB includes direct support for two keyboard overlays, using the <emphasis>
Overlay1</emphasis>
and <emphasis>
Overlay2</emphasis>
controls. When <emphasis>
Overlay1</emphasis>
is enabled, all of the keys that are members of the first keyboard overlay
generate an alternate keycode. When <emphasis>
Overlay2</emphasis>
is enabled, all of the keys that are members of the second keyboard overlay
generate an alternate keycode.
</para>
<para>
To specify the overlay to which a key belongs and the alternate keycode it
should generate when that overlay is enabled, assign it either the <emphasis>
KB_Overlay1</emphasis>
or <emphasis>
KB_Overlay2</emphasis>
key behaviors, as described in <link linkend='Key_Behavior'>
Key Behavior</link>.
</para>
</sect1>
<sect1 id='Boolean_Controls_and_The_EnabledControls_Control'>
<title>"Boolean" Controls and The EnabledControls Control</title>
<para>
All of the controls described above, along with the <emphasis>
AudibleBell</emphasis>
control (described in <link linkend='Disabling_Server_Generated_Bells'>Disabling
Server Generated Bells</link>) and the <emphasis>
IgnoreGroupLock</emphasis>
control (described in <link linkend='Server_Internal_Modifiers_and_Ignore_Locks_Behavior'>Server
Internal Modifiers and Ignore Locks Behavior</link>) comprise the <emphasis>
boolean controls</emphasis>
. In addition to any parameters listed in the descriptions of the individual
controls, the boolean controls can be individually enabled or disabled by
changing the value of the <emphasis>
EnabledControls</emphasis>
control.
</para>
<para>
The following <emphasis>
non-boolean</emphasis>
controls are always active and cannot be changed using the <emphasis>
EnabledControls</emphasis>
control or specified in any context that accepts only boolean controls:
<emphasis>
GroupsWrap</emphasis>
(<link linkend='Computing_Effective_Modifier_and_Group'>Computing Effective Modifier and
Group</link>), <emphasis>
EnabledControls</emphasis>
, <emphasis>
InternalMods</emphasis>
(<link linkend='Server_Internal_Modifiers_and_Ignore_Locks_Behavior'>Server Internal Modifiers and
Ignore Locks Behavior</link>), and <emphasis>
IgnoreLockMods</emphasis>
(<link linkend='Server_Internal_Modifiers_and_Ignore_Locks_Behavior'>Server Internal Modifiers and
Ignore Locks Behavior</link>) and <emphasis>
PerKeyRepeat</emphasis>
(<link linkend='The_RepeatKeys_Control'>The RepeatKeys Control</link>)
</para>
</sect1>
<sect1 id='Automatic_Reset_of_Boolean_Controls'>
<title>Automatic Reset of Boolean Controls</title>
<para>
The <emphasis>
auto-reset controls</emphasis>
are a per-client value which consist of two masks that can contain any of the
boolean controls (see <link linkend='Boolean_Controls_and_The_EnabledControls_Control'>"Boolean"
Controls and The EnabledControls Control</link>). Whenever the client exits
for any reason, any boolean controls specified in the <emphasis>
auto-reset mask</emphasis>
are set to the corresponding value from the <emphasis>
auto-reset values</emphasis>
mask. This makes it possible for clients to "clean up after themselves"
automatically, even if abnormally terminated.
</para>
<para>
For example, a client that replace the keyboard bell with some other audible
cue might want to turn off the <emphasis>
AudibleBell</emphasis>
control (<link linkend='Disabling_Server_Generated_Bells'>Disabling Server
Generated Bells</link>) to prevent the server from also generating a sound and
thus avoid cacophony. If the client were to exit without resetting the
<emphasis>
AudibleBell </emphasis>
control, the user would be left without any feedback at all. Setting <emphasis>
AudibleBell</emphasis>
in both the auto-reset mask and auto-reset values guarantees that the audible
bell will be turned back on when the client exits.
</para>
</sect1>
</chapter>