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) {