summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2011-08-02 19:21:36 +0200
committerCarlos Garnacho <carlosg@gnome.org>2011-10-30 18:22:19 +0100
commitbd77a67ea4d9dd4834f4ba70e5c2ca2f57483207 (patch)
tree0fe42c4cf3c712fbc43d06d6487d572bc4361660
parent2a9a499841f69755b8b818ddb36def857b723b4d (diff)
downloadmutter-bd77a67ea4d9dd4834f4ba70e5c2ca2f57483207.tar.gz
devices-xi2: Enable touch events
-rw-r--r--src/core/core.c4
-rw-r--r--src/core/devices-xi2.c10
-rw-r--r--src/core/display-private.h4
-rw-r--r--src/core/display.c30
-rw-r--r--src/core/input-events.h5
-rw-r--r--src/core/window.c9
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);