From a86d61e42d8fbf1f397cae2c9481d88f2b916cb0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 19 Jul 2015 22:08:36 -0400 Subject: [PATCH] GtkListBox: Listen for adjustment changes We automatically pick up an adjustment from our parent scrollable, but we failed to update it when it changes. This is happening in the places sidebar, and it was causing the focus-tracking to fail there, letting the focus move out of view. With this change, the focus remains visible. --- gtk/gtklistbox.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c index b9866d0cbc..d47308811b 100644 --- a/gtk/gtklistbox.c +++ b/gtk/gtklistbox.c @@ -922,8 +922,10 @@ gtk_list_box_set_adjustment (GtkListBox *box, GtkListBoxPrivate *priv = BOX_PRIV (box); g_return_if_fail (GTK_IS_LIST_BOX (box)); + g_return_if_fail (adjustment == NULL || GTK_IS_ADJUSTMENT (adjustment)); - g_object_ref_sink (adjustment); + if (adjustment) + g_object_ref_sink (adjustment); if (priv->adjustment) g_object_unref (priv->adjustment); priv->adjustment = adjustment; @@ -948,20 +950,37 @@ gtk_list_box_get_adjustment (GtkListBox *box) return BOX_PRIV (box)->adjustment; } +static void +adjustment_changed (GObject *object, + GParamSpec *pspec, + gpointer data) +{ + GtkAdjustment *adjustment; + + adjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (object)); + gtk_list_box_set_adjustment (GTK_LIST_BOX (data), adjustment); +} + static void gtk_list_box_parent_set (GtkWidget *widget, GtkWidget *prev_parent) { GtkWidget *parent; - GtkAdjustment *adjustment; parent = gtk_widget_get_parent (widget); + if (prev_parent && GTK_IS_SCROLLABLE (prev_parent)) + g_signal_handlers_disconnect_by_func (prev_parent, + G_CALLBACK (adjustment_changed), widget); + if (parent && GTK_IS_SCROLLABLE (parent)) { - adjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (parent)); - gtk_list_box_set_adjustment (GTK_LIST_BOX (widget), adjustment); + adjustment_changed (G_OBJECT (parent), NULL, widget); + g_signal_connect (parent, "notify::vadjustment", + G_CALLBACK (adjustment_changed), widget); } + else + gtk_list_box_set_adjustment (GTK_LIST_BOX (widget), NULL); } /**