devices-xi2: Enable touch events

This commit is contained in:
Carlos Garnacho 2011-08-02 19:21:36 +02:00
parent 2a9a499841
commit bd77a67ea4
6 changed files with 61 additions and 1 deletions

View File

@ -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 |

View File

@ -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;
}

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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);