[gtk+] box: follow children visibility when building the sibling path



commit ef153a5fffb3986f53992bcb45936b3a19f242d7
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Thu Jun 30 16:19:57 2011 -0400

    box: follow children visibility when building the sibling path
    
    This fixes nth-child not working for widgets which were not
    visible before being added to the box, but it's also a better fix
    for https://bugzilla.gnome.org/show_bug.cgi?id=652769

 gtk/gtkbox.c |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c
index f97a80d..ecf7bb1 100644
--- a/gtk/gtkbox.c
+++ b/gtk/gtkbox.c
@@ -847,11 +847,8 @@ count_widget_position (GtkWidget *widget,
 {
   CountingData *count = data;
 
-#if 0
-  /* We cannot reliably detect changes in widget visibility */
   if (!gtk_widget_get_visible (widget))
     return;
-#endif
 
   if (count->widget == widget)
     count->found = TRUE;
@@ -904,11 +901,9 @@ gtk_box_get_path_for_child (GtkContainer *container,
 
       for (list = children; list; list = list->next)
         {
-#if 0
-          /* We cannot reliably detect changes in widget visibility */
           if (!gtk_widget_get_visible (list->data))
-            return;
-#endif
+            continue;
+
           gtk_widget_path_append_for_widget (private->sibling_path, list->data);
         }
       g_list_free (children);
@@ -950,6 +945,16 @@ gtk_box_direction_changed (GtkWidget        *widget,
 }
 
 static void
+box_child_visibility_notify_cb (GObject *obj,
+                                GParamSpec *pspec,
+                                gpointer user_data)
+{
+  GtkBox *box = user_data;
+
+  gtk_box_invalidate_order (box);
+}
+
+static void
 gtk_box_pack (GtkBox      *box,
               GtkWidget   *child,
               gboolean     expand,
@@ -978,6 +983,9 @@ gtk_box_pack (GtkBox      *box,
   gtk_box_invalidate_order (box);
   gtk_widget_set_parent (child, GTK_WIDGET (box));
 
+  g_signal_connect (child, "notify::visible",
+                    G_CALLBACK (box_child_visibility_notify_cb), box);
+
   gtk_widget_child_notify (child, "expand");
   gtk_widget_child_notify (child, "fill");
   gtk_widget_child_notify (child, "padding");
@@ -1795,6 +1803,10 @@ gtk_box_remove (GtkContainer *container,
 	  was_visible = gtk_widget_get_visible (widget);
 	  gtk_widget_unparent (widget);
 
+          g_signal_handlers_disconnect_by_func (widget,
+                                                box_child_visibility_notify_cb,
+                                                box);
+
 	  priv->children = g_list_remove_link (priv->children, children);
 	  g_list_free (children);
 	  g_free (child);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]