diff options
author | Carlos Garnacho <carlos@lanedo.com> | 2012-12-13 14:20:29 (GMT) |
---|---|---|
committer | Simon Schampijer <simon@laptop.org> | 2012-12-14 12:39:14 (GMT) |
commit | a22d4ee50d362eb1f638111d287c81af70a8f5fc (patch) | |
tree | 03ffa657854092d28e3755f652b38bf41da03e7d | |
parent | 8a9d10cda708eaa4cff902a2fef21316291202a2 (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.c | 20 |
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; } |