ui: Filter out touch events
This commit is contained in:
parent
f807207b65
commit
a307e13a63
43
src/ui/ui.c
43
src/ui/ui.c
@ -75,12 +75,30 @@ meta_ui_get_screen_number (void)
|
|||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
is_input_event (XEvent *event)
|
is_interesting_input_event (XEvent *event)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_get_display ();
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
XIEvent *input_event;
|
||||||
|
|
||||||
return (event->type == GenericEvent &&
|
if (event->type != GenericEvent ||
|
||||||
event->xcookie.extension == display->xinput_opcode);
|
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
|
/* 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.
|
* use more fields, more fields need to be filled out below.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
maybe_redirect_mouse_event (XEvent *xevent)
|
maybe_redirect_mouse_event (XEvent *xevent)
|
||||||
{
|
{
|
||||||
GdkDisplay *gdisplay;
|
GdkDisplay *gdisplay;
|
||||||
@ -112,9 +130,6 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
|||||||
XIDeviceEvent *xev_d = NULL;
|
XIDeviceEvent *xev_d = NULL;
|
||||||
XIEnterEvent *xev_e = NULL;
|
XIEnterEvent *xev_e = NULL;
|
||||||
|
|
||||||
if (!is_input_event (xevent))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
xev = (XIEvent *) xevent->xcookie.data;
|
xev = (XIEvent *) xevent->xcookie.data;
|
||||||
|
|
||||||
switch (xev->evtype)
|
switch (xev->evtype)
|
||||||
@ -131,17 +146,18 @@ maybe_redirect_mouse_event (XEvent *xevent)
|
|||||||
window = xev_e->event;
|
window = xev_e->event;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
/* Not interested in this event. */
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
gdisplay = gdk_x11_lookup_xdisplay (xev->display);
|
gdisplay = gdk_x11_lookup_xdisplay (xev->display);
|
||||||
ui = g_object_get_data (G_OBJECT (gdisplay), "meta-ui");
|
ui = g_object_get_data (G_OBJECT (gdisplay), "meta-ui");
|
||||||
if (!ui)
|
if (!ui)
|
||||||
return FALSE;
|
return;
|
||||||
|
|
||||||
gdk_window = gdk_x11_window_lookup_for_display (gdisplay, window);
|
gdk_window = gdk_x11_window_lookup_for_display (gdisplay, window);
|
||||||
if (gdk_window == NULL)
|
if (gdk_window == NULL)
|
||||||
return FALSE;
|
return;
|
||||||
|
|
||||||
gmanager = gdk_display_get_device_manager (gdisplay);
|
gmanager = gdk_display_get_device_manager (gdisplay);
|
||||||
gdevice = gdk_x11_device_manager_lookup (gmanager, META_VIRTUAL_CORE_POINTER_ID);
|
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);
|
gdk_event_set_device (gevent, gdevice);
|
||||||
gtk_main_do_event (gevent);
|
gtk_main_do_event (gevent);
|
||||||
gdk_event_free (gevent);
|
gdk_event_free (gevent);
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GdkFilterReturn
|
static GdkFilterReturn
|
||||||
@ -230,8 +244,11 @@ ui_filter_func (GdkXEvent *xevent,
|
|||||||
GdkEvent *event,
|
GdkEvent *event,
|
||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
if (maybe_redirect_mouse_event (xevent))
|
if (is_interesting_input_event (xevent))
|
||||||
|
{
|
||||||
|
maybe_redirect_mouse_event (xevent);
|
||||||
return GDK_FILTER_REMOVE;
|
return GDK_FILTER_REMOVE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user