Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlos Garnacho <carlos@lanedo.com>2012-12-13 14:20:29 (GMT)
committer Simon Schampijer <simon@laptop.org>2012-12-14 12:39:14 (GMT)
commita22d4ee50d362eb1f638111d287c81af70a8f5fc (patch)
tree03ffa657854092d28e3755f652b38bf41da03e7d
parent8a9d10cda708eaa4cff902a2fef21316291202a2 (diff)
keygrabber: Handle XI2 key events, part of SL #3895
XInput2 events are coerced by active grabs on the alt-tab handling code in sugar shell, even if the keygrabber itself does core events. Signed-off-by: Carlos Garnacho <carlos@lanedo.com> Acked-by: Simon Schampijer <simon@laptop.org>
-rw-r--r--src/sugar3/sugar-key-grabber.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/sugar3/sugar-key-grabber.c b/src/sugar3/sugar-key-grabber.c
index 74a0a95..a4c0096 100644
--- a/src/sugar3/sugar-key-grabber.c
+++ b/src/sugar3/sugar-key-grabber.c
@@ -19,6 +19,7 @@
#include <X11/X.h>
#include <X11/Xlib.h>
+#include <X11/extensions/XInput2.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
@@ -138,6 +139,25 @@ filter_events(GdkXEvent *xevent, GdkEvent *event, gpointer data)
return GDK_FILTER_REMOVE;
}
+ if (xev->type == GenericEvent) {
+ XIDeviceEvent *ev;
+ int return_value = FALSE;
+
+ ev = (XIDeviceEvent *) ((XGenericEventCookie *) xev)->data;
+
+ if (ev->evtype == XI_KeyPress) {
+ g_signal_emit (grabber, signals[KEY_PRESSED], 0,
+ ev->detail, ev->mods.effective, ev->time, &return_value);
+ } else if (ev->evtype == XI_KeyRelease) {
+ g_signal_emit (grabber, signals[KEY_RELEASED], 0,
+ ev->detail, ev->mods.effective, ev->time, &return_value);
+ }
+
+ if (return_value)
+ return GDK_FILTER_REMOVE;
+ }
+
+
return GDK_FILTER_CONTINUE;
}