b7f4f63879
but are in upstream git repository.
95 lines
3.1 KiB
XML
95 lines
3.1 KiB
XML
<chapter id='Replacing_the_Keyboard_On_the_Fly'>
|
||
<title>Replacing the Keyboard "On-the-Fly"</title>
|
||
|
||
<para>
|
||
XKB supports the <emphasis>
|
||
XkbNewKeyboardNotify</emphasis>
|
||
event, which reports a change in keyboard geometry or the range of supported
|
||
keycodes. The server can generate an <emphasis>
|
||
XkbNewKeyboardNotify</emphasis>
|
||
event when it detects a new keyboard, or in response to an <emphasis>
|
||
XkbGetKeyboardByName</emphasis>
|
||
request (see <link linkend='Using_the_Servers_Database_of_Keyboard_Components'>Using the Server’s
|
||
Database of Keyboard Components</link>) which loads a new keyboard description.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
When a client opens a connection to the X server, the server reports the
|
||
minimum and maximum keycodes. If the range of supported keycodes is changed,
|
||
XKB keeps track of the minimum and maximum keycodes that were reported to each
|
||
client and filters out any events that fall outside of that range. Note that
|
||
these events are simply ignored; they are not delivered to some other client.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
When the server sends an <emphasis>
|
||
XkbNewKeyboardNotify</emphasis>
|
||
event to a client to inform it of the new keycode range, XKB resets the stored
|
||
range of legal keycodes to the keycode range reported in the event. Non-XKB
|
||
clients and XKB-aware clients that do not request <emphasis>
|
||
XkbNewKeyboardNotify</emphasis>
|
||
events never receive events from keys that fall outside of the legal range
|
||
that XKB maintains for that client.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
When a client requests <emphasis>
|
||
XkbNewKeyboardNotify</emphasis>
|
||
events, the server compares the range of keycodes for the current keyboard to
|
||
the range of keycodes that are valid for the client. If they are not the same,
|
||
the server immediately sends that client an <emphasis>
|
||
XkbNewKeyboardNotify</emphasis>
|
||
event. Even if the "new" keyboard is not new to the server, it is new to this
|
||
particular client.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
In addition to filtering out-of-range key events, XKB:
|
||
</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>Adjusts core protocol <emphasis>
|
||
MappingNotify</emphasis>
|
||
events to refer only to keys that match the stored legal range.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Reports keyboard mappings for keys that match the stored legal range to
|
||
clients that issue a core protocol <emphasis>
|
||
GetKeyboardMapping</emphasis>
|
||
request.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Reports modifier mappings only for keys that match the stored legal
|
||
range to clients that issue a core protocol <emphasis>
|
||
GetModifierMapping</emphasis>
|
||
request.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>Restricts the core protocol <emphasis>
|
||
ChangeKeyboardMapping</emphasis>
|
||
and <emphasis>
|
||
SetModifierMapping</emphasis>
|
||
requests to keys that fall inside the stored legal range.
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>
|
||
In short, XKB does everything possible to hide the fact that the range of legal
|
||
keycodes has changed from clients non-XKB clients, which cannot be expected to
|
||
deal with it. The corresponding XKB events and requests do <emphasis>
|
||
not</emphasis>
|
||
pay attention to the legal keycode range in the same way because XKB makes it
|
||
possible for clients to track changes to the keycode range for a device and
|
||
respond to them.
|
||
</para>
|
||
</chapter>
|