[gtk+] popover: Add helper functions around setting up an scrollable



commit 588a1dce2b1fb97acb8304799a7711fa62d0a2aa
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Sep 28 19:53:10 2016 +0200

    popover: Add helper functions around setting up an scrollable
    
    gtk_popover_set_scrollable_full() takes care of the signal connected
    on the scrollable itself, in addition to the adjustment signals the
    popover listens to.
    
    gtk_popover_update_scrollable() looks up the current relative-to
    widget hierarchy and updates the current scrollable.
    
    The places where the scrollable is being maintained have been updated
    to use these functions.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=771812

 gtk/gtkpopover.c |   57 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 40 insertions(+), 17 deletions(-)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index f0579a1..94da422 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -196,6 +196,9 @@ static void gtk_popover_invalidate_borders (GtkPopover *popover);
 static void gtk_popover_apply_modality     (GtkPopover *popover,
                                             gboolean    modal);
 
+static void gtk_popover_set_scrollable_full (GtkPopover    *popover,
+                                             GtkScrollable *scrollable);
+
 G_DEFINE_TYPE_WITH_PRIVATE (GtkPopover, gtk_popover, GTK_TYPE_BIN)
 
 static void
@@ -1787,6 +1790,17 @@ gtk_popover_class_init (GtkPopoverClass *klass)
 }
 
 static void
+gtk_popover_update_scrollable (GtkPopover *popover)
+{
+  GtkPopoverPrivate *priv = popover->priv;
+  GtkScrollable *scrollable;
+
+  scrollable = GTK_SCROLLABLE (gtk_widget_get_ancestor (priv->widget,
+                                                        GTK_TYPE_SCROLLABLE));
+  gtk_popover_set_scrollable_full (popover, scrollable);
+}
+
+static void
 _gtk_popover_parent_hierarchy_changed (GtkWidget  *widget,
                                        GtkWidget  *previous_toplevel,
                                        GtkPopover *popover)
@@ -2001,11 +2015,33 @@ scrollable_notify_cb (GObject    *object,
 }
 
 static void
+gtk_popover_set_scrollable_full (GtkPopover    *popover,
+                                 GtkScrollable *scrollable)
+{
+  GtkPopoverPrivate *priv = popover->priv;
+
+  if (priv->scrollable_notify_id != 0 &&
+      g_signal_handler_is_connected (priv->parent_scrollable, priv->scrollable_notify_id))
+    {
+      g_signal_handler_disconnect (priv->parent_scrollable, priv->scrollable_notify_id);
+      priv->scrollable_notify_id = 0;
+    }
+
+  _gtk_popover_set_scrollable (popover, scrollable);
+
+  if (scrollable)
+    {
+      priv->scrollable_notify_id =
+        g_signal_connect (priv->parent_scrollable, "notify",
+                          G_CALLBACK (scrollable_notify_cb), popover);
+    }
+}
+
+static void
 gtk_popover_update_relative_to (GtkPopover *popover,
                                 GtkWidget  *relative_to)
 {
   GtkPopoverPrivate *priv = popover->priv;
-  GtkScrollable *scrollable = NULL;
 
   if (priv->widget == relative_to)
     return;
@@ -2037,11 +2073,7 @@ gtk_popover_update_relative_to (GtkPopover *popover,
     }
 
   if (priv->parent_scrollable)
-    {
-      if (g_signal_handler_is_connected (priv->parent_scrollable, priv->scrollable_notify_id))
-        g_signal_handler_disconnect (priv->parent_scrollable, priv->scrollable_notify_id);
-      _gtk_popover_set_scrollable (popover, NULL);
-    }
+    gtk_popover_set_scrollable_full (popover, NULL);
 
   priv->widget = relative_to;
   g_object_notify_by_pspec (G_OBJECT (popover), properties[PROP_RELATIVE_TO]);
@@ -2079,17 +2111,8 @@ gtk_popover_update_relative_to (GtkPopover *popover,
   if (priv->window)
     _gtk_window_add_popover (priv->window, GTK_WIDGET (popover), priv->widget, TRUE);
 
-  if (relative_to)
-    scrollable = GTK_SCROLLABLE (gtk_widget_get_ancestor (priv->widget, GTK_TYPE_SCROLLABLE));
-
-  if (scrollable)
-    {
-      _gtk_popover_set_scrollable (popover, scrollable);
-
-      priv->scrollable_notify_id =
-        g_signal_connect (priv->parent_scrollable, "notify",
-                          G_CALLBACK (scrollable_notify_cb), popover);
-    }
+  if (priv->widget)
+    gtk_popover_update_scrollable (popover);
 
   _gtk_widget_update_parent_muxer (GTK_WIDGET (popover));
   g_object_unref (popover);


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