Implement multitouch grab
This commit is contained in:
parent
5cf392b17a
commit
79dae5f2b4
@ -153,6 +153,11 @@ gdk_display_dispose (GObject *object)
|
||||
display->queued_events = NULL;
|
||||
display->queued_tail = NULL;
|
||||
|
||||
if (display->touch_grabs)
|
||||
{
|
||||
g_hash_table_destroy (display->touch_grabs);
|
||||
}
|
||||
|
||||
_gdk_displays = g_slist_remove (_gdk_displays, object);
|
||||
|
||||
if (gdk_display_get_default() == display)
|
||||
|
@ -10848,6 +10848,30 @@ proxy_button_event (GdkEvent *source_event,
|
||||
type, state,
|
||||
NULL, serial);
|
||||
|
||||
/* multitouch grab */
|
||||
if (type == GDK_TOUCH_BEGIN && !source_event->any.send_event)
|
||||
{
|
||||
GdkEventTouch* tev = (GdkEventTouch*) source_event;
|
||||
if (!display->touch_grabs) {
|
||||
display->touch_grabs = g_hash_table_new (g_direct_hash, NULL);
|
||||
}
|
||||
event_win = _gdk_window_find_descendant_at (toplevel_window, toplevel_x, toplevel_y, NULL, NULL);
|
||||
g_hash_table_insert (display->touch_grabs, GUINT_TO_POINTER (tev->sequence), event_win);
|
||||
}
|
||||
else if (type == GDK_TOUCH_END && display->touch_grabs)
|
||||
{
|
||||
GdkEventTouch* tev = (GdkEventTouch*) source_event;
|
||||
g_hash_table_remove (display->touch_grabs, GUINT_TO_POINTER (tev->sequence));
|
||||
}
|
||||
else if (type == GDK_TOUCH_UPDATE && display->touch_grabs)
|
||||
{
|
||||
GdkEventTouch* tev = (GdkEventTouch*) source_event;
|
||||
void* w = g_hash_table_lookup (display->touch_grabs, GUINT_TO_POINTER (tev->sequence));
|
||||
if (w) {
|
||||
event_win = GDK_WINDOW (w);
|
||||
}
|
||||
}
|
||||
|
||||
if (event_win == NULL || display->ignore_core_events)
|
||||
return TRUE;
|
||||
|
||||
|
@ -101,6 +101,8 @@ struct _GdkDisplay
|
||||
GdkKeyboardGrabInfo GSEAL (keyboard_grab);
|
||||
GdkPointerWindowInfo GSEAL (pointer_info);
|
||||
|
||||
GHashTable *GSEAL (touch_grabs);
|
||||
|
||||
/* Last reported event time from server */
|
||||
guint32 GSEAL (last_event_time);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user