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