[mutter] ui: Filter out touch events
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] ui: Filter out touch events
- Date: Tue, 8 Jul 2014 15:06:58 +0000 (UTC)
commit a307e13a6394f4d8389516f04a8b469d4d77aa2a
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Tue Jul 8 10:47:46 2014 -0400
ui: Filter out touch events
src/ui/ui.c | 45 +++++++++++++++++++++++++++++++--------------
1 files changed, 31 insertions(+), 14 deletions(-)
---
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 2d4d558..943377d 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -75,12 +75,30 @@ meta_ui_get_screen_number (void)
#include "display-private.h"
static gboolean
-is_input_event (XEvent *event)
+is_interesting_input_event (XEvent *event)
{
MetaDisplay *display = meta_get_display ();
+ XIEvent *input_event;
- return (event->type == GenericEvent &&
- event->xcookie.extension == display->xinput_opcode);
+ if (event->type != GenericEvent ||
+ event->xcookie.extension == display->xinput_opcode)
+ return FALSE;
+
+ input_event = (XIEvent *) event->xcookie.data;
+ switch (input_event->evtype)
+ {
+ case XI_ButtonPress:
+ case XI_ButtonRelease:
+ case XI_Motion:
+ case XI_Enter:
+ case XI_Leave:
+ case XI_TouchBegin:
+ case XI_TouchUpdate:
+ case XI_TouchEnd:
+ return TRUE;
+ default:
+ return FALSE;
+ }
}
/* We do some of our event handling in frames.c, which expects
@@ -98,7 +116,7 @@ is_input_event (XEvent *event)
* use more fields, more fields need to be filled out below.
*/
-static gboolean
+static void
maybe_redirect_mouse_event (XEvent *xevent)
{
GdkDisplay *gdisplay;
@@ -112,9 +130,6 @@ maybe_redirect_mouse_event (XEvent *xevent)
XIDeviceEvent *xev_d = NULL;
XIEnterEvent *xev_e = NULL;
- if (!is_input_event (xevent))
- return FALSE;
-
xev = (XIEvent *) xevent->xcookie.data;
switch (xev->evtype)
@@ -131,17 +146,18 @@ maybe_redirect_mouse_event (XEvent *xevent)
window = xev_e->event;
break;
default:
- return FALSE;
+ /* Not interested in this event. */
+ return;
}
gdisplay = gdk_x11_lookup_xdisplay (xev->display);
ui = g_object_get_data (G_OBJECT (gdisplay), "meta-ui");
if (!ui)
- return FALSE;
+ return;
gdk_window = gdk_x11_window_lookup_for_display (gdisplay, window);
if (gdk_window == NULL)
- return FALSE;
+ return;
gmanager = gdk_display_get_device_manager (gdisplay);
gdevice = gdk_x11_device_manager_lookup (gmanager, META_VIRTUAL_CORE_POINTER_ID);
@@ -221,8 +237,6 @@ maybe_redirect_mouse_event (XEvent *xevent)
gdk_event_set_device (gevent, gdevice);
gtk_main_do_event (gevent);
gdk_event_free (gevent);
-
- return TRUE;
}
static GdkFilterReturn
@@ -230,8 +244,11 @@ ui_filter_func (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
- if (maybe_redirect_mouse_event (xevent))
- return GDK_FILTER_REMOVE;
+ if (is_interesting_input_event (xevent))
+ {
+ maybe_redirect_mouse_event (xevent);
+ return GDK_FILTER_REMOVE;
+ }
else
return GDK_FILTER_CONTINUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]