diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-07-27 16:54:33 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-07-30 08:43:13 +1000 |
commit | 4e9b2938cd8637a5d3b0a4c9f69d6ee75faab3a0 (patch) | |
tree | e399904f7ab33652c978d778b84bba71084c5f49 | |
parent | fad5f96c01811af7490a071719e4017c019a8d9b (diff) |
include: untangle events.h from the SDK headers.
InternalEvents shouldn't be used anywhere outside the X server itself. Split
up into events.h for opaque typedefs for the events needed by various
headers and eventstr.h for the actual struct definitions.
eventstr.h must only be included by code that requires internal events and
is not part of the SDK.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | Xi/exevents.c | 1 | ||||
-rw-r--r-- | dix/devices.c | 1 | ||||
-rw-r--r-- | dix/eventconvert.c | 2 | ||||
-rw-r--r-- | dix/events.c | 1 | ||||
-rw-r--r-- | dix/getevents.c | 2 | ||||
-rw-r--r-- | hw/kdrive/src/kinput.c | 1 | ||||
-rw-r--r-- | hw/xfree86/common/xf86DGA.c | 2 | ||||
-rw-r--r-- | hw/xfree86/common/xf86Xinput.c | 1 | ||||
-rw-r--r-- | include/Makefile.am | 2 | ||||
-rw-r--r-- | include/events.h | 210 | ||||
-rw-r--r-- | include/eventstr.h | 236 | ||||
-rw-r--r-- | include/input.h | 3 | ||||
-rw-r--r-- | mi/mieq.c | 1 | ||||
-rw-r--r-- | xkb/xkbAccessX.c | 1 | ||||
-rw-r--r-- | xkb/xkbActions.c | 1 | ||||
-rw-r--r-- | xkb/xkbPrKeyEv.c | 1 | ||||
-rw-r--r-- | xkb/xkbUtils.c | 1 |
17 files changed, 256 insertions, 211 deletions
diff --git a/Xi/exevents.c b/Xi/exevents.c index 984bc0718..5c432664e 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -76,6 +76,7 @@ SOFTWARE. #include "xace.h" #include "xiquerydevice.h" /* For List*Info */ #include "eventconvert.h" +#include "eventstr.h" #include <X11/extensions/XKBproto.h> #include "xkbsrv.h" diff --git a/dix/devices.c b/dix/devices.c index 4d006b1f2..32fd4451a 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -72,6 +72,7 @@ SOFTWARE. #include "swaprep.h" #include "dixevents.h" #include "mipointer.h" +#include "eventstr.h" #include <X11/extensions/XI.h> #include <X11/extensions/XI2.h> diff --git a/dix/eventconvert.c b/dix/eventconvert.c index 039a17f79..943178e99 100644 --- a/dix/eventconvert.c +++ b/dix/eventconvert.c @@ -42,7 +42,7 @@ #include "dix.h" #include "inputstr.h" #include "misc.h" -#include "events.h" +#include "eventstr.h" #include "exglobals.h" #include "eventconvert.h" #include "xiquerydevice.h" diff --git a/dix/events.c b/dix/events.c index f50229a91..a6a10758d 100644 --- a/dix/events.c +++ b/dix/events.c @@ -162,6 +162,7 @@ typedef const char *string; #include "geext.h" #include "geint.h" +#include "eventstr.h" #include "enterleave.h" #include "eventconvert.h" diff --git a/dix/getevents.c b/dix/getevents.c index 989564261..ffd749717 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -43,7 +43,7 @@ #include "globals.h" #include "dixevents.h" #include "mipointer.h" -#include "events.h" +#include "eventstr.h" #include "eventconvert.h" #include <X11/extensions/XKBproto.h> diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 5e7ff5376..318d233d4 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -46,6 +46,7 @@ #include "exevents.h" #include "extinit.h" #include "exglobals.h" +#include "eventstr.h" #include "xserver-properties.h" #define AtomFromName(x) MakeAtom(x, strlen(x), 1) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 5716989f6..4509541a4 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -46,7 +46,7 @@ #include "xf86Xinput.h" #include "exglobals.h" #include "exevents.h" -#include "events.h" +#include "eventstr.h" #include "eventconvert.h" #include "mi.h" diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index b4169cf76..7b5904eaa 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -72,6 +72,7 @@ #include "exevents.h" /* AddInputDevice */ #include "exglobals.h" +#include "eventstr.h" #include "extnsionst.h" diff --git a/include/Makefile.am b/include/Makefile.am index 50b75c200..f8eef53e1 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -65,4 +65,4 @@ AM_CFLAGS = $(DIX_CFLAGS) EXTRA_DIST = \ dix-config-apple-verbatim.h \ - eventconvert.h + eventconvert.h eventstr.h diff --git a/include/events.h b/include/events.h index 4b0c6dcb4..9f6a94c5b 100644 --- a/include/events.h +++ b/include/events.h @@ -24,212 +24,12 @@ #ifndef EVENTS_H #define EVENTS_H - -/** - * @file events.h - * This file describes the event structures used internally by the X - * server during event generation and event processing. - * - * When are internal events used? - * Events from input devices are stored as internal events in the EQ and - * processed as internal events until late in the processing cycle. Only then - * do they switch to their respective wire events. - */ - -/** - * Event types. Used exclusively internal to the server, not visible on the - * protocol. - * - * Note: Keep KeyPress to Motion aligned with the core events. - * Keep ET_Raw* in the same order as KeyPress - Motion - */ -enum { - ET_KeyPress = 2, - ET_KeyRelease, - ET_ButtonPress, - ET_ButtonRelease, - ET_Motion, - ET_Enter, - ET_Leave, - ET_FocusIn, - ET_FocusOut, - ET_ProximityIn, - ET_ProximityOut, - ET_DeviceChanged, - ET_Hierarchy, -#if XFreeXDGA - ET_DGAEvent, -#endif - ET_RawKeyPress, - ET_RawKeyRelease, - ET_RawButtonPress, - ET_RawButtonRelease, - ET_RawMotion, - ET_Internal = 0xFF /* First byte */ -} EventType; - -#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->any.header != 0xFF) \ - FatalError("Wrong event type %d.\n", \ - ((InternalEvent*)(ev))->any.header); - -/** - * Used for ALL input device events internal in the server until - * copied into the matching protocol event. - * - * Note: We only use the device id because the DeviceIntPtr may become invalid while - * the event is in the EQ. - */ -typedef struct -{ - unsigned char header; /**< Always ET_Internal */ - int type; /**< One of EventType */ - int length; /**< Length in bytes */ - Time time; /**< Time in ms */ - int deviceid; /**< Device to post this event for */ - int sourceid; /**< The physical source device */ - union { - uint32_t button; /**< Button number */ - uint32_t key; /**< Key code */ - } detail; - uint16_t root_x; /**< Pos relative to root window in integral data */ - float root_x_frac; /**< Pos relative to root window in frac part */ - uint16_t root_y; /**< Pos relative to root window in integral part */ - float root_y_frac; /**< Pos relative to root window in frac part */ - uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */ - struct { - uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */ - uint8_t mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/ - uint32_t data[MAX_VALUATORS]; /**< Valuator data */ - int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */ - } valuators; - struct { - uint32_t base; /**< XKB base modifiers */ - uint32_t latched; /**< XKB latched modifiers */ - uint32_t locked; /**< XKB locked modifiers */ - uint32_t effective;/**< XKB effective modifiers */ - } mods; - struct { - uint8_t base; /**< XKB base group */ - uint8_t latched; /**< XKB latched group */ - uint8_t locked; /**< XKB locked group */ - uint8_t effective;/**< XKB effective group */ - } group; - Window root; /**< Root window of the event */ - int corestate; /**< Core key/button state BEFORE the event */ -} DeviceEvent; - - -/* Flags used in DeviceChangedEvent to signal if new/old slave is present. */ -#define DEVCHANGE_HAS_OLD_SLAVE 0x1 -#define DEVCHANGE_HAS_NEW_SLAVE 0x2 -/* Flags used in DeviceChangedEvent to signal whether the event was a - * pointer event or a keyboard event */ -#define DEVCHANGE_POINTER_EVENT 0x4 -#define DEVCHANGE_KEYBOARD_EVENT 0x8 -/* device capabilities changed */ -#define DEVCHANGE_DEVICE_CHANGE 0x10 - -/** - * Sent whenever a device's capabilities have changed. - */ -typedef struct -{ - unsigned char header; /**< Always ET_Internal */ - int type; /**< ET_DeviceChanged */ - int length; /**< Length in bytes */ - Time time; /**< Time in ms */ - int deviceid; /**< Device whose capabilities have changed */ - int flags; /**< Mask of ::HAS_OLD_SLAVE, ::HAS_NEW_SLAVE, - ::POINTER_EVENT, ::KEYBOARD_EVENT */ - /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies SD previously - * attached to this device. */ - int old_slaveid; - /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies device now - * attached to this device. */ - int new_slaveid; - - struct { - int num_buttons; /**< Number of buttons */ - Atom names[MAX_BUTTONS];/**< Button names */ - } buttons; - - int num_valuators; /**< Number of axes */ - struct { - uint32_t min; /**< Minimum value */ - uint32_t max; /**< Maximum value */ - /* FIXME: frac parts of min/max */ - uint32_t resolution; /**< Resolution counts/m */ - uint8_t mode; /**< Relative or Absolute */ - Atom name; /**< Axis name */ - } valuators[MAX_VALUATORS]; - - struct { - int min_keycode; - int max_keycode; - } keys; -} DeviceChangedEvent; - -#if XFreeXDGA -/** - * DGAEvent, used by DGA to intercept and emulate input events. - */ -typedef struct -{ - unsigned char header; /**< Always ET_Internal */ - int type; /**< ET_DGAEvent */ - int length; /**< Length in bytes */ - Time time; /**< Time in ms */ - int subtype; /**< KeyPress, KeyRelease, ButtonPress, - ButtonRelease, MotionNotify */ - int detail; /**< Relative x coordinate */ - int dx; /**< Relative x coordinate */ - int dy; /**< Relative y coordinate */ - int screen; /**< Screen number this event applies to */ - uint16_t state; /**< Core modifier/button state */ -} DGAEvent; -#endif - -/** - * Raw event, contains the data as posted by the device. - */ -typedef struct -{ - unsigned char header; /**< Always ET_Internal */ - int type; /**< ET_Raw */ - int length; /**< Length in bytes */ - Time time; /**< Time in ms */ - int deviceid; /**< Device to post this event for */ - int sourceid; /**< The physical source device */ - union { - uint32_t button; /**< Button number */ - uint32_t key; /**< Key code */ - } detail; - struct { - uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */ - int32_t data[MAX_VALUATORS]; /**< Valuator data */ - int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */ - int32_t data_raw[MAX_VALUATORS]; /**< Valuator data as posted */ - int32_t data_raw_frac[MAX_VALUATORS];/**< Fractional part for data_raw */ - } valuators; -} RawDeviceEvent; - -/** - * Event type used inside the X server for input event - * processing. - */ -typedef union { - struct { - unsigned char header; /**< Always ET_Internal */ - int type; /**< One of ET_* */ - int length; /**< Length in bytes */ - Time time; /**< Time in ms. */ - } any; - DeviceEvent device; - DeviceChangedEvent changed; +typedef struct _DeviceEvent DeviceEvent; +typedef struct _DeviceChangedEvent DeviceChangedEvent; #if XFreeXDGA - DGAEvent dga; +typedef struct _DGAEvent DGAEvent; #endif - RawDeviceEvent raw; -} InternalEvent; +typedef struct _RawDeviceEvent RawDeviceEvent; +typedef union _InternalEvent InternalEvent; #endif diff --git a/include/eventstr.h b/include/eventstr.h new file mode 100644 index 000000000..3eefc052f --- /dev/null +++ b/include/eventstr.h @@ -0,0 +1,236 @@ +/* + * Copyright © 2009 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef EVENTSTR_H +#define EVENTSTR_H + +#include <events.h> +/** + * @file events.h + * This file describes the event structures used internally by the X + * server during event generation and event processing. + * + * When are internal events used? + * Events from input devices are stored as internal events in the EQ and + * processed as internal events until late in the processing cycle. Only then + * do they switch to their respective wire events. + */ + +/** + * Event types. Used exclusively internal to the server, not visible on the + * protocol. + * + * Note: Keep KeyPress to Motion aligned with the core events. + * Keep ET_Raw* in the same order as KeyPress - Motion + */ +enum { + ET_KeyPress = 2, + ET_KeyRelease, + ET_ButtonPress, + ET_ButtonRelease, + ET_Motion, + ET_Enter, + ET_Leave, + ET_FocusIn, + ET_FocusOut, + ET_ProximityIn, + ET_ProximityOut, + ET_DeviceChanged, + ET_Hierarchy, +#if XFreeXDGA + ET_DGAEvent, +#endif + ET_RawKeyPress, + ET_RawKeyRelease, + ET_RawButtonPress, + ET_RawButtonRelease, + ET_RawMotion, + ET_Internal = 0xFF /* First byte */ +} EventType; + +#define CHECKEVENT(ev) if (ev && ((InternalEvent*)(ev))->any.header != 0xFF) \ + FatalError("Wrong event type %d.\n", \ + ((InternalEvent*)(ev))->any.header); + +/** + * Used for ALL input device events internal in the server until + * copied into the matching protocol event. + * + * Note: We only use the device id because the DeviceIntPtr may become invalid while + * the event is in the EQ. + */ +struct _DeviceEvent +{ + unsigned char header; /**< Always ET_Internal */ + int type; /**< One of EventType */ + int length; /**< Length in bytes */ + Time time; /**< Time in ms */ + int deviceid; /**< Device to post this event for */ + int sourceid; /**< The physical source device */ + union { + uint32_t button; /**< Button number */ + uint32_t key; /**< Key code */ + } detail; + uint16_t root_x; /**< Pos relative to root window in integral data */ + float root_x_frac; /**< Pos relative to root window in frac part */ + uint16_t root_y; /**< Pos relative to root window in integral part */ + float root_y_frac; /**< Pos relative to root window in frac part */ + uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */ + struct { + uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */ + uint8_t mode[(MAX_VALUATORS + 7)/8]; /**< Valuator mode (Abs or Rel)*/ + uint32_t data[MAX_VALUATORS]; /**< Valuator data */ + int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */ + } valuators; + struct { + uint32_t base; /**< XKB base modifiers */ + uint32_t latched; /**< XKB latched modifiers */ + uint32_t locked; /**< XKB locked modifiers */ + uint32_t effective;/**< XKB effective modifiers */ + } mods; + struct { + uint8_t base; /**< XKB base group */ + uint8_t latched; /**< XKB latched group */ + uint8_t locked; /**< XKB locked group */ + uint8_t effective;/**< XKB effective group */ + } group; + Window root; /**< Root window of the event */ + int corestate; /**< Core key/button state BEFORE the event */ +}; + + +/* Flags used in DeviceChangedEvent to signal if new/old slave is present. */ +#define DEVCHANGE_HAS_OLD_SLAVE 0x1 +#define DEVCHANGE_HAS_NEW_SLAVE 0x2 +/* Flags used in DeviceChangedEvent to signal whether the event was a + * pointer event or a keyboard event */ +#define DEVCHANGE_POINTER_EVENT 0x4 +#define DEVCHANGE_KEYBOARD_EVENT 0x8 +/* device capabilities changed */ +#define DEVCHANGE_DEVICE_CHANGE 0x10 + +/** + * Sent whenever a device's capabilities have changed. + */ +struct _DeviceChangedEvent +{ + unsigned char header; /**< Always ET_Internal */ + int type; /**< ET_DeviceChanged */ + int length; /**< Length in bytes */ + Time time; /**< Time in ms */ + int deviceid; /**< Device whose capabilities have changed */ + int flags; /**< Mask of ::HAS_OLD_SLAVE, ::HAS_NEW_SLAVE, + ::POINTER_EVENT, ::KEYBOARD_EVENT */ + /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies SD previously + * attached to this device. */ + int old_slaveid; + /** If flags & HAS_OLD_SLAVE is set, old_slaveid specifies device now + * attached to this device. */ + int new_slaveid; + + struct { + int num_buttons; /**< Number of buttons */ + Atom names[MAX_BUTTONS];/**< Button names */ + } buttons; + + int num_valuators; /**< Number of axes */ + struct { + uint32_t min; /**< Minimum value */ + uint32_t max; /**< Maximum value */ + /* FIXME: frac parts of min/max */ + uint32_t resolution; /**< Resolution counts/m */ + uint8_t mode; /**< Relative or Absolute */ + Atom name; /**< Axis name */ + } valuators[MAX_VALUATORS]; + + struct { + int min_keycode; + int max_keycode; + } keys; +}; + +#if XFreeXDGA +/** + * DGAEvent, used by DGA to intercept and emulate input events. + */ +struct _DGAEvent +{ + unsigned char header; /**< Always ET_Internal */ + int type; /**< ET_DGAEvent */ + int length; /**< Length in bytes */ + Time time; /**< Time in ms */ + int subtype; /**< KeyPress, KeyRelease, ButtonPress, + ButtonRelease, MotionNotify */ + int detail; /**< Relative x coordinate */ + int dx; /**< Relative x coordinate */ + int dy; /**< Relative y coordinate */ + int screen; /**< Screen number this event applies to */ + uint16_t state; /**< Core modifier/button state */ +}; +#endif + +/** + * Raw event, contains the data as posted by the device. + */ +struct _RawDeviceEvent +{ + unsigned char header; /**< Always ET_Internal */ + int type; /**< ET_Raw */ + int length; /**< Length in bytes */ + Time time; /**< Time in ms */ + int deviceid; /**< Device to post this event for */ + int sourceid; /**< The physical source device */ + union { + uint32_t button; /**< Button number */ + uint32_t key; /**< Key code */ + } detail; + struct { + uint8_t mask[(MAX_VALUATORS + 7)/8]; /**< Valuator mask */ + int32_t data[MAX_VALUATORS]; /**< Valuator data */ + int32_t data_frac[MAX_VALUATORS]; /**< Fractional part for data */ + int32_t data_raw[MAX_VALUATORS]; /**< Valuator data as posted */ + int32_t data_raw_frac[MAX_VALUATORS];/**< Fractional part for data_raw */ + } valuators; +}; + +/** + * Event type used inside the X server for input event + * processing. + */ +union _InternalEvent { + struct { + unsigned char header; /**< Always ET_Internal */ + int type; /**< One of ET_* */ + int length; /**< Length in bytes */ + Time time; /**< Time in ms. */ + } any; + DeviceEvent device; + DeviceChangedEvent changed; +#if XFreeXDGA + DGAEvent dga; +#endif + RawDeviceEvent raw; +}; + +#endif diff --git a/include/input.h b/include/input.h index 40ba660f1..e962696cb 100644 --- a/include/input.h +++ b/include/input.h @@ -54,6 +54,7 @@ SOFTWARE. #include <X11/Xproto.h> #include "window.h" /* for WindowPtr */ #include "xkbrules.h" +#include "events.h" #define DEVICE_INIT 0 #define DEVICE_ON 1 @@ -96,8 +97,6 @@ SOFTWARE. #define RevertToFollowKeyboard 3 #endif -#include "events.h" - typedef unsigned long Leds; typedef struct _OtherClients *OtherClientsPtr; typedef struct _InputClients *InputClientsPtr; @@ -51,6 +51,7 @@ in this Software without prior written authorization from The Open Group. # include <X11/extensions/geproto.h> # include "extinit.h" # include "exglobals.h" +# include "eventstr.h" #ifdef DPMSExtension # include "dpmsproc.h" diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c index f0f757818..7df8e06cf 100644 --- a/xkb/xkbAccessX.c +++ b/xkb/xkbAccessX.c @@ -36,6 +36,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "exglobals.h" #include <X11/extensions/XIproto.h> #include "inputstr.h" +#include "eventstr.h" #include <xkbsrv.h> #if !defined(WIN32) #include <sys/time.h> diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c index 5909b06d2..9c3184a83 100644 --- a/xkb/xkbActions.c +++ b/xkb/xkbActions.c @@ -36,6 +36,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "misc.h" #include "inputstr.h" #include "exevents.h" +#include "eventstr.h" #include <xkbsrv.h> #include "xkb.h" #include <ctype.h> diff --git a/xkb/xkbPrKeyEv.c b/xkb/xkbPrKeyEv.c index effb0ea3a..e01282d9b 100644 --- a/xkb/xkbPrKeyEv.c +++ b/xkb/xkbPrKeyEv.c @@ -36,6 +36,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "misc.h" #include "inputstr.h" #include "exevents.h" +#include "eventstr.h" #include <xkbsrv.h> #include <ctype.h> #include "events.h" diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c index e25247f4e..06da1d55c 100644 --- a/xkb/xkbUtils.c +++ b/xkb/xkbUtils.c @@ -62,6 +62,7 @@ DEALINGS IN THE SOFTWARE. #include <X11/keysym.h> #include "misc.h" #include "inputstr.h" +#include "eventstr.h" #define XKBSRV_NEED_FILE_FUNCS #include <xkbsrv.h> |