1From 133655d890a4513783e4cb13e25770a84d5c41d8 Mon Sep 17 00:00:00 2001
2From: Michael Natterer <mitch@gimp.org>
3Date: Fri, 2 Nov 2012 16:02:32 +0100
4Subject: [PATCH 28/68] gtk: don't show the olverlay scrollbars if only the
5 size of the content changes
6
7This commit also optimizes away many signal connections and thus
8double and triple updates.
9---
10 gtk/gtkscrolledwindow.c |   57 ++++++++++++++++++++---------------------------
11 1 file changed, 24 insertions(+), 33 deletions(-)
12
13diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
14index a04436b..7f56793 100644
15--- a/gtk/gtkscrolledwindow.c
16+++ b/gtk/gtkscrolledwindow.c
17@@ -626,9 +626,6 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
18       g_signal_handlers_disconnect_by_func (old_adjustment,
19                                             gtk_scrolled_window_adjustment_value_changed,
20                                             scrolled_window);
21-      g_signal_handlers_disconnect_by_func (old_adjustment,
22-                                            gtk_scrolled_window_update_scrollbars,
23-                                            scrolled_window);
24
25       gtk_range_set_adjustment (GTK_RANGE (scrolled_window->hscrollbar),
26				hadjustment);
27@@ -645,13 +642,6 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
28   gtk_scrolled_window_adjustment_changed (hadjustment, scrolled_window);
29   gtk_scrolled_window_adjustment_value_changed (hadjustment, scrolled_window);
30
31-  g_signal_connect_swapped (hadjustment, "changed",
32-                            G_CALLBACK (gtk_scrolled_window_update_scrollbars),
33-                            scrolled_window);
34-  g_signal_connect_swapped (hadjustment, "value-changed",
35-                            G_CALLBACK (gtk_scrolled_window_update_scrollbars),
36-                            scrolled_window);
37-
38   if (bin->child)
39     gtk_widget_set_scroll_adjustments (bin->child,
40                                        gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
41@@ -708,9 +698,6 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
42       g_signal_handlers_disconnect_by_func (old_adjustment,
43                                             gtk_scrolled_window_adjustment_value_changed,
44                                             scrolled_window);
45-      g_signal_handlers_disconnect_by_func (old_adjustment,
46-                                            gtk_scrolled_window_update_scrollbars,
47-                                            scrolled_window);
48
49       gtk_range_set_adjustment (GTK_RANGE (scrolled_window->vscrollbar),
50				vadjustment);
51@@ -727,13 +714,6 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
52   gtk_scrolled_window_adjustment_changed (vadjustment, scrolled_window);
53   gtk_scrolled_window_adjustment_value_changed (vadjustment, scrolled_window);
54
55-  g_signal_connect_swapped (vadjustment, "changed",
56-                            G_CALLBACK (gtk_scrolled_window_update_scrollbars),
57-                            scrolled_window);
58-  g_signal_connect_swapped (vadjustment, "value-changed",
59-                            G_CALLBACK (gtk_scrolled_window_update_scrollbars),
60-                            scrolled_window);
61-
62   if (bin->child)
63     gtk_widget_set_scroll_adjustments (bin->child,
64                                        gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
65@@ -1071,9 +1051,6 @@ gtk_scrolled_window_destroy (GtkObject *object)
66       g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
67                                             gtk_scrolled_window_adjustment_value_changed,
68                                             scrolled_window);
69-      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
70-                                            gtk_scrolled_window_update_scrollbars,
71-                                            scrolled_window);
72
73       gtk_widget_unparent (scrolled_window->hscrollbar);
74       gtk_widget_destroy (scrolled_window->hscrollbar);
75@@ -1088,9 +1065,6 @@ gtk_scrolled_window_destroy (GtkObject *object)
76       g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
77                                             gtk_scrolled_window_adjustment_value_changed,
78                                             scrolled_window);
79-      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
80-                                            gtk_scrolled_window_update_scrollbars,
81-                                            scrolled_window);
82
83       gtk_widget_unparent (scrolled_window->vscrollbar);
84       gtk_widget_destroy (scrolled_window->vscrollbar);
85@@ -1805,7 +1779,8 @@ _gtk_scrolled_window_get_overshoot (GtkScrolledWindow *scrolled_window,
86 }
87
88 static void
89-_gtk_scrolled_window_allocate_overshoot_window (GtkScrolledWindow *scrolled_window)
90+_gtk_scrolled_window_allocate_overshoot_window (GtkScrolledWindow *scrolled_window,
91+                                                gboolean           update_scrollbars)
92 {
93   GtkAllocation window_allocation, relative_allocation, allocation;
94   GtkScrolledWindowPrivate *priv;
95@@ -1880,7 +1855,7 @@ _gtk_scrolled_window_allocate_overshoot_window (GtkScrolledWindow *scrolled_wind
96   else
97     gdk_window_hide (priv->hbackground_window);
98
99-  if (priv->overlay_scrollbars)
100+  if (priv->overlay_scrollbars && update_scrollbars)
101     {
102       gtk_scrolled_window_start_fade_in_animation (scrolled_window);
103       gtk_scrolled_window_update_scrollbars (scrolled_window);
104@@ -1948,12 +1923,15 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
105   GtkBin *bin;
106   GtkAllocation relative_allocation;
107   GtkAllocation child_allocation;
108+  GtkAllocation old_allocation;
109   gboolean scrollbars_within_bevel;
110   gint scrollbar_spacing;
111
112   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
113   g_return_if_fail (allocation != NULL);
114
115+  old_allocation = widget->allocation;
116+
117   scrolled_window = GTK_SCROLLED_WINDOW (widget);
118   priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
119   bin = GTK_BIN (scrolled_window);
120@@ -2117,7 +2095,12 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
121   else if (gtk_widget_get_visible (scrolled_window->vscrollbar))
122     gtk_widget_hide (scrolled_window->vscrollbar);
123
124-  _gtk_scrolled_window_allocate_overshoot_window (scrolled_window);
125+  /* need to update the overlay scrollbars only if the allocation has
126+   * actually changed, not if only the content changed
127+   */
128+  _gtk_scrolled_window_allocate_overshoot_window (scrolled_window,
129+                                                  allocation->x != old_allocation.x ||
130+                                                  allocation->y != old_allocation.y);
131 }
132
133 static gboolean
134@@ -2280,7 +2263,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
135
136       if (old_overshoot_x != new_overshoot_x ||
137           old_overshoot_y != new_overshoot_y)
138-        _gtk_scrolled_window_allocate_overshoot_window (scrolled_window);
139+        _gtk_scrolled_window_allocate_overshoot_window (scrolled_window, TRUE);
140
141       /* In two cases we want to start snapping back:
142        *  1) The view is overshot and the gesture has ended.
143@@ -2480,7 +2463,7 @@ scrolled_window_snap_back_cb (gpointer user_data)
144
145   if (old_overshoot_x != overshoot_x ||
146       old_overshoot_y != overshoot_y)
147-    _gtk_scrolled_window_allocate_overshoot_window (scrolled_window);
148+    _gtk_scrolled_window_allocate_overshoot_window (scrolled_window, TRUE);
149
150   if (overshoot_x != 0 || overshoot_y != 0)
151     return TRUE;
152@@ -2960,7 +2943,12 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
153     }
154
155   if (priv->overlay_scrollbars)
156-    gtk_scrolled_window_start_fade_in_animation (scrolled_win);
157+    {
158+      /* dont't fade in if the extent of the content changes, but update
159+       * the scrollbar's dimensions anyway.
160+       */
161+      gtk_scrolled_window_update_scrollbars (scrolled_win);
162+    }
163 }
164
165 static void
166@@ -2983,7 +2971,10 @@ gtk_scrolled_window_adjustment_value_changed (GtkAdjustment *adjustment,
167     priv->unclamped_hadj_value = gtk_adjustment_get_value (adjustment);
168
169   if (priv->overlay_scrollbars)
170-    gtk_scrolled_window_start_fade_in_animation (scrolled_window);
171+    {
172+      gtk_scrolled_window_start_fade_in_animation (scrolled_window);
173+      gtk_scrolled_window_update_scrollbars (scrolled_window);
174+    }
175 }
176
177 static void
178--
1791.7.10.2 (Apple Git-33)
180