[gtk/wip/dboles/scrolledwindow-deduplicate-set-hvadjustment] ScrolledWindow: Don't duplicate set_vhadjustment()



commit 1a51d8c3de9e8b97966854c06ef048921602180c
Author: Daniel Boles <dboles src gmail com>
Date:   Tue May 21 21:12:48 2019 +0100

    ScrolledWindow: Don't duplicate set_vhadjustment()
    
    copy and paste... not even once...

 gtk/gtkscrolledwindow.c | 153 +++++++++++++++++++-----------------------------
 1 file changed, 61 insertions(+), 92 deletions(-)
---
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 1a87169b71..d85e3601d9 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -2029,78 +2029,102 @@ gtk_scrolled_window_new (GtkAdjustment *hadjustment,
   return scrolled_window;
 }
 
-/**
- * gtk_scrolled_window_set_hadjustment:
- * @scrolled_window: a #GtkScrolledWindow
- * @hadjustment: (nullable): the #GtkAdjustment to use, or %NULL to create a new one
- *
- * Sets the #GtkAdjustment for the horizontal scrollbar.
- */
-void
-gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
-                                     GtkAdjustment     *hadjustment)
+typedef void (*WidgetInsertFunc)(GtkWidget *, GtkWidget *, GtkWidget *);
+typedef void (*ScrollableSetAdjustmentFunc)(GtkScrollable *, GtkAdjustment *);
+
+static void
+gtk_scrolled_window_set_adjustment (GtkScrolledWindow            *scrolled_window,
+                                    GtkAdjustment                *adjustment,
+                                    GtkOrientation                orientation,
+                                    GtkWidget                   **scrollbar,
+                                    guint                         prop_id,
+                                    ScrollableSetAdjustmentFunc   scrollable_set_adjustment,
+                                    WidgetInsertFunc              widget_insert,
+                                    GtkWidget                    *other_scrollbar)
 {
-  GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
   GtkBin *bin;
   GtkWidget *child;
 
   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
 
-  if (hadjustment)
-    g_return_if_fail (GTK_IS_ADJUSTMENT (hadjustment));
+  if (adjustment)
+    g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
   else
-    hadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
+    adjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
 
   bin = GTK_BIN (scrolled_window);
 
-  if (!priv->hscrollbar)
+  if (!*scrollbar)
     {
-      priv->hscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
+      *scrollbar = gtk_scrollbar_new (orientation, adjustment);
 
-      gtk_widget_insert_before (priv->hscrollbar, GTK_WIDGET (scrolled_window), priv->vscrollbar);
+      widget_insert (*scrollbar, GTK_WIDGET (scrolled_window), other_scrollbar);
       update_scrollbar_positions (scrolled_window);
     }
   else
     {
       GtkAdjustment *old_adjustment;
 
-      old_adjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar));
-      if (old_adjustment == hadjustment)
-       return;
+      old_adjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (*scrollbar));
+
+      if (old_adjustment == adjustment)
+        return;
 
       g_signal_handlers_disconnect_by_func (old_adjustment,
                                             gtk_scrolled_window_adjustment_changed,
                                             scrolled_window);
+
       g_signal_handlers_disconnect_by_func (old_adjustment,
                                             gtk_scrolled_window_adjustment_value_changed,
                                             scrolled_window);
 
       gtk_adjustment_enable_animation (old_adjustment, NULL, 0);
-      gtk_scrollbar_set_adjustment (GTK_SCROLLBAR (priv->hscrollbar), hadjustment);
+      gtk_scrollbar_set_adjustment (GTK_SCROLLBAR (*scrollbar), adjustment);
     }
 
-  hadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar));
+  adjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (*scrollbar));
 
-  g_signal_connect (hadjustment,
+  g_signal_connect (adjustment,
                     "changed",
-                   G_CALLBACK (gtk_scrolled_window_adjustment_changed),
-                   scrolled_window);
-  g_signal_connect (hadjustment,
+                    G_CALLBACK (gtk_scrolled_window_adjustment_changed),
+                    scrolled_window);
+
+  g_signal_connect (adjustment,
                     "value-changed",
-                   G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
-                   scrolled_window);
+                    G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
+                    scrolled_window);
 
-  gtk_scrolled_window_adjustment_changed (hadjustment, scrolled_window);
-  gtk_scrolled_window_adjustment_value_changed (hadjustment, scrolled_window);
+  gtk_scrolled_window_adjustment_changed (adjustment, scrolled_window);
+  gtk_scrolled_window_adjustment_value_changed (adjustment, scrolled_window);
 
   child = gtk_bin_get_child (bin);
+
   if (child)
-    gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (child), hadjustment);
+    scrollable_set_adjustment (GTK_SCROLLABLE (child), adjustment);
 
   if (gtk_widget_should_animate (GTK_WIDGET (scrolled_window)))
-    gtk_adjustment_enable_animation (hadjustment, gtk_widget_get_frame_clock (GTK_WIDGET (scrolled_window)), 
ANIMATION_DURATION);
+    gtk_adjustment_enable_animation (adjustment, gtk_widget_get_frame_clock (GTK_WIDGET (scrolled_window)), 
ANIMATION_DURATION);
 
-  g_object_notify_by_pspec (G_OBJECT (scrolled_window), properties[PROP_HADJUSTMENT]);
+  g_object_notify_by_pspec (G_OBJECT (scrolled_window), properties[prop_id]);
+}
+
+/**
+ * gtk_scrolled_window_set_hadjustment:
+ * @scrolled_window: a #GtkScrolledWindow
+ * @hadjustment: (nullable): the #GtkAdjustment to use, or %NULL to create a new one
+ *
+ * Sets the #GtkAdjustment for the horizontal scrollbar.
+ */
+void
+gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
+                                     GtkAdjustment     *hadjustment)
+{
+  GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
+
+  gtk_scrolled_window_set_adjustment (scrolled_window, hadjustment,
+                                      GTK_ORIENTATION_HORIZONTAL, &priv->hscrollbar, PROP_HADJUSTMENT,
+                                      gtk_scrollable_set_hadjustment,
+                                      gtk_widget_insert_before, priv->vscrollbar);
 }
 
 /**
@@ -2115,66 +2139,11 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
                                      GtkAdjustment     *vadjustment)
 {
   GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
-  GtkBin *bin;
-  GtkWidget *child;
-
-  g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
-
-  if (vadjustment)
-    g_return_if_fail (GTK_IS_ADJUSTMENT (vadjustment));
-  else
-    vadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
-
-  bin = GTK_BIN (scrolled_window);
-
-  if (!priv->vscrollbar)
-    {
-      priv->vscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
-
-      gtk_widget_insert_after (priv->vscrollbar, GTK_WIDGET (scrolled_window), priv->hscrollbar);
-      update_scrollbar_positions (scrolled_window);
-    }
-  else
-    {
-      GtkAdjustment *old_adjustment;
-      
-      old_adjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar));
-      if (old_adjustment == vadjustment)
-       return;
-
-      g_signal_handlers_disconnect_by_func (old_adjustment,
-                                            gtk_scrolled_window_adjustment_changed,
-                                            scrolled_window);
-      g_signal_handlers_disconnect_by_func (old_adjustment,
-                                            gtk_scrolled_window_adjustment_value_changed,
-                                            scrolled_window);
-
-      gtk_adjustment_enable_animation (old_adjustment, NULL, 0);
-      gtk_scrollbar_set_adjustment (GTK_SCROLLBAR (priv->vscrollbar), vadjustment);
-    }
-
-  vadjustment = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar));
-
-  g_signal_connect (vadjustment,
-                    "changed",
-                   G_CALLBACK (gtk_scrolled_window_adjustment_changed),
-                   scrolled_window);
-  g_signal_connect (vadjustment,
-                    "value-changed",
-                   G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
-                   scrolled_window);
-
-  gtk_scrolled_window_adjustment_changed (vadjustment, scrolled_window);
-  gtk_scrolled_window_adjustment_value_changed (vadjustment, scrolled_window);
-
-  child = gtk_bin_get_child (bin);
-  if (child)
-    gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (child), vadjustment);
-
-  if (gtk_widget_should_animate (GTK_WIDGET (scrolled_window)))
-    gtk_adjustment_enable_animation (vadjustment, gtk_widget_get_frame_clock (GTK_WIDGET (scrolled_window)), 
ANIMATION_DURATION);
 
-  g_object_notify_by_pspec (G_OBJECT (scrolled_window), properties[PROP_VADJUSTMENT]);
+  gtk_scrolled_window_set_adjustment (scrolled_window, vadjustment,
+                                      GTK_ORIENTATION_VERTICAL, &priv->vscrollbar, PROP_VADJUSTMENT,
+                                      gtk_scrollable_set_vadjustment,
+                                      gtk_widget_insert_after, priv->hscrollbar);
 }
 
 /**


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