aboutsummaryrefslogtreecommitdiff
path: root/libX11/specs/XKB/ch01.xml
diff options
context:
space:
mode:
Diffstat (limited to 'libX11/specs/XKB/ch01.xml')
-rw-r--r--libX11/specs/XKB/ch01.xml404
1 files changed, 404 insertions, 0 deletions
diff --git a/libX11/specs/XKB/ch01.xml b/libX11/specs/XKB/ch01.xml
new file mode 100644
index 000000000..5079a411a
--- /dev/null
+++ b/libX11/specs/XKB/ch01.xml
@@ -0,0 +1,404 @@
+<chapter id='overview'>
+<title>Overview</title>
+
+<para>
+The X Keyboard Extension provides capabilities that are lacking or are
+cumbersome in the core X protocol.
+</para>
+
+<sect1 id='core_x_protocol_support_for_keyboards'>
+<title>Core X Protocol Support for Keyboards</title>
+
+<para>
+The core X protocol specifies the ways that the
+<emphasis>Shift</emphasis>,
+<emphasis>Control</emphasis>, and
+<emphasis>Lock</emphasis>
+modifiers and the modifiers bound to the
+<emphasis>Mode_switch</emphasis> or
+<emphasis>Num_Lock</emphasis>
+keysyms interact to generate keysyms and characters. The core protocol also
+allows users to specify that a key affects one or more modifiers. This behavior
+is simple and fairly flexible, but it has a number of limitations that make it
+difficult or impossible to properly support many common varieties of keyboard
+behavior. The limitations of core protocol support for keyboards include:
+</para>
+
+<itemizedlist>
+ <listitem>
+ <para>
+Use of a single, uniform, four-symbol mapping for all keyboard keys makes it
+difficult to properly support keyboard overlays, PC-style break keys, or
+keyboards that comply with ISO9995, or a host of other national and
+international standards.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+A second keyboard group may be specified using a modifier, but this has side
+effects that wreak havoc with client grabs and X toolkit translations.
+Furthermore, this approach limits the number of keyboard groups to two.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Poorly specified locking key behavior requires X servers to look for a few
+"magic" keysyms to determine that keys should lock when pressed. This leads to
+incompatibilities between X servers with no way for clients to detect
+implementation differences.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Poorly specified capitalization and control behavior requires modifications to
+X library source code to support new character sets or locales and can lead to
+incompatibilities between system wide and X library capitalization behavior.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Limited interactions between modifiers specified by the core protocol make many
+common keyboard behaviors difficult or impossible to implement. For example,
+there is no reliable way to indicate whether or not the shift modifier should
+"cancel" the lock modifier.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+The lack of any explicit descriptions for indicators, most modifiers, and other
+aspects of the keyboard appearance requires clients that wish to clearly
+describe the keyboard to a user to resort to a mish-mash of prior knowledge and
+heuristics.
+ </para>
+ </listitem>
+</itemizedlist>
+
+</sect1>
+<sect1 id='xkb_keyboard_extension_support_for_keyboards'>
+<title>Xkb Keyboard Extension Support for Keyboards</title>
+
+<para>
+The X Keyboard Extension makes it possible to clearly and explicitly specify
+most aspects of keyboard behavior on a per-key basis. It adds the notion of a
+keyboard group to the global keyboard state and provides mechanisms to more
+closely track the logical and physical state of the keyboard. For
+keyboard-control clients, Xkb provides descriptions and symbolic names for many
+aspects of keyboard appearance and behavior.
+</para>
+
+<para>
+In addition, the X Keyboard Extension includes additional keyboard controls
+designed to make keyboards more accessible to people with movement impairments.
+</para>
+
+</sect1>
+
+<sect1 id='xkb_extension_components'>
+<title>Xkb Extension Components</title>
+
+<para>
+The Xkb extension is composed of two parts: a server extension, and a
+client-side X library extension. These consist of a loadable module that may be
+activated when an X server is started and a modified version of Xlib. Both
+server and Xlib versions must be at least X11 R6.
+</para>
+
+
+<para>
+Figure 1.1 shows the overall structure of the Xkb extension:
+</para>
+
+<mediaobject>
+ <imageobject>
+ <imagedata format="SVG" fileref="XKBlib-1.svg"/>
+ </imageobject>
+ <caption>Overall Xkb Structure</caption>
+</mediaobject>
+
+
+<para>
+The server portion of the Xkb extension encompasses a database of named
+keyboard components, in unspecified format, that may be used to configure a
+keyboard. Internally, the server maintains a <emphasis>
+keyboard description</emphasis>
+ that includes the keyboard state and configuration (mapping). By "keyboard" we
+mean the logical keyboard device, which includes not only the physical keys,
+but also potentially a set of up to 32 indicators (usually LEDs) and bells.
+</para>
+
+
+<para>
+The keyboard description is a composite of several different data structures,
+each of which may be manipulated separately. When manipulating the server
+components, the design allows partial components to be transmitted between the
+server and a client. The individual components are shown in Figure 1.1.
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>Client Map</term>
+ <listitem>
+ <para>
+The key mapping information needed to convert arbitrary keycodes to symbols.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Server Map</term>
+ <listitem>
+ <para>
+The key mapping information categorizing keys by functionality (which keys are
+modifiers, how keys behave, and so on).
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Controls</term>
+ <listitem>
+ <para>
+Client configurable quantities effecting how the keyboard behaves, such as
+repeat behavior and modifications for people with movement impairments.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Indicators</term>
+ <listitem>
+ <para>
+The mapping of behavior to indicators.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Geometry</term>
+ <listitem>
+ <para>
+A complete description of the physical keyboard layout, sufficient to draw a
+representation of the keyboard.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Names</term>
+ <listitem>
+ <para>
+A mapping of names to various aspects of the keyboard such as individual
+virtual modifiers, indicators, and bells.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Compatibility Map</term>
+ <listitem>
+ <para>
+The definition of how to map core protocol keyboard state to Xkb keyboard state.
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>
+A client application interrogates and manipulates the keyboard by reading and
+writing portions of the server description for the keyboard. In a typical
+sequence a client would fetch the current information it is interested in,
+modify it, and write it back. If a client wishes to track some portion of the
+keyboard state, it typically maintains a local copy of the portion of the
+server keyboard description dealing with the items of interest and updates this
+local copy from events describing state transitions that are sent by the server.
+</para>
+
+<para>
+A client may request the server to reconfigure the keyboard either by sending
+explicit reconfiguration instructions to it, or by telling it to load a new
+configuration from its database of named components. Partial reconfiguration
+and incremental reconfiguration are both supported.
+</para>
+
+<sect2 id='groups_and_shift_levels'>
+<title>Groups and Shift Levels</title>
+
+<para>
+The graphic characters or control functions that may be accessed by one key are
+logically arranged in groups and levels. See section 14.1for a complete
+description of groups and levels.
+</para>
+
+
+</sect2>
+<sect2 id='radio_groups'>
+<title>Radio Groups</title>
+
+<para>
+A radio group is a set of keys whose behavior simulates a set of radio buttons.
+Once a key in a radio group is pressed, it stays logically depressed until
+another key in the group is pressed, at which point the previously depressed
+key is logically released. Consequently, at most one key in a radio group can
+be logically depressed at one time. A radio group is defined by a radio group
+index, an optional name, and by assigning each key in the radio group <emphasis>
+XkbKB_RadioGroup</emphasis>
+ behavior and the radio group index.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1 id='client_types'>
+<title>Client Types</title>
+
+<para>
+This specification differentiates between three different classes of client
+applications:
+</para>
+
+<itemizedlist>
+ <listitem>
+ <para>
+Xkb-aware applications
+ </para>
+ <para>
+These applications make specific use of Xkb functionality and APIs not present
+in the core protocol.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Xkb-capable applications
+ </para>
+ <para>
+These applications make no use of Xkb extended functionality and Application
+Programming Interfaces (APIs) directly. However, they are linked with a version
+of Xlib that includes Xkb and indirectly benefit from some of Xkb’s
+features.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+Xkb-unaware applications
+ </para>
+ <para>
+These applications make no use of Xkb extended functionality or APIs and
+require Xkb’s functionality to be mapped to core Xlib functionality to
+operate properly.
+ </para>
+ </listitem>
+</itemizedlist>
+
+</sect1>
+
+<sect1 id='compatibility_with_the_core_protocol'>
+<title>Compatibility With the Core Protocol</title>
+
+<para>
+Because the Xkb extension allows a keyboard to be configured in ways not
+foreseen by the core protocol, and because Xkb-unaware clients are allowed to
+connect to a server using the Xkb extension, there must be a means of
+converting between the Xkb domain and the core protocol. The Xkb server
+extension maintains a compatibility map as part of its keyboard description;
+this map controls the conversion of Xkb generated events to core protocol
+events and the results of core protocol requests to appropriate Xkb state and
+configuration.
+</para>
+
+
+</sect1>
+<sect1 id='additional_protocol_errors'>
+<title>Additional Protocol Errors</title>
+
+<para>
+The Xkb extension adds a single protocol error, <emphasis>
+BadKeyboard</emphasis>
+, to the core protocol error set. See section 2.6 for a discussion of the <!-- xref -->
+<emphasis>
+BadKeyboard</emphasis>
+ protocol error.
+</para>
+
+
+</sect1>
+<sect1 id='extension_library_functions'>
+<title>Extension Library Functions</title>
+
+<para>
+The X Keyboard Extension replaces the core protocol definition of a keyboard
+with a more comprehensive one. The X Keyboard Extension library interfaces are
+included in Xlib.<footnote><para>
+X11R6.1 is the first release by the X Consortium, Inc.,that includes the X
+Keyboard Extension in Xlib. X11R6 included work in progress on this extension
+as nonstandard additions to the library.
+</para>
+</footnote>
+</para>
+
+<para>
+Xlib detects the presence of the X Keyboard server extension and uses Xkb
+protocol to replace some standard X library functions related to the keyboard.
+If an application uses only standard X library functions to examine the
+keyboard or process key events, it should not need to be modified when linked
+with an X library containing the X keyboard extension. All of the
+keyboard-related X library functions have been modified to automatically use
+Xkb protocol when the server extension is present.
+</para>
+
+<para>
+The Xkb extension adds library interfaces to allow a client application to
+directly manipulate the new capabilities.
+</para>
+
+
+<sect2 id='error_indications'>
+<title>Error Indications</title>
+
+<para>
+Xkb functions that communicate with the X server check to be sure the Xkb
+extension has been properly initialized prior to doing any other operations. If
+the extension has not been properly initialized or the application, library,
+and server versions are incompatible, these functions return an error
+indication as shown in Table 1.1. Because of this test, <emphasis>
+BadAccess</emphasis>
+ and <emphasis>
+BadMatch</emphasis>
+ (due to incompatible versions) protocol errors should normally not be
+generated.
+</para>
+
+<table frame='none'>
+<!-- <caption>Function Error Returns Due to Extension Problems</caption> -->
+<title>Function Error Returns Due to Extension Problems</title>
+<tgroup cols='2'>
+<colspec align="left" colsep="0"/>
+<colspec align="left" colsep="0"/>
+<thead>
+ <row>
+ <entry>Functions return type</entry>
+ <entry>Return value</entry>
+ </row>
+</thead>
+<tbody>
+ <row rowsep='0'>
+ <entry>pointer to a structure</entry>
+ <entry>NULL</entry>
+ </row>
+ <row rowsep='0'>
+ <entry>Bool</entry>
+ <entry>False</entry>
+ </row>
+ <row rowsep='0'>
+ <entry>Status</entry>
+ <entry>BadAccess</entry>
+ </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Many Xkb functions do not actually communicate with the X server; they only
+require processing in the client-side portion of the library. Furthermore, some
+applications may never actually need to communicate with the server; they
+simply use the Xkb library capabilities. The functions that do not communicate
+with the server return either a pointer to a structure, a Bool, or a Status.
+These functions check that the application has queried the Xkb library version
+and return the values shown in Table 1.1 if it has not.
+</para>
+</sect2>
+</sect1>
+</chapter>