diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 8114ea8a17..80272b3b87 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 56082ca74a..9e8221e7ff 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 7f62cc7f38..7d8d18965d 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);