diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2011-08-02 19:21:36 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2011-10-30 18:22:19 +0100 |
commit | bd77a67ea4d9dd4834f4ba70e5c2ca2f57483207 (patch) | |
tree | 0fe42c4cf3c712fbc43d06d6487d572bc4361660 | |
parent | 2a9a499841f69755b8b818ddb36def857b723b4d (diff) | |
download | mutter-bd77a67ea4d9dd4834f4ba70e5c2ca2f57483207.tar.gz |
devices-xi2: Enable touch events
-rw-r--r-- | src/core/core.c | 4 | ||||
-rw-r--r-- | src/core/devices-xi2.c | 10 | ||||
-rw-r--r-- | src/core/display-private.h | 4 | ||||
-rw-r--r-- | src/core/display.c | 30 | ||||
-rw-r--r-- | src/core/input-events.h | 5 | ||||
-rw-r--r-- | src/core/window.c | 9 |
6 files changed, 61 insertions, 1 deletions
diff --git a/src/core/core.c b/src/core/core.c index f002df498..4212bee58 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -27,6 +27,7 @@ #include "core.h" #include "frame.h" #include "workspace-private.h" +#include "input-events.h" #include <meta/prefs.h> #include <meta/errors.h> @@ -866,7 +867,8 @@ meta_core_select_events (Display *xdisplay, XISelectEvents (xdisplay, xwindow, &mask, 1); /* Unset any input event so they are only handled via XInput2 */ - evmask &= ~(KeyPressMask | KeyReleaseMask | + evmask &= ~(META_INPUT_TOUCH_EVENTS_MASK | + KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | diff --git a/src/core/devices-xi2.c b/src/core/devices-xi2.c index cd6fb1b2e..303c2d41f 100644 --- a/src/core/devices-xi2.c +++ b/src/core/devices-xi2.c @@ -25,6 +25,7 @@ #include "devices-xi2.h" #include "display-private.h" #include "screen-private.h" +#include "input-events.h" #include <X11/extensions/XInput2.h> /* Common functions */ @@ -97,6 +98,15 @@ meta_device_xi2_translate_event_mask (guint evmask, XISetMask (mask, XI_FocusOut); } +#ifdef HAVE_XTOUCH + if (evmask & META_INPUT_TOUCH_EVENTS_MASK) + { + XISetMask (mask, XI_TouchBegin); + XISetMask (mask, XI_TouchEnd); + XISetMask (mask, XI_TouchUpdate); + } +#endif + return mask; } diff --git a/src/core/display-private.h b/src/core/display-private.h index 9b5acd013..2a178af63 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -424,6 +424,10 @@ void meta_display_grab_window_buttons (MetaDisplay *display, Window xwindow); void meta_display_ungrab_window_buttons (MetaDisplay *display, Window xwindow); +void meta_display_grab_window_touches (MetaDisplay *display, + MetaWindow *window); +void meta_display_ungrab_window_touches (MetaDisplay *display, + MetaWindow *window); void meta_display_grab_focus_window_button (MetaDisplay *display, MetaWindow *window); diff --git a/src/core/display.c b/src/core/display.c index ee19faa48..e77cb0681 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -4156,6 +4156,36 @@ meta_display_ungrab_window_buttons (MetaDisplay *display, } } +void +meta_display_grab_window_touches (MetaDisplay *display, + MetaWindow *window) +{ + if (!window->frame) + return; + + meta_error_trap_push_with_return (display); + meta_device_map_grab_touch (display->device_map, + window->frame->xwindow); + + if (meta_error_trap_pop_with_return (display) != Success) + { + meta_verbose ("Unable to add a passive touch grab on window '%s'\n", + window->desc); + return; + } +} + +void +meta_display_ungrab_window_touches (MetaDisplay *display, + MetaWindow *window) +{ + if (!window->frame) + return; + + meta_device_map_ungrab_touch (display->device_map, + window->frame->xwindow); +} + /* Grab buttons we only grab while unfocused in click-to-focus mode */ #define MAX_FOCUS_BUTTON 4 void diff --git a/src/core/input-events.h b/src/core/input-events.h index a53d1e3bc..99e322419 100644 --- a/src/core/input-events.h +++ b/src/core/input-events.h @@ -35,6 +35,11 @@ #include "display-private.h" #include <meta/device-map.h> +/* Add an extra flag for touch events in + * evmasks, an arbitrarily high bit is taken. + */ +#define META_INPUT_TOUCH_EVENTS_MASK (1L<<31) + gboolean meta_input_event_get_type (MetaDisplay *display, XEvent *ev, guint *ev_type); diff --git a/src/core/window.c b/src/core/window.c index 4ba16dd43..5e4e5f965 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -1193,6 +1193,14 @@ meta_window_new_with_attrs (MetaDisplay *display, meta_display_grab_focus_window_button (window->display, window); } + if (window->frame && + (window->type == META_WINDOW_NORMAL || + window->type == META_WINDOW_DIALOG || + window->type == META_WINDOW_MODAL_DIALOG)) + { + meta_display_grab_window_touches (window->display, window); + } + if (window->type == META_WINDOW_DESKTOP || window->type == META_WINDOW_DOCK) { @@ -1799,6 +1807,7 @@ meta_window_unmanage (MetaWindow *window, meta_window_ungrab_keys (window); meta_display_ungrab_window_buttons (window->display, window->xwindow); meta_display_ungrab_focus_window_button (window->display, window); + meta_display_ungrab_window_touches (window->display, window); meta_display_unregister_x_window (window->display, window->xwindow); |