From: Carlos Garnacho Date: Mon, 18 Sep 2023 17:40:05 +0000 (+0200) Subject: gtkwindow: Clear active state on sensitiveness changes X-Git-Tag: archive/raspbian/4.12.4+ds-3+rpi1^2~21^2~2^2~4 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ff0d7443ee1f24542e85a7d931aaa40df0b93057;p=gtk4.git gtkwindow: Clear active state on sensitiveness changes When altering the broken implicit grab due to sensitiveness changes, also ensure to clear the active state from the affected actors. This fixes unbalanced implicit active state accounting on the widgets going insensitive. Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/5529 --- diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index bac2a25b89..9c94d9726f 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,10 @@ 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, NULL); + } if (GTK_WIDGET (focus->toplevel) == widget) {