diff --git a/demos/gtk-demo/path_walk.ui b/demos/gtk-demo/path_walk.ui
index 352b81baa8..624842d09d 100644
--- a/demos/gtk-demo/path_walk.ui
+++ b/demos/gtk-demo/path_walk.ui
@@ -11,6 +11,8 @@
0
5000
500
+ 1
+ 10
diff --git a/gdk/wayland/gdkapplaunchcontext-wayland.c b/gdk/wayland/gdkapplaunchcontext-wayland.c
index 75742dd8e5..d6252b3e5a 100644
--- a/gdk/wayland/gdkapplaunchcontext-wayland.c
+++ b/gdk/wayland/gdkapplaunchcontext-wayland.c
@@ -46,6 +46,21 @@ static const struct xdg_activation_token_v1_listener token_listener = {
token_done,
};
+static struct wl_surface *
+peek_launcher_toplevel (GdkSeat *seat)
+{
+ struct wl_surface *wl_surface = NULL;
+ GdkSurface *focus_surface;
+
+ focus_surface = gdk_wayland_device_get_focus (gdk_seat_get_keyboard (seat));
+ while (focus_surface && focus_surface->parent)
+ focus_surface = focus_surface->parent;
+ if (focus_surface)
+ wl_surface = gdk_wayland_surface_get_wl_surface (focus_surface);
+
+ return wl_surface;
+}
+
static char *
gdk_wayland_app_launch_context_get_startup_notify_id (GAppLaunchContext *context,
GAppInfo *info,
@@ -62,7 +77,6 @@ gdk_wayland_app_launch_context_get_startup_notify_id (GAppLaunchContext *context
struct wl_event_queue *event_queue;
struct wl_surface *wl_surface = NULL;
GdkWaylandSeat *seat;
- GdkSurface *focus_surface;
AppLaunchData app_launch_data = { 0 };
event_queue = wl_display_create_queue (display->wl_display);
@@ -78,9 +92,7 @@ gdk_wayland_app_launch_context_get_startup_notify_id (GAppLaunchContext *context
_gdk_wayland_seat_get_last_implicit_grab_serial (seat, NULL),
gdk_wayland_seat_get_wl_seat (GDK_SEAT (seat)));
- focus_surface = gdk_wayland_device_get_focus (gdk_seat_get_keyboard (GDK_SEAT (seat)));
- if (focus_surface)
- wl_surface = gdk_wayland_surface_get_wl_surface (focus_surface);
+ wl_surface = peek_launcher_toplevel (GDK_SEAT (seat));
if (wl_surface)
xdg_activation_token_v1_set_surface (token, wl_surface);
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index e66f1320c7..1c5f27189b 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1191,11 +1191,6 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel,
for (widget = new_target; widget; widget = _gtk_widget_get_parent (widget))
gtk_widget_stack_append (&target_array, g_object_ref (widget));
- if (old_target && new_target)
- ancestor = gtk_widget_common_ancestor (old_target, new_target);
- else
- ancestor = NULL;
-
crossing.direction = GTK_CROSSING_IN;
seen_ancestor = FALSE;
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 5841265aac..891e38f162 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -6517,6 +6517,21 @@ gtk_window_update_pointer_focus (GtkWindow *window,
}
}
+static void
+clear_widget_active_state (GtkWidget *widget,
+ GtkWidget *topmost)
+{
+ GtkWidget *w = widget;
+
+ while (w)
+ {
+ gtk_widget_set_active_state (w, FALSE);
+ if (w == topmost)
+ break;
+ w = _gtk_widget_get_parent (w);
+ }
+}
+
void
gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
GtkWidget *widget)
@@ -6537,7 +6552,11 @@ gtk_window_update_pointer_focus_on_state_change (GtkWindow *window,
if (focus->grab_widget &&
(focus->grab_widget == widget ||
gtk_widget_is_ancestor (focus->grab_widget, widget)))
- gtk_pointer_focus_set_implicit_grab (focus, NULL);
+ {
+ clear_widget_active_state (focus->grab_widget, widget);
+ gtk_pointer_focus_set_implicit_grab (focus,
+ gtk_widget_get_parent (widget));
+ }
if (GTK_WIDGET (focus->toplevel) == widget)
{