summaryrefslogtreecommitdiff
path: root/libxklavier/xklavier_evt_xkb.c
diff options
context:
space:
mode:
authorSergey Udaltsov <svu@gnome.org>2008-11-16 23:59:09 +0000
committerSergey Udaltsov <svu@gnome.org>2008-11-16 23:59:09 +0000
commit53da1f88aa97623939d88267831148ae7f24bcb0 (patch)
treed8d08ffedc33ff82994aebe1eca036ab162d7100 /libxklavier/xklavier_evt_xkb.c
parent2c4baea56ff5ba98b195f91b8729a5f33bdfd342 (diff)
downloadlibxklavier-53da1f88aa97623939d88267831148ae7f24bcb0.tar.gz
added device discovery
Diffstat (limited to 'libxklavier/xklavier_evt_xkb.c')
-rw-r--r--libxklavier/xklavier_evt_xkb.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/libxklavier/xklavier_evt_xkb.c b/libxklavier/xklavier_evt_xkb.c
index cff5ce4..64cea89 100644
--- a/libxklavier/xklavier_evt_xkb.c
+++ b/libxklavier/xklavier_evt_xkb.c
@@ -26,6 +26,23 @@
#include "xklavier_private.h"
#include "xklavier_private_xkb.h"
+#ifdef HAVE_XINPUT
+#include "config.h"
+#include "X11/extensions/XInput.h"
+
+static gint
+xkl_xinput_process_x_event(XklEngine * engine, XEvent * xev)
+{
+ XDevicePresenceNotifyEvent* dpne = (XDevicePresenceNotifyEvent*)xev;
+ xkl_debug(200, "XInput event detected: %d\n", dpne->devchange);
+ if (dpne->devchange == DeviceEnabled) {
+ xkl_debug(150, "Device enabled: %d\n", dpne->deviceid);
+ g_signal_emit_by_name(engine, "X-new-device");
+ }
+ return 1;
+}
+#endif
+
/*
* XKB event handler
*/
@@ -38,13 +55,19 @@ xkl_xkb_process_x_event(XklEngine * engine, XEvent * xev)
guint inds;
XkbEvent *kev = (XkbEvent *) xev;
- if (xev->type != xkl_engine_backend(engine, XklXkb, event_type))
- return 0;
-
if (!(xkl_engine_priv(engine, listener_type) &
(XKLL_MANAGE_WINDOW_STATES | XKLL_TRACK_KEYBOARD_STATE)))
return 0;
+#ifdef HAVE_XINPUT
+ /* Special case XInput event */
+ if (xev->type == xkl_engine_backend(engine, XklXkb, xi_event_type))
+ return xkl_xinput_process_x_event(engine, xev);
+#endif
+
+ if (xev->type != xkl_engine_backend(engine, XklXkb, event_type))
+ return 0;
+
xkl_debug(150, "Xkb event detected\n");
switch (kev->any.xkb_type) {