[gtk+/wip/carlosg/event-delivery: 20/104] gtk: Implement per-focus implicit grabs
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/carlosg/event-delivery: 20/104] gtk: Implement per-focus implicit grabs
- Date: Thu, 25 May 2017 14:41:47 +0000 (UTC)
commit 3dfab962fa709193f9ca9ad8247b7feb9bb1e39b
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Mar 31 17:55:49 2017 +0200
gtk: Implement per-focus implicit grabs
Unlike GTK+ grabs which are global to all/one device, the implicit grab
is per focus, which means each may have implicit grabs on different or
the same widget.
gtk/gtkmain.c | 10 ++++++++++
gtk/gtkwindow.c | 13 +++++++++++++
gtk/gtkwindowprivate.h | 4 ++++
3 files changed, 27 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 8114ea8..80272b3 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1505,6 +1505,9 @@ handle_pointing_event (GdkEvent *event)
if (event->type == GDK_MOTION_NOTIFY || event->type == GDK_ENTER_NOTIFY)
update_cursor (toplevel, device, target);
+ if (event->type == GDK_TOUCH_BEGIN)
+ gtk_window_set_pointer_focus_grab (toplevel, device, sequence, target);
+
/* Let it take the effective pointer focus anyway, as it may change due
* to implicit grabs.
*/
@@ -1512,6 +1515,13 @@ handle_pointing_event (GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
+ target = gtk_window_lookup_effective_pointer_focus_widget (toplevel,
+ device,
+ sequence);
+ gtk_window_set_pointer_focus_grab (toplevel, device, sequence,
+ event->type == GDK_BUTTON_PRESS ?
+ target : NULL);
+ break;
case GDK_SCROLL:
case GDK_TOUCHPAD_PINCH:
case GDK_TOUCHPAD_SWIPE:
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 56082ca..9e8221e 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -11484,3 +11484,16 @@ gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
}
}
}
+
+void
+gtk_window_set_pointer_focus_grab (GtkWindow *window,
+ GdkDevice *device,
+ GdkEventSequence *sequence,
+ GtkWidget *grab_widget)
+{
+ GtkPointerFocus *focus;
+
+ focus = gtk_window_lookup_pointer_focus (window, device, sequence);
+ g_assert (focus != NULL);
+ gtk_pointer_focus_set_implicit_grab (focus, grab_widget);
+}
diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h
index 7f62cc7..7d8d189 100644
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -153,6 +153,10 @@ void gtk_window_update_pointer_focus (GtkWindow *window,
GtkWidget *target,
gdouble x,
gdouble y);
+void gtk_window_set_pointer_focus_grab (GtkWindow *window,
+ GdkDevice *device,
+ GdkEventSequence *sequence,
+ GtkWidget *grab_widget);
void gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
GtkWidget *widget);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]