26bd9e56cbbebb33bc4d7177ba5a4ead985db80b
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0028-gtk-don-t-show-the-olverlay-scrollbars-if-only-the-s.patch
1 From 133655d890a4513783e4cb13e25770a84d5c41d8 Mon Sep 17 00:00:00 2001
2 From: Michael Natterer <mitch@gimp.org>
3 Date: Fri, 2 Nov 2012 16:02:32 +0100
4 Subject: [PATCH 28/68] gtk: don't show the olverlay scrollbars if only the
5  size of the content changes
6
7 This commit also optimizes away many signal connections and thus
8 double and triple updates.
9 ---
10  gtk/gtkscrolledwindow.c |   57 ++++++++++++++++++++---------------------------
11  1 file changed, 24 insertions(+), 33 deletions(-)
12
13 diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
14 index 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 --
179 1.7.10.2 (Apple Git-33)