857c658f08
shadchin@ on various architectures. Bump major.
2044 lines
54 KiB
XML
2044 lines
54 KiB
XML
<chapter id='attaching_xkb_actions_to_x_input_extension_devices'>
|
||
<title>Attaching Xkb Actions to X Input Extension Devices</title>
|
||
|
||
<para>
|
||
The X input extension allows an X server to support multiple keyboards, as well
|
||
as other input devices, in addition to the core X keyboard and pointer. The
|
||
input extension categorizes devices by grouping them into classes. Keyboards
|
||
and other input devices with keys are classified as KeyClass devices by the
|
||
input extension. Other types of devices supported by the input extension
|
||
include, but are not limited to: mice, tablets, touchscreens, barcode readers,
|
||
button boxes, trackballs, identifier devices, data gloves, and eye trackers.
|
||
Xkb provides additional control over all X input extension devices, whether
|
||
they are <emphasis>KeyClass</emphasis>
|
||
devices or not, as well as the core keyboard and pointer.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If an X server implements support for both the input extension and Xkb, the
|
||
server implementor determines whether interaction between Xkb and the input
|
||
extension is allowed. Implementors are free to restrict the effects of Xkb to
|
||
only the core X keyboard device or allow interaction between Xkb and the input
|
||
extension.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Several types of interaction between Xkb and the input extension are defined by
|
||
Xkb. Some or all may be allowed by the X server implementation.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Regardless of whether the server allows interaction between Xkb and the input
|
||
extension, the following access is provided:
|
||
</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
Xkb functionality for the core X keyboard device and its mapping is accessed
|
||
via the functions described in the other chapters of this specification.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
Xkb functionality for the core X pointer device is accessed via the
|
||
XkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter.
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>
|
||
If all types of interaction are allowed between Xkb and the input extension,
|
||
the following additional access is provided:
|
||
</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
If allowed, Xkb functionality for additional <emphasis>
|
||
KeyClass</emphasis>
|
||
devices supported by the input extension is accessed via those same functions.
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
If allowed, Xkb functionality for non-<emphasis>
|
||
KeyClass</emphasis>
|
||
devices supported by the input extension is also accessed via the
|
||
XkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter.
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>
|
||
Each device has an X Input Extension device ID. Each device may have several
|
||
classes of feedback. For example, there are two types of feedbacks that can
|
||
generate bells: bell feedback and keyboard feedback (<emphasis>
|
||
BellFeedbackClass</emphasis>
|
||
and <emphasis>
|
||
KbdFeedbackClass</emphasis>
|
||
). A device can have more than one feedback of each type; the feedback ID
|
||
identifies the particular feedback within its class.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
A keyboard feedback has:
|
||
</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
Auto-repeat status (global and per key)
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
32 LEDs
|
||
</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>
|
||
A bell
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>
|
||
An indicator feedback has:
|
||
</para>
|
||
|
||
<itemizedlist>
|
||
<listitem>
|
||
<para>
|
||
Up to 32 LEDs
|
||
</para>
|
||
</listitem>
|
||
</itemizedlist>
|
||
|
||
<para>
|
||
If the input extension is present and the server allows interaction between the
|
||
input extension and Xkb, then the core keyboard, the core keyboard indicators,
|
||
and the core keyboard bells may each be addressed using an appropriate device
|
||
spec, class, and ID. The constant <emphasis>
|
||
XkbXIDfltID</emphasis>
|
||
may be used as the device ID to specify the core keyboard indicators for the
|
||
core indicator feedback. The particular device ID corresponding to the core
|
||
keyboard feedback and the core indicator feedback may be obtained by calling
|
||
<emphasis>
|
||
XkbGetDeviceInfo</emphasis>
|
||
and specifying <emphasis>
|
||
XkbUseCoreKbd</emphasis>
|
||
as the <emphasis>
|
||
device_spec</emphasis>
|
||
; the values will be returned in <emphasis>
|
||
dflt_kbd_id</emphasis>
|
||
and <emphasis>
|
||
dflt_led_id</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the server does not allow Xkb access to input extension <emphasis>
|
||
KeyClass</emphasis>
|
||
devices, attempts to use Xkb requests with those devices fail with a
|
||
Bad<emphasis>
|
||
Keyboard</emphasis>
|
||
error. Attempts to access non-<emphasis>
|
||
KeyClass</emphasis>
|
||
input extension devices via XkbGetDeviceInfo and XkbSetDeviceInfo fail
|
||
silently if Xkb access to those devices is not supported by the X server.
|
||
</para>
|
||
|
||
<sect1 id='xkbdeviceinforec'>
|
||
<title>XkbDeviceInfoRec</title>
|
||
|
||
<para>
|
||
Information about X Input Extension devices is transferred between a client
|
||
program and the Xkb extension in an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure:
|
||
</para>
|
||
|
||
<para><programlisting>
|
||
typedef struct {
|
||
char * name; /* name for device */
|
||
Atom type; /* name for class of devices */
|
||
unsigned short device_spec; /* device of interest */
|
||
Bool has_own_state; /* <emphasis> True</emphasis> =>this
|
||
device has its own state */
|
||
unsigned short supported; /* bits indicating supported capabilities */
|
||
unsigned short unsupported; /* bits indicating unsupported capabilities */
|
||
unsigned short num_btns; /* number of entries in <emphasis> btn_acts</emphasis> */
|
||
XkbAction * btn_acts; /* button actions */
|
||
unsigned short sz_leds; /* total number of entries in LEDs vector */
|
||
unsigned short num_leds; /* number of valid entries in LEDs vector */
|
||
unsigned short dflt_kbd_fb; /* input extension ID of default (core kbd) indicator */
|
||
unsigned short dflt_led_fb; /* input extension ID of default indicator feedback */
|
||
XkbDeviceLedInfoPtr leds; /* LED descriptions */
|
||
} <emphasis>XkbDeviceInfoRec</emphasis>, *XkbDeviceInfoPtr;
|
||
</programlisting></para>
|
||
|
||
<para><programlisting>
|
||
typedef struct {
|
||
unsigned short led_class; /* class for this LED device*/
|
||
unsigned short led_id; /* ID for this LED device */
|
||
unsigned int phys_indicators; /* bits for which LEDs physically
|
||
present */
|
||
unsigned int maps_present; /* bits for which LEDs have maps in
|
||
<emphasis>maps</emphasis> */
|
||
unsigned int names_present; /* bits for which LEDs are in
|
||
<emphasis> names</emphasis> */
|
||
unsigned int state; /* 1 bit => corresponding LED is on */
|
||
Atom names[XkbNumIndicators]; /* names for LEDs */
|
||
XkbIndicatorMapRec maps; /* indicator maps for each LED */
|
||
} <emphasis>XkbDeviceLedInfoRec</emphasis>, *XkbDeviceLedInfoPtr;
|
||
</programlisting></para>
|
||
|
||
<para>
|
||
The <emphasis>
|
||
type</emphasis>
|
||
field is a registered symbolic name for a class of devices (for example,
|
||
"TABLET"). If a device is a keyboard (that is, is a member of <emphasis>
|
||
KeyClass</emphasis>
|
||
), it has its own state, and <emphasis>
|
||
has_own_state</emphasis>
|
||
is <emphasis>
|
||
True</emphasis>
|
||
. If <emphasis>
|
||
has_own_state</emphasis>
|
||
is <emphasis>
|
||
False</emphasis>
|
||
, the state of the core keyboard is used. The <emphasis>
|
||
supported</emphasis>
|
||
and <emphasis>
|
||
unsupported</emphasis>
|
||
fields are masks where each bit indicates a capability. The meaning of the
|
||
mask bits is listed in Table 21.1, together with the fields in the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure that are associated with the capability represented by each bit. The
|
||
same bits are used to indicate the specific information desired in many of the
|
||
functions described subsequently in this section.
|
||
</para>
|
||
|
||
<table frame='none'>
|
||
<title>XkbDeviceInfoRec Mask Bits</title>
|
||
<tgroup cols='4'>
|
||
<colspec colsep='0'/>
|
||
<colspec colsep='0'/>
|
||
<colspec colsep='0'/>
|
||
<colspec colsep='0'/>
|
||
<thead>
|
||
<row rowsep='0'>
|
||
<entry>Name</entry>
|
||
<entry>XkbDeviceInfoRec Fields Effected</entry>
|
||
<entry>Value</entry>
|
||
<entry>Capability If Set</entry>
|
||
</row>
|
||
</thead>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_KeyboardsMask</entry>
|
||
<entry></entry>
|
||
<entry>(1L << 0)</entry>
|
||
<entry>
|
||
Clients can use all Xkb requests and events with
|
||
<emphasis>KeyClass</emphasis>
|
||
devices supported by the input device extension.
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_ButtonActionsMask</entry>
|
||
<entry>
|
||
<para>num_btns</para>
|
||
<para>btn_acts</para>
|
||
</entry>
|
||
<entry>(1L <<1)</entry>
|
||
<entry>
|
||
Clients can assign key actions to buttons on non-<emphasis>
|
||
KeyClass</emphasis>
|
||
input extension devices.
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_IndicatorNamesMask</entry>
|
||
<entry>leds->names</entry>
|
||
<entry>(1L <<2)</entry>
|
||
<entry>
|
||
Clients can assign names to indicators on non-<emphasis>
|
||
KeyClass</emphasis>
|
||
input extension devices.
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_IndicatorMapsMask</entry>
|
||
<entry>leds->maps</entry>
|
||
<entry>(1L <<3)</entry>
|
||
<entry>
|
||
Clients can assign indicator maps to indicators on non-<emphasis>
|
||
KeyClass</emphasis>
|
||
input extension devices.
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_IndicatorStateMask</entry>
|
||
<entry>leds->state</entry>
|
||
<entry>(1L <<4)</entry>
|
||
<entry>
|
||
Clients can request the status of indicators on non-<emphasis>
|
||
KeyClass</emphasis>
|
||
input extension devices.
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_IndicatorsMask</entry>
|
||
<entry>
|
||
<para>sz_leds</para>
|
||
<para>num_leds</para>
|
||
<para>leds->*</para>
|
||
</entry>
|
||
<entry>(0x1c)</entry>
|
||
<entry>
|
||
<para>XkbXI_IndicatorNamesMask |</para>
|
||
<para>XkbXI_IndicatorMapsMask |</para>
|
||
<para>XkbXI_IndicatorStateMask</para>
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_UnsupportedFeaturesMask</entry>
|
||
<entry>unsupported</entry>
|
||
<entry>(1L <<15)</entry>
|
||
<entry></entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_AllDeviceFeaturesMask</entry>
|
||
<entry>Those selected by Value column masks</entry>
|
||
<entry>(0x1e)</entry>
|
||
<entry>
|
||
<para>XkbXI_IndicatorsMask | </para>
|
||
<para>XkbSI_ButtonActionsMask</para>
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_AllFeaturesMask</entry>
|
||
<entry>Those selected by Value column masks</entry>
|
||
<entry>(0x1f)</entry>
|
||
<entry>
|
||
<para>XkbSI_AllDeviceFeaturesMask |</para>
|
||
<para>XkbSI_KeyboardsMask</para>
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry>XkbXI_AllDetailsMask</entry>
|
||
<entry>Those selected by Value column masks</entry>
|
||
<entry>(0x801f)</entry>
|
||
<entry>
|
||
<para>XkbXI_AllFeaturesMask | </para>
|
||
<para>XkbXI_UnsupportedFeaturesMask</para>
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</table>
|
||
|
||
<para>
|
||
The <emphasis>
|
||
name</emphasis>
|
||
, <emphasis>
|
||
type</emphasis>
|
||
, <emphasis>
|
||
has_own_state</emphasis>
|
||
, <emphasis>
|
||
supported</emphasis>
|
||
, and <emphasis>
|
||
unsupported</emphasis>
|
||
fields are always filled in when a valid reply is returned from the server
|
||
involving an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
. All of the other fields are modified only if the particular function asks for
|
||
them.
|
||
</para>
|
||
|
||
</sect1>
|
||
<sect1 id='querying_xkb_features_for_non_keyclass_input_extension_devices'>
|
||
<title>Querying Xkb Features for Non-KeyClass Input Extension Devices</title>
|
||
|
||
<para>
|
||
To determine whether the X server allows Xkb access to particular capabilities
|
||
of input devices other than the core X keyboard, or to determine the status of
|
||
indicator maps, indicator names or button actions on a non-<emphasis>
|
||
KeyClass</emphasis>
|
||
extension device, use XkbGetDeviceInfo.
|
||
</para>
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
XkbDeviceInfoPtr <emphasis>
|
||
XkbGetDeviceInfo</emphasis>
|
||
(<emphasis>
|
||
dpy</emphasis>
|
||
, which, device_spec, ind_class, ind_id)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int which; /* mask indicating information to
|
||
return */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
device_spec</emphasis>
|
||
; /* device ID, or <emphasis>
|
||
XkbUseCoreKbd</emphasis>
|
||
*/
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
ind_class</emphasis>
|
||
; /* feedback class for indicator requests */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
ind_id</emphasis>
|
||
; /* feedback ID for indicator requests */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbGetDeviceInfo</emphasis>
|
||
returns information about the input device specified by <emphasis>
|
||
device_spec</emphasis>
|
||
. Unlike the <emphasis>
|
||
device_spec</emphasis>
|
||
parameter of most Xkb functions, <emphasis>
|
||
device_spec</emphasis>
|
||
does not need to be a keyboard device. It must, however, indicate either the
|
||
core keyboard or a valid X Input Extension device.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
The <emphasis>
|
||
which </emphasis>
|
||
parameter<emphasis>
|
||
</emphasis>
|
||
is a mask specifying optional information to be returned. It is an inclusive OR
|
||
of one or more of the values from Table 21.1 and causes the returned <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
to contain values for the corresponding fields specified in the table.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
The <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
returned by <emphasis>
|
||
XkbGetDeviceInfo</emphasis>
|
||
always has values for <emphasis>
|
||
name</emphasis>
|
||
(may be a null string, ""), <emphasis>
|
||
type</emphasis>
|
||
, <emphasis>
|
||
supported</emphasis>
|
||
, <emphasis>
|
||
unsupported</emphasis>
|
||
, <emphasis>
|
||
has_own_state</emphasis>
|
||
, <emphasis>
|
||
dflt_kbd_fd</emphasis>
|
||
, and <emphasis>
|
||
dflt_kbd_fb</emphasis>
|
||
. Other fields are filled in as specified by <emphasis>
|
||
which</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Upon return, the <emphasis>
|
||
supported</emphasis>
|
||
field will be set to the inclusive OR of zero or more bits from Table 21.1;
|
||
each bit set indicates an optional Xkb extension device feature supported by
|
||
the server implementation, and a client may modify the associated behavior.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the <emphasis>
|
||
XkbButtonActionsMask</emphasis>
|
||
bit is set in <emphasis>
|
||
which</emphasis>
|
||
, the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
returned will have the button actions (<emphasis>
|
||
btn_acts</emphasis>
|
||
field) filled in for all buttons.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If <emphasis>
|
||
which</emphasis>
|
||
includes one of the bits in XkbXI_IndicatorsMask, the feedback class of the
|
||
indicators must be specified in ind_class, and the feedback ID of the
|
||
indicators must be specified in ind_id. If the request does not include any of
|
||
the bits in XkbXI_IndicatorsMask, the ind_class and ind_id parameters are
|
||
ignored. The class and ID can be obtained via the input device extension
|
||
XListInputDevices request.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If any of the <emphasis>
|
||
XkbXI_IndicatorsMask</emphasis>
|
||
bits are set in <emphasis>
|
||
which</emphasis>
|
||
, the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
returned will have filled in the portions of the <emphasis>
|
||
leds</emphasis>
|
||
structure corresponding to the indicator feedback identified by <emphasis>
|
||
ind_class</emphasis>
|
||
and <emphasis>
|
||
ind_id</emphasis>
|
||
. The <emphasis>
|
||
leds</emphasis>
|
||
vector of the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
is allocated if necessary and <emphasis>
|
||
sz_leds</emphasis>
|
||
and <emphasis>
|
||
num_leds</emphasis>
|
||
filled in. The <emphasis>
|
||
led_class</emphasis>
|
||
, <emphasis>
|
||
led_id</emphasis>
|
||
and <emphasis>
|
||
phys_indicators</emphasis>
|
||
fields of the <emphasis>
|
||
leds</emphasis>
|
||
entry corresponding to <emphasis>
|
||
ind_class</emphasis>
|
||
and <emphasis>
|
||
ind_id</emphasis>
|
||
are always filled in. If <emphasis>
|
||
which</emphasis>
|
||
contains <emphasis>
|
||
XkbXI_IndicatorNamesMask</emphasis>
|
||
, the <emphasis>
|
||
names_present</emphasis>
|
||
and <emphasis>
|
||
names</emphasis>
|
||
fields of the <emphasis>
|
||
leds</emphasis>
|
||
structure corresponding to <emphasis>
|
||
ind_class</emphasis>
|
||
and <emphasis>
|
||
ind_id</emphasis>
|
||
are returned.<emphasis>
|
||
</emphasis>
|
||
If <emphasis>
|
||
which</emphasis>
|
||
contains <emphasis>
|
||
XkbXI_IndicatorStateMask</emphasis>
|
||
<emphasis>
|
||
,</emphasis>
|
||
the corresponding <emphasis>
|
||
state</emphasis>
|
||
field is updated. If <emphasis>
|
||
which</emphasis>
|
||
contains <emphasis>
|
||
XkbXI_IndicatorMapsMask</emphasis>
|
||
, the <emphasis>
|
||
maps_present</emphasis>
|
||
and <emphasis>
|
||
maps</emphasis>
|
||
fields are updated.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Xkb provides convenience functions to request subsets of the information
|
||
available via <emphasis>
|
||
XkbGetDeviceInfo</emphasis>
|
||
. These convenience functions mirror some of the mask bits. The functions all
|
||
take an <emphasis>
|
||
XkbDeviceInfoPtr</emphasis>
|
||
as an input argument and operate on the X Input Extension device specified by
|
||
the <emphasis>
|
||
device_spec</emphasis>
|
||
field of the structure. Only the parts of the structure indicated in the
|
||
function description are updated. The <emphasis>
|
||
XkbDeviceInfo</emphasis>
|
||
Rec structure used in the function call can be obtained by calling
|
||
XkbGetDeviceInfo or can be allocated by calling XkbAllocDeviceInfo (see section
|
||
21.3).
|
||
</para>
|
||
|
||
|
||
<para>
|
||
These convenience functions are described as follows.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To query the button actions associated with an X Input Extension device, use
|
||
XkbGetDeviceButtonActions.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Status <emphasis>
|
||
XkbGetDeviceButtonActions</emphasis>
|
||
(<emphasis>
|
||
dpy, device_info, all_buttons, first_button, num_buttons</emphasis>
|
||
)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure to update with
|
||
results */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Bool <emphasis>
|
||
all_buttons</emphasis>
|
||
; /* <emphasis>
|
||
True</emphasis>
|
||
=> get information for all buttons */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int first_button; /* number of first button for
|
||
which info is desired */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int num_buttons; /* number of buttons for which
|
||
info is desired */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbGetDeviceButtonActions</emphasis>
|
||
queries the server for the desired button information for the device indicated
|
||
by the <emphasis>
|
||
device_spec</emphasis>
|
||
field of <emphasis>
|
||
device_info</emphasis>
|
||
and waits for a reply. If successful,<emphasis>
|
||
XkbGetDeviceButtonActions</emphasis>
|
||
backfills the button actions (<emphasis>
|
||
btn_acts</emphasis>
|
||
field of <emphasis>
|
||
device_info</emphasis>
|
||
) for only the requested buttons, updates the <emphasis>
|
||
name</emphasis>
|
||
, <emphasis>
|
||
type</emphasis>
|
||
, <emphasis>
|
||
supported</emphasis>
|
||
, and <emphasis>
|
||
unsupported</emphasis>
|
||
fields, and returns <emphasis>
|
||
Success</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
<emphasis>
|
||
all_buttons</emphasis>
|
||
, <emphasis>
|
||
first_button</emphasis>
|
||
and <emphasis>
|
||
num_buttons</emphasis>
|
||
specify the device buttons for which actions should be returned. Setting
|
||
<emphasis>
|
||
all_buttons</emphasis>
|
||
to <emphasis>
|
||
True</emphasis>
|
||
requests actions for all device buttons; if <emphasis>
|
||
all_buttons</emphasis>
|
||
is <emphasis>
|
||
False</emphasis>
|
||
, <emphasis>
|
||
first_button</emphasis>
|
||
and <emphasis>
|
||
num_buttons</emphasis>
|
||
specify a range of buttons for which actions are requested.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If a compatible version of Xkb is not available in the server or the Xkb
|
||
extension has not been properly initialized, XkbGetDeviceButtonActions returns
|
||
<emphasis>
|
||
BadAccess</emphasis>
|
||
. If allocation errors occur, a <emphasis>
|
||
BadAlloc</emphasis>
|
||
status is returned. If the specified device (<emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
device_spec</emphasis>
|
||
) is invalid, a BadKeyboard status is returned. If the device has no buttons, a
|
||
Bad<emphasis>
|
||
Match</emphasis>
|
||
status is returned. If <emphasis>
|
||
first_button</emphasis>
|
||
and <emphasis>
|
||
num_buttons</emphasis>
|
||
specify illegal buttons, a Bad<emphasis>
|
||
Value</emphasis>
|
||
status is returned.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To query the indicator names, maps, and state associated with an LED feedback
|
||
of an input extension device, use XkbGetDeviceLedInfo.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Status <emphasis>
|
||
XkbGetDeviceLedInfo</emphasis>
|
||
(<emphasis>
|
||
dpy, device_i</emphasis>
|
||
nfo, led_class, led_id, which)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure to update with
|
||
results */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
led_class</emphasis>
|
||
; /* LED feedback class assigned by input extension */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int led_id; /* LED feedback ID assigned by input
|
||
extension */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int which; /* mask indicating desired
|
||
information */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbGetDeviceLedInfo</emphasis>
|
||
queries the server for the desired LED information for the feedback specified
|
||
by <emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
for the X input extension device indicated by <emphasis>
|
||
device_spec</emphasis>
|
||
-><emphasis>
|
||
device_info</emphasis>
|
||
and waits for a reply. If successful, <emphasis>
|
||
XkbGetDeviceLedInfo</emphasis>
|
||
backfills the relevant fields of <emphasis>
|
||
device_info</emphasis>
|
||
as determined by <emphasis>
|
||
which</emphasis>
|
||
with the results and returns <emphasis>
|
||
Success</emphasis>
|
||
. Valid values for <emphasis>
|
||
which</emphasis>
|
||
are the inclusive OR of any of <emphasis>
|
||
XkbXI_IndicatorNamesMask</emphasis>
|
||
, <emphasis>
|
||
XkbXI_IndicatorMapsMask</emphasis>
|
||
, and <emphasis>
|
||
XkbXI_IndicatorStateMask</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
The fields of <emphasis>
|
||
device_info</emphasis>
|
||
that are filled in when this request succeeds are <emphasis>
|
||
name, type, supported</emphasis>
|
||
, and <emphasis>
|
||
unsupported</emphasis>
|
||
, and portions of the <emphasis>
|
||
leds</emphasis>
|
||
structure corresponding to <emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
as indicated by the bits set in <emphasis>
|
||
which</emphasis>
|
||
. The <emphasis>
|
||
device_info->leds</emphasis>
|
||
vector is allocated if necessary and <emphasis>
|
||
sz_leds</emphasis>
|
||
and <emphasis>
|
||
num_leds</emphasis>
|
||
filled in. The <emphasis>
|
||
led_class</emphasis>
|
||
, <emphasis>
|
||
led_id</emphasis>
|
||
and <emphasis>
|
||
phys_indicators</emphasis>
|
||
fields of the <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
entry corresponding to <emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
are always filled in.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If <emphasis>
|
||
which</emphasis>
|
||
contains <emphasis>
|
||
XkbXI_IndicatorNamesMask</emphasis>
|
||
, the <emphasis>
|
||
names_present</emphasis>
|
||
and <emphasis>
|
||
names</emphasis>
|
||
fields of the <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
structure corresponding to <emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
are updated, if <emphasis>
|
||
which</emphasis>
|
||
contains <emphasis>
|
||
XkbXI_IndicatorStateMask</emphasis>
|
||
<emphasis>
|
||
,</emphasis>
|
||
the corresponding <emphasis>
|
||
state</emphasis>
|
||
field is updated, and if <emphasis>
|
||
which</emphasis>
|
||
contains <emphasis>
|
||
XkbXI_IndicatorMapsMask</emphasis>
|
||
, the <emphasis>
|
||
maps_present</emphasis>
|
||
and <emphasis>
|
||
maps</emphasis>
|
||
fields are updated.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If a compatible version of Xkb is not available in the server or the Xkb
|
||
extension has not been properly initialized, <emphasis>
|
||
XkbGetDeviceLedInfo</emphasis>
|
||
returns <emphasis>
|
||
BadAccess</emphasis>
|
||
. If allocation errors occur, a BadAlloc status is returned. If the device has
|
||
no indicators, a BadMatch error is returned. If <emphasis>
|
||
ledClass</emphasis>
|
||
or <emphasis>
|
||
ledID</emphasis>
|
||
have illegal values, a Bad<emphasis>
|
||
Value</emphasis>
|
||
error is returned. If they have legal values but do not specify a feedback
|
||
that contains LEDs and is associated with the specified device, a Bad<emphasis>
|
||
Match</emphasis>
|
||
error is returned.
|
||
</para>
|
||
|
||
|
||
</sect1>
|
||
<sect1
|
||
id='allocating_initializing_and_freeing_the_xkbdeviceinforec_structure'>
|
||
<title>Allocating, Initializing, and Freeing the XkbDeviceInfoRec
|
||
Structure</title>
|
||
|
||
<para>
|
||
To obtain an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure, use XkbGetDeviceInfo or XkbAllocDeviceInfo.
|
||
</para>
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
XkbDeviceInfoPtr <emphasis>
|
||
XkbAllocDeviceInfo</emphasis>
|
||
(device_spec, n_buttons, sz_leds)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int device_spec; /* device ID with which
|
||
structure will be used */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
n_buttons</emphasis>
|
||
; /* number of button actions to allocate space for*/
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
sz_leds</emphasis>
|
||
; /* number of LED feedbacks to allocate space for */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbAllocDeviceInfo</emphasis>
|
||
allocates space for an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure and initializes that structure’s <emphasis>
|
||
device_spec</emphasis>
|
||
field with the device ID specified by device_spec. If <emphasis>
|
||
n_buttons</emphasis>
|
||
is nonzero, <emphasis>
|
||
n_buttons</emphasis>
|
||
<emphasis>
|
||
XkbActions</emphasis>
|
||
are linked into the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure and initialized to zero. If sz_leds is nonzero, <emphasis>
|
||
sz_leds</emphasis>
|
||
<emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structures are also allocated and linked into the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure. If you request <emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structures be allocated using this request, you must initialize them
|
||
explicitly.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To obtain an <emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structure, use XkbAllocDeviceLedInfo.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Status <emphasis>
|
||
XkbAllocDeviceLedInfo</emphasis>
|
||
(devi, num_needed)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr <emphasis>
|
||
device_info</emphasis>
|
||
; /* structure in which to allocate LED space */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
int <emphasis>
|
||
num_needed</emphasis>
|
||
; /* number of indicators to allocate space for */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbAllocDeviceLedInfo</emphasis>
|
||
allocates space for an <emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
and places it in <emphasis>
|
||
device_info</emphasis>
|
||
. If num_needed is nonzero, <emphasis>
|
||
num_needed</emphasis>
|
||
<emphasis>
|
||
XkbIndicatorMapRec</emphasis>
|
||
structures are also allocated and linked into the <emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structure. If you request <emphasis>
|
||
XkbIndicatorMapRec</emphasis>
|
||
structures be allocated using this request, you must initialize them
|
||
explicitly. All other fields are initialized to zero.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To initialize an <emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structure, use XkbAddDeviceLedInfo.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
XkbDeviceLedInfoPtr <emphasis>
|
||
XkbAddDeviceLedInfo</emphasis>
|
||
(device_info, led_class, led_id)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure in which to
|
||
add LED info */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
led_class</emphasis>
|
||
; /* input extension class for LED device of interest */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
led_id</emphasis>
|
||
; /* input extension ID for LED device of interest */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbAddDeviceLedInfo</emphasis>
|
||
first checks to see whether an entry matching <emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
already exists in the <emphasis>
|
||
device_info->leds</emphasis>
|
||
array. If it finds a matching entry, it returns a pointer to that entry.
|
||
Otherwise, it checks to be sure there is at least one empty entry in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
and extends it if there is not enough room. It then increments <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
num_leds</emphasis>
|
||
and fills in the next available entry in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
with <emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If successful, <emphasis>
|
||
XkbAddDeviceLedInfo</emphasis>
|
||
returns a pointer to the <emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structure that was initialized. If unable to allocate sufficient storage, or
|
||
if <emphasis>
|
||
device_info</emphasis>
|
||
points to an invalid <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure, or if <emphasis>
|
||
led_class</emphasis>
|
||
or <emphasis>
|
||
led_id</emphasis>
|
||
are inappropriate, <emphasis>
|
||
XkbAddDeviceLedInfo</emphasis>
|
||
returns <emphasis>
|
||
NULL</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To allocate additional space for button actions in an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure, use XkbResizeDeviceButtonActions.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Status <emphasis>
|
||
XkbResizeDeviceButtonActions</emphasis>
|
||
(device_info, new_total)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure in which to
|
||
allocate button actions */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
new_total</emphasis>
|
||
; /* new total number of button actions needed */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbResizeDeviceButton</emphasis>
|
||
reallocates space, if necessary, to make sure there is room for a total of
|
||
<emphasis>
|
||
new_total</emphasis>
|
||
button actions in the <emphasis>
|
||
device_info</emphasis>
|
||
structure. Any new entries allocated are zeroed. If successful, <emphasis>
|
||
XkbResizeDeviceButton</emphasis>
|
||
returns Success. If new_total is zero, all button actions are deleted,
|
||
<emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
num_btns</emphasis>
|
||
is set to zero, and <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
btn_acts</emphasis>
|
||
is set to <emphasis>
|
||
NULL</emphasis>
|
||
. If device_info is invalid or new_total is greater than 255, BadValue is
|
||
returned. If a memory allocation failure occurs, a <emphasis>
|
||
BadAlloc</emphasis>
|
||
is returned.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To free an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure, use XkbFreeDeviceInfo.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
void <emphasis>
|
||
XkbFreeDeviceInfo</emphasis>
|
||
(device_info, which, free_all)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* pointer to <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
in which to free items */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
which</emphasis>
|
||
; /* mask of components of <emphasis>
|
||
device_info</emphasis>
|
||
to free */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Bool <emphasis>
|
||
free_all</emphasis>
|
||
; /* <emphasis>
|
||
True</emphasis>
|
||
=> free everything, including device_info */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
If free_all is <emphasis>
|
||
True</emphasis>
|
||
, the <emphasis>
|
||
XkbFreeDeviceInfo</emphasis>
|
||
frees all components of <emphasis>
|
||
device_info</emphasis>
|
||
and the <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure pointed to by <emphasis>
|
||
device_info</emphasis>
|
||
itself. If free_all is <emphasis>
|
||
False</emphasis>
|
||
, the value of which determines which subcomponents are freed. <emphasis>
|
||
which </emphasis>
|
||
is an inclusive OR of one or more of the values from Table 21.1. If which
|
||
contains XkbXI_ButtonActionsMask, all button actions associated with <emphasis>
|
||
device_info</emphasis>
|
||
are freed, <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
btn_acts</emphasis>
|
||
is set to <emphasis>
|
||
NULL</emphasis>
|
||
, and <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
num_btns</emphasis>
|
||
is set to zero. If which contains all bits in XkbXI_IndicatorsMask, all
|
||
<emphasis>
|
||
XkbDeviceLedInfoRec</emphasis>
|
||
structures associated with <emphasis>
|
||
device_info</emphasis>
|
||
are freed, <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
is set to <emphasis>
|
||
NULL</emphasis>
|
||
, and <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
sz_leds</emphasis>
|
||
and <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
num_leds</emphasis>
|
||
are set to zero. If which contains XkbXI_IndicatorMapsMask, all indicator maps
|
||
associated with <emphasis>
|
||
device_info</emphasis>
|
||
are cleared, but the number of LEDs and the leds structures themselves are
|
||
preserved. If which contains XkbXI_IndicatorNamesMask, all indicator names
|
||
associated with device_info are cleared, but the number of LEDs and the leds
|
||
structures themselves are preserved. If which contains
|
||
XkbXI_IndicatorStateMask, the indicator state associated with the <emphasis>
|
||
device_info</emphasis>
|
||
leds are set to zeros but the number of LEDs and the leds structures
|
||
themselves are preserved.
|
||
</para>
|
||
|
||
|
||
</sect1>
|
||
<sect1 id='setting_xkb_features_for_non_keyclass_input_extension_devices_'>
|
||
<title>Setting Xkb Features for Non-KeyClass Input Extension Devices </title>
|
||
|
||
<para>
|
||
The Xkb extension allows clients to assign any key action to either core
|
||
pointer or input extension device buttons. This makes it possible to control
|
||
the keyboard or generate keyboard key events from extension devices or from the
|
||
core pointer.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Key actions assigned to core X pointer buttons or input extension device
|
||
buttons cause key events to be generated as if they had originated from the
|
||
core X keyboard.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Xkb implementations are required to support key actions for the buttons of the
|
||
core pointer device, but support for actions on extension devices is optional.
|
||
Implementations that do not support button actions for extension devices must
|
||
not set the <emphasis>
|
||
XkbXI_ButtonActionsMask</emphasis>
|
||
bit in the <emphasis>
|
||
supported</emphasis>
|
||
field of an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If a client attempts to modify valid characteristics of a device using an
|
||
implementation that does not support modification of those characteristics, no
|
||
protocol error is generated. Instead, the server reports a failure for the
|
||
request; it also sends an <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
event to the client that issued the request if the client has selected to
|
||
receive these events.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To change characteristics of an X Input Extension device in the server, first
|
||
modify a local copy of the device structure and then use either <emphasis>
|
||
XkbSetDeviceInfo,</emphasis>
|
||
or, to save network traffic, use an <emphasis>
|
||
XkbDeviceChangesRec</emphasis>
|
||
structure (see section 21.6) and call <emphasis>
|
||
XkbChangeDeviceInfo</emphasis>
|
||
to download the changes to the server.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To modify some or all of the characteristics of an X Input Extension device,
|
||
use XkbSetDeviceInfo.
|
||
</para>
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Bool <emphasis>
|
||
XkbSetDeviceInfo</emphasis>
|
||
(<emphasis>
|
||
dpy</emphasis>
|
||
, which, device_info)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
which</emphasis>
|
||
; /* mask indicating characteristics to modify */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure defining the
|
||
device and modifications */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbSetDeviceInfo</emphasis>
|
||
sends a request to the server to modify the characteristics of the device
|
||
specified in the <emphasis>
|
||
device_info</emphasis>
|
||
structure. The particular characteristics modified are identified by the bits
|
||
set in <emphasis>
|
||
which</emphasis>
|
||
and take their values from the relevant fields in <emphasis>
|
||
device_info</emphasis>
|
||
(see Table 21.1). <emphasis>
|
||
XkbSetDeviceInfo</emphasis>
|
||
returns <emphasis>
|
||
True</emphasis>
|
||
if the request was successfully sent to the server. If the X server
|
||
implementation does not allow interaction between the X input extension and the
|
||
Xkb Extension, the function does nothing and returns <emphasis>
|
||
False</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
The <emphasis>
|
||
which</emphasis>
|
||
parameter specifies which aspects of the device should be changed and is a
|
||
bitmask composed of an inclusive OR or one or more of the following bits:
|
||
<emphasis>
|
||
XkbXI_ButtonActionsMask</emphasis>
|
||
, <emphasis>
|
||
XkbXI_IndicatorNamesMask</emphasis>
|
||
, <emphasis>
|
||
XkbXI_IndicatorMapsMask</emphasis>
|
||
. If the features requested to be manipulated in <emphasis>
|
||
which</emphasis>
|
||
are valid for the device, but the server does not support assignment of one or
|
||
more of them, that particular portion of the request is ignored.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the device specified in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
device_spec</emphasis>
|
||
does not contain buttons and a request affecting buttons is made, or the
|
||
device does not contain indicators and a request affecting indicators is made,
|
||
a <emphasis>
|
||
BadMatch</emphasis>
|
||
protocol error results.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the <emphasis>
|
||
XkbXI_ButtonActionsMask</emphasis>
|
||
bit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb
|
||
extension allows applications to assign key actions to buttons on input
|
||
extension devices other than the core keyboard device. If the <emphasis>
|
||
XkbXI_ButtonActionsMask</emphasis>
|
||
is set in <emphasis>
|
||
which</emphasis>
|
||
, the actions for all buttons specified in device_info are set to the <emphasis>
|
||
XkbAction</emphasis>
|
||
s specified in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
btn_acts</emphasis>
|
||
. If the number of buttons requested to be updated is not valid for the device,
|
||
<emphasis>
|
||
XkbSetDeviceInfo</emphasis>
|
||
returns <emphasis>
|
||
False</emphasis>
|
||
and a <emphasis>
|
||
BadValue</emphasis>
|
||
protocol error results.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the <emphasis>
|
||
XkbXI_IndicatorMaps</emphasis>
|
||
and / or <emphasis>
|
||
XkbXI_IndicatorNamesMask</emphasis>
|
||
bit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb
|
||
extension allows applications to assign maps and / or names to the indicators
|
||
of nonkeyboard extension devices. If supported, maps and / or names can be
|
||
assigned to all extension device indicators, whether they are part of a
|
||
keyboard feedback or part of an indicator feedback.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the <emphasis>
|
||
XkbXI_IndicatorMapsMask</emphasis>
|
||
and / or <emphasis>
|
||
XkbXI_IndicatorNamesMask</emphasis>
|
||
flag is set in <emphasis>
|
||
which</emphasis>
|
||
, the indicator maps and / or names for all <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
num_leds</emphasis>
|
||
indicator devices specified in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
are set to the maps and / or names specified in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
. <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
-><emphasis>
|
||
led_class</emphasis>
|
||
and <emphasis>
|
||
led_id</emphasis>
|
||
specify the input extension class and device ID for each indicator device to
|
||
modify; if they have invalid values, a <emphasis>
|
||
BadValue</emphasis>
|
||
protocol error results and <emphasis>
|
||
XkbSetDeviceInfo</emphasis>
|
||
returns <emphasis>
|
||
False</emphasis>
|
||
. If they have legal values but do not specify a keyboard or indicator class
|
||
feedback for the device in question, a <emphasis>
|
||
BadMatch</emphasis>
|
||
error results. If any of the values in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
leds</emphasis>
|
||
<emphasis>
|
||
-></emphasis>
|
||
<emphasis>
|
||
names</emphasis>
|
||
are not a valid Atom or <emphasis>
|
||
None</emphasis>
|
||
, a <emphasis>
|
||
BadAtom</emphasis>
|
||
protocol error results.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
Xkb provides convenience functions to modify subsets of the information
|
||
accessible via <emphasis>
|
||
XkbSetDeviceInfo</emphasis>
|
||
. Only the parts of the structure indicated in the function description are
|
||
modified. These convenience functions are described as follows.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To change only the button actions for an input extension device, use
|
||
XkbSetDeviceButtonActions.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Bool <emphasis>
|
||
XkbSetDeviceButtonActions</emphasis>
|
||
(<emphasis>
|
||
dpy</emphasis>
|
||
, device, first_button, num_buttons, actions)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure defining the
|
||
device and modifications */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int first_button; /* number of first button to
|
||
update, 0 relative */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int num_buttons; /* number of buttons to update
|
||
*/
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbSetDeviceButtonActions</emphasis>
|
||
assigns actions to the buttons of the device specified in
|
||
device_info-><emphasis>
|
||
device_spec</emphasis>
|
||
. Actions are assigned to <emphasis>
|
||
num_buttons</emphasis>
|
||
buttons beginning with <emphasis>
|
||
first_button</emphasis>
|
||
and are taken from the actions specified in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
btn_acts</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the server does not support assignment of Xkb actions to extension device
|
||
buttons, <emphasis>
|
||
XkbSetDeviceButtonActions</emphasis>
|
||
has no effect and returns <emphasis>
|
||
False</emphasis>
|
||
. If the device has no buttons or if <emphasis>
|
||
first_button</emphasis>
|
||
or <emphasis>
|
||
num_buttons</emphasis>
|
||
specify buttons outside of the valid range as determined by <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
num_btns</emphasis>
|
||
, the function has no effect and returns <emphasis>
|
||
False</emphasis>
|
||
. Otherwise, <emphasis>
|
||
XkbSetDeviceButtonActions</emphasis>
|
||
sends a request to the server to change the actions for the specified buttons
|
||
and returns <emphasis>
|
||
True</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
If the actual request sent to the server involved illegal button numbers, a
|
||
<emphasis>
|
||
BadValue</emphasis>
|
||
protocol error is generated. If an invalid device identifier is specified in
|
||
device_info-><emphasis>
|
||
device_spec</emphasis>
|
||
, a BadKeyboard protocol error results. If the actual device specified in
|
||
<emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
device_spec</emphasis>
|
||
does not contain buttons and a request affecting buttons is made, a <emphasis>
|
||
BadMatch</emphasis>
|
||
protocol error is generated.
|
||
</para>
|
||
|
||
|
||
</sect1>
|
||
<sect1 id='xkbextensiondevicenotify_event'>
|
||
<title>XkbExtensionDeviceNotify Event</title>
|
||
|
||
<para>
|
||
The Xkb extension generates <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
events when the status of an input extension device changes or when an attempt
|
||
is made to use an Xkb feature that is not supported by a particular device.
|
||
</para>
|
||
|
||
<note><para>Events indicating an attempt to use an unsupported feature are
|
||
delivered only to the client requesting the event.</para></note>
|
||
|
||
<para>
|
||
To track changes to the status of input extension devices or attempts to use
|
||
unsupported features of a device, select to receive <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
events by calling either <emphasis>
|
||
XkbSelectEvents</emphasis>
|
||
or <emphasis>
|
||
XkbSelectEventDetails</emphasis>
|
||
(see section 4.3).
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To receive <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
events under all possible conditions, call <emphasis>
|
||
XkbSelectEvents</emphasis>
|
||
and pass <emphasis>
|
||
XkbExtensionDeviceNotifyMask</emphasis>
|
||
in both <emphasis>
|
||
bits_to_change</emphasis>
|
||
and <emphasis>
|
||
values_for_bits</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
The <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
event has no event details. However, you can call <emphasis>
|
||
XkbSelectEventDetails</emphasis>
|
||
using <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
as the <emphasis>
|
||
event_type</emphasis>
|
||
and specifying <emphasis>
|
||
XkbAllExtensionDeviceMask</emphasis>
|
||
in <emphasis>
|
||
bits_to_change</emphasis>
|
||
and <emphasis>
|
||
values_for_bits.</emphasis>
|
||
This has the same effect as a call to <emphasis>
|
||
XkbSelectEvents</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
The structure for <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
events is:
|
||
</para>
|
||
|
||
<para><programlisting>
|
||
typedef struct {
|
||
int type; /* Xkb extension base event code */
|
||
unsigned long serial; /* X server serial number for event */
|
||
Bool send_event; /* <emphasis>True</emphasis>
|
||
=> synthetically generated*/
|
||
Display * display; /* server connection where event generated */
|
||
Time time; /* server time when event generated */
|
||
int xkb_type; /* <emphasis>XkbExtensionDeviceNotifyEvent</emphasis> */
|
||
int device; /* Xkb device ID, will not be
|
||
<emphasis>XkbUseCoreKbd</emphasis> */
|
||
unsigned int reason; /* reason for the event */
|
||
unsigned int supported; /* mask of supported features */
|
||
unsigned int unsupported; /* unsupported features this client
|
||
attempted to use */
|
||
int first_btn; /* first button that changed */
|
||
int num_btns; /* number of buttons that changed */
|
||
unsigned int leds_defined; /* indicators with names or maps */
|
||
unsigned int led_state; /* current state of the indicators */
|
||
int led_class; /* feedback class for LED changes */
|
||
int led_id; /* feedback ID for LED changes */
|
||
} <emphasis>XkbExtensionDeviceNotifyEvent</emphasis>;
|
||
</programlisting></para>
|
||
|
||
<para>
|
||
The <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
event has fields enabling it to report changes in the state (on/off) of all of
|
||
the buttons for a device, but only for one LED feedback associated with a
|
||
device. You will get multiple events when more than one LED feedback changes
|
||
state or configuration.
|
||
</para>
|
||
|
||
|
||
</sect1>
|
||
<sect1 id='tracking_changes_to_extension_devices'>
|
||
<title>Tracking Changes to Extension Devices</title>
|
||
|
||
<para>
|
||
Changes to an Xkb extension device may be tracked by listening to <emphasis>
|
||
XkbDeviceExtensionNotify</emphasis>
|
||
events and accumulating the changes in an <emphasis>
|
||
XkbDeviceChangesRec</emphasis>
|
||
structure. The changes noted in the structure may then be used in subsequent
|
||
operations to update either a server configuration or a local copy of an Xkb
|
||
extension device configuration. The changes structure is defined as follows:
|
||
</para>
|
||
|
||
<para><programlisting>
|
||
typedef struct _XkbDeviceChanges {
|
||
unsigned int changed; /* bits indicating what has changed */
|
||
unsigned short first_btn; /* number of first button which changed,
|
||
if any */
|
||
unsigned short num_btns; /* number of buttons that have changed */
|
||
XkbDeviceLedChangesRec leds;
|
||
} <emphasis>XkbDeviceChangesRec</emphasis>,*XkbDeviceChangesPtr;
|
||
</programlisting></para>
|
||
|
||
<para><programlisting>
|
||
typedef struct _XkbDeviceLedChanges {
|
||
unsigned short led_class; /* class of this indicator feedback bundle */
|
||
unsigned short led_id; /* ID of this indicator feedback bundle */
|
||
unsigned int names; /* bits indicating which names have changed */
|
||
unsigned int maps; /* bits indicating which maps have changed */
|
||
struct _XkbDeviceLedChanges *next; /* link to indicator change record
|
||
for next set */
|
||
} <emphasis>XkbDeviceLedChangesRec</emphasis>,*XkbDeviceLedChangesPtr;
|
||
</programlisting></para>
|
||
|
||
<para>
|
||
A local description of the configuration and state of a device may be kept in
|
||
an <emphasis>
|
||
XkbDeviceInfoRec</emphasis>
|
||
structure. The actual state or configuration of the device may change because
|
||
of XkbSetDeviceInfo and XkbSetButtonActions requests made by clients or by user
|
||
interaction with the device. The X server sends an XkbExtensionDeviceNotify
|
||
event to all interested clients when the state of any buttons or indicators or
|
||
the configuration of the buttons or indicators on the core keyboard or any
|
||
input extension device changes. The event reports the state of indicators for a
|
||
single indicator feedback, and the state of up to 128 buttons. If more than 128
|
||
buttons or more than one indicator feedback are changed, the additional buttons
|
||
and indicator feedbacks are reported in subsequent events. Xkb provides
|
||
functions with which you can track changes to input extension devices by noting
|
||
the changes that were made and then requesting the changed information from the
|
||
server.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To note device changes reported in an <emphasis>
|
||
XkbExtensionDeviceNotify</emphasis>
|
||
event, use XkbNoteDeviceChanges.
|
||
</para>
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
void <emphasis>
|
||
XkbNoteDeviceChanges</emphasis>
|
||
(<emphasis>
|
||
old, new, wanted</emphasis>
|
||
)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceChangesPtr <emphasis>
|
||
old</emphasis>
|
||
; /* structure tracking state changes */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbExtensionDeviceNotifyEvent * <emphasis>
|
||
new</emphasis>
|
||
; /* event indicating state changes */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
unsigned int <emphasis>
|
||
wanted</emphasis>
|
||
; /* mask indicating changes to note */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
The wanted field specifies the changes that should be noted in <emphasis>
|
||
old</emphasis>
|
||
, and is composed of the bitwise inclusive OR of one or more of the masks from
|
||
Table 21.1<emphasis>
|
||
.</emphasis>
|
||
The <emphasis>
|
||
reason</emphasis>
|
||
field of the event in <emphasis>
|
||
new</emphasis>
|
||
indicates the types of changes the event is reporting. <emphasis>
|
||
XkbNoteDeviceChanges</emphasis>
|
||
updates the <emphasis>
|
||
XkbDeviceChangesRec</emphasis>
|
||
specified by <emphasis>
|
||
old</emphasis>
|
||
with the changes that are both specified in <emphasis>
|
||
wanted</emphasis>
|
||
and contained in <emphasis>
|
||
new</emphasis>
|
||
-><emphasis>
|
||
reason</emphasis>
|
||
.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To update a local copy of the state and configuration of an X input extension
|
||
device with the changes previously noted in an <emphasis>
|
||
XkbDeviceChangesRec</emphasis>
|
||
structure, use XkbGetDeviceInfoChanges.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To query the changes that have occurred in the button actions or indicator
|
||
names and indicator maps associated with an input extension device, use
|
||
XkbGetDeviceInfoChanges.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Status <emphasis>
|
||
XkbGetDeviceInfoChanges</emphasis>
|
||
(<emphasis>
|
||
dpy</emphasis>
|
||
, <emphasis>
|
||
device_info</emphasis>
|
||
, changes)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr device_info; /* structure to update with
|
||
results */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceChangesPtr <emphasis>
|
||
changes</emphasis>
|
||
; /* contains notes of changes that have occurred */
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
The changes->changed field indicates which attributes of the device
|
||
specified in <emphasis>
|
||
changes</emphasis>
|
||
-><emphasis>
|
||
device</emphasis>
|
||
have changed. The parameters describing the changes are contained in the other
|
||
fields of <emphasis>
|
||
changes</emphasis>
|
||
. <emphasis>
|
||
XkbGetDeviceInfoChanges</emphasis>
|
||
uses that information to call XkbGetDeviceInfo to obtain the current status of
|
||
those attributes that have changed. It then updates the local description of
|
||
the device in <emphasis>
|
||
device_info</emphasis>
|
||
with the new information.
|
||
</para>
|
||
|
||
|
||
<para>
|
||
To update the server’s description of a device with the changes noted in an
|
||
XkbDeviceChangesRec, use XkbChangeDeviceInfo.
|
||
</para>
|
||
|
||
|
||
<informaltable frame='none'>
|
||
<tgroup cols='1'>
|
||
<colspec colsep='0'/>
|
||
<tbody>
|
||
<row rowsep='0'>
|
||
<entry role='functiondecl'>
|
||
Bool <emphasis>
|
||
XkbChangeDeviceInfo</emphasis>
|
||
(<emphasis>
|
||
dpy, device_info, changes</emphasis>
|
||
)
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
Display * <emphasis>
|
||
dpy</emphasis>
|
||
; /* connection to X server */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceInfoPtr <emphasis>
|
||
device_info</emphasis>
|
||
; /* local copy of device state and configuration */
|
||
</entry>
|
||
</row>
|
||
<row rowsep='0'>
|
||
<entry role='functionargdecl'>
|
||
XkbDeviceChangesPtr <emphasis>
|
||
changes</emphasis>
|
||
; /* note specifying changes in <emphasis>
|
||
device_info</emphasis>
|
||
*/
|
||
</entry>
|
||
</row>
|
||
</tbody>
|
||
</tgroup>
|
||
</informaltable>
|
||
|
||
<para>
|
||
<emphasis>
|
||
XkbChangeDeviceInfo</emphasis>
|
||
updates the server’s description of the device specified in <emphasis>
|
||
device_info</emphasis>
|
||
-><emphasis>
|
||
device_spec</emphasis>
|
||
with the changes specified in <emphasis>
|
||
changes</emphasis>
|
||
and contained in <emphasis>
|
||
device_info</emphasis>
|
||
. The update is made by an XkbSetDeviceInfo request.
|
||
</para>
|
||
|
||
</sect1>
|
||
</chapter>
|