Fix 'mono' package typo
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0016-gtk-correctly-handle-toggling-of-the-scrollbar-visib.patch
1 From 8d10b09aff0bc03c54c2f1899900cc062f36ad4b Mon Sep 17 00:00:00 2001
2 From: Michael Natterer <mitch@gimp.org>
3 Date: Thu, 16 Aug 2012 09:35:53 +0200
4 Subject: [PATCH 16/68] gtk: correctly handle toggling of the scrollbar
5  visibility setting
6
7 By doing most things unconditionally, like connecting to signals
8 and creating the opacity adjustment. Queue a resize when the
9 setting changes so things get recalculated properly, and make
10 sure the scrollbars get expose events if they are visible.
11 Unrelated: don't leak the priv->opacity adjustment.
12 ---
13  gtk/gtkscrolledwindow.c |  244 +++++++++++++++++++++++------------------------
14  1 file changed, 119 insertions(+), 125 deletions(-)
15
16 diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
17 index 3220e91..7680f5d 100644
18 --- a/gtk/gtkscrolledwindow.c
19 +++ b/gtk/gtkscrolledwindow.c
20 @@ -529,29 +529,25 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
21                      G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed),
22                      scrolled_window);
23
24 -  if (g_getenv ("GTK2_KINETIC_SCROLLING"))
25 -    {
26 -      gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE);
27 -      gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE);
28 -    }
29 -
30 -  if (priv->overlay_scrollbars)
31 -    {
32 -      priv->opacity = g_object_new (GTK_TYPE_ADJUSTMENT,
33 -                                    "lower", 0.0,
34 -                                    "upper", 0.5,
35 -                                    "value", 0.0,
36 -                                    NULL);
37 -      priv->sb_min_height = 20;
38 -      priv->sb_padding = 2;
39 -      priv->sb_radius = 3;
40 -      priv->sb_width = 6;
41 -      priv->sb_fade_out_delay = 1000;
42 -
43 -      g_signal_connect (priv->opacity, "value-changed",
44 -                        G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
45 -                        scrolled_window);
46 -    }
47 +  gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE);
48 +  gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE);
49 +
50 +  priv->opacity = g_object_new (GTK_TYPE_ADJUSTMENT,
51 +                                "lower", 0.0,
52 +                                "upper", 0.5,
53 +                                "value", 0.0,
54 +                                NULL);
55 +  g_object_ref_sink (priv->opacity);
56 +
57 +  priv->sb_min_height = 20;
58 +  priv->sb_padding = 2;
59 +  priv->sb_radius = 3;
60 +  priv->sb_width = 6;
61 +  priv->sb_fade_out_delay = 1000;
62 +
63 +  g_signal_connect (priv->opacity, "value-changed",
64 +                    G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
65 +                    scrolled_window);
66  }
67
68  /**
69 @@ -632,16 +628,12 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
70        g_signal_handlers_disconnect_by_func (old_adjustment,
71                                             gtk_scrolled_window_adjustment_changed,
72                                             scrolled_window);
73 -
74 -      if (priv->overlay_scrollbars)
75 -        {
76 -          g_signal_handlers_disconnect_by_func (old_adjustment,
77 -                                                gtk_scrolled_window_adjustment_value_changed,
78 -                                                scrolled_window);
79 -          g_signal_handlers_disconnect_by_func (old_adjustment,
80 -                                                gtk_scrolled_window_expose_scrollbars,
81 -                                                scrolled_window);
82 -        }
83 +      g_signal_handlers_disconnect_by_func (old_adjustment,
84 +                                            gtk_scrolled_window_adjustment_value_changed,
85 +                                            scrolled_window);
86 +      g_signal_handlers_disconnect_by_func (old_adjustment,
87 +                                            gtk_scrolled_window_expose_scrollbars,
88 +                                            scrolled_window);
89
90        gtk_range_set_adjustment (GTK_RANGE (scrolled_window->hscrollbar),
91                                 hadjustment);
92 @@ -658,19 +650,18 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
93    gtk_scrolled_window_adjustment_changed (hadjustment, scrolled_window);
94    gtk_scrolled_window_adjustment_value_changed (hadjustment, scrolled_window);
95
96 -  if (priv->overlay_scrollbars)
97 -    {
98 -      g_signal_connect (hadjustment, "value-changed",
99 -                        G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
100 -                        scrolled_window);
101 +#if 0
102 +  g_signal_connect (hadjustment, "value-changed",
103 +                    G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
104 +                    scrolled_window);
105 +#endif
106
107 -      g_signal_connect (hadjustment, "changed",
108 -                        G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
109 -                        scrolled_window);
110 -      g_signal_connect (hadjustment, "value-changed",
111 -                        G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
112 -                        scrolled_window);
113 -    }
114 +  g_signal_connect (hadjustment, "changed",
115 +                    G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
116 +                    scrolled_window);
117 +  g_signal_connect (hadjustment, "value-changed",
118 +                    G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
119 +                    scrolled_window);
120
121    if (bin->child)
122      gtk_widget_set_scroll_adjustments (bin->child,
123 @@ -725,16 +716,12 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
124        g_signal_handlers_disconnect_by_func (old_adjustment,
125                                             gtk_scrolled_window_adjustment_changed,
126                                             scrolled_window);
127 -
128 -      if (priv->overlay_scrollbars)
129 -        {
130 -          g_signal_handlers_disconnect_by_func (old_adjustment,
131 -                                                gtk_scrolled_window_adjustment_value_changed,
132 -                                                scrolled_window);
133 -          g_signal_handlers_disconnect_by_func (old_adjustment,
134 -                                                gtk_scrolled_window_expose_scrollbars,
135 -                                                scrolled_window);
136 -        }
137 +      g_signal_handlers_disconnect_by_func (old_adjustment,
138 +                                            gtk_scrolled_window_adjustment_value_changed,
139 +                                            scrolled_window);
140 +      g_signal_handlers_disconnect_by_func (old_adjustment,
141 +                                            gtk_scrolled_window_expose_scrollbars,
142 +                                            scrolled_window);
143
144        gtk_range_set_adjustment (GTK_RANGE (scrolled_window->vscrollbar),
145                                 vadjustment);
146 @@ -751,20 +738,19 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
147    gtk_scrolled_window_adjustment_changed (vadjustment, scrolled_window);
148    gtk_scrolled_window_adjustment_value_changed (vadjustment, scrolled_window);
149
150 -  if (priv->overlay_scrollbars)
151 -    {
152 -      g_signal_connect (vadjustment,
153 -                        "value-changed",
154 -                        G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
155 -                        scrolled_window);
156 +#if 0
157 +  g_signal_connect (vadjustment,
158 +                    "value-changed",
159 +                    G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
160 +                    scrolled_window);
161 +#endif
162
163 -      g_signal_connect (vadjustment, "changed",
164 -                        G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
165 -                        scrolled_window);
166 -      g_signal_connect (vadjustment, "value-changed",
167 -                        G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
168 -                        scrolled_window);
169 -    }
170 +  g_signal_connect (vadjustment, "changed",
171 +                    G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
172 +                    scrolled_window);
173 +  g_signal_connect (vadjustment, "value-changed",
174 +                    G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
175 +                    scrolled_window);
176
177    if (bin->child)
178      gtk_widget_set_scroll_adjustments (bin->child,
179 @@ -1224,16 +1210,12 @@ gtk_scrolled_window_destroy (GtkObject *object)
180        g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
181                                             gtk_scrolled_window_adjustment_changed,
182                                             scrolled_window);
183 -
184 -      if (priv->overlay_scrollbars)
185 -        {
186 -          g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
187 -                                                gtk_scrolled_window_adjustment_value_changed,
188 -                                                scrolled_window);
189 -          g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
190 -                                                gtk_scrolled_window_expose_scrollbars,
191 -                                                scrolled_window);
192 -        }
193 +      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
194 +                                            gtk_scrolled_window_adjustment_value_changed,
195 +                                            scrolled_window);
196 +      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
197 +                                            gtk_scrolled_window_expose_scrollbars,
198 +                                            scrolled_window);
199
200        gtk_widget_unparent (scrolled_window->hscrollbar);
201        gtk_widget_destroy (scrolled_window->hscrollbar);
202 @@ -1245,16 +1227,12 @@ gtk_scrolled_window_destroy (GtkObject *object)
203        g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
204                                             gtk_scrolled_window_adjustment_changed,
205                                             scrolled_window);
206 -
207 -      if (priv->overlay_scrollbars)
208 -        {
209 -          g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
210 -                                                gtk_scrolled_window_adjustment_value_changed,
211 -                                                scrolled_window);
212 -          g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
213 -                                                gtk_scrolled_window_expose_scrollbars,
214 -                                                scrolled_window);
215 -        }
216 +      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
217 +                                            gtk_scrolled_window_adjustment_value_changed,
218 +                                            scrolled_window);
219 +      g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
220 +                                            gtk_scrolled_window_expose_scrollbars,
221 +                                            scrolled_window);
222
223        gtk_widget_unparent (scrolled_window->vscrollbar);
224        gtk_widget_destroy (scrolled_window->vscrollbar);
225 @@ -1283,6 +1261,12 @@ gtk_scrolled_window_destroy (GtkObject *object)
226        priv->button_press_event = NULL;
227      }
228
229 +  if (priv->opacity)
230 +    {
231 +      g_object_unref (priv->opacity);
232 +      priv->opacity = NULL;
233 +    }
234 +
235    GTK_OBJECT_CLASS (gtk_scrolled_window_parent_class)->destroy (object);
236  }
237
238 @@ -1482,11 +1466,23 @@ static gboolean
239  gtk_scrolled_window_expose (GtkWidget      *widget,
240                             GdkEventExpose *event)
241  {
242 +  GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
243    GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (widget);
244
245    if (gtk_widget_is_drawable (widget))
246      {
247 -      if (event->window == priv->overshoot_window)
248 +      GdkWindow *hscrollbar_window = NULL;
249 +      GdkWindow *vscrollbar_window = NULL;
250 +
251 +      if (scrolled_window->hscrollbar)
252 +        hscrollbar_window = gtk_widget_get_window (scrolled_window->hscrollbar);
253 +
254 +      if (scrolled_window->vscrollbar)
255 +        vscrollbar_window = gtk_widget_get_window (scrolled_window->vscrollbar);
256 +
257 +      if (event->window == priv->overshoot_window ||
258 +          event->window == hscrollbar_window ||
259 +          event->window == vscrollbar_window)
260          GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->expose_event (widget, event);
261        else
262          gtk_scrolled_window_paint (widget, &event->area);
263 @@ -1935,8 +1931,7 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
264    priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
265    bin = GTK_BIN (scrolled_window);
266
267 -  if (priv->overlay_scrollbars)
268 -    gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window);
269 +  gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window);
270
271    scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window);
272    gtk_widget_style_get (widget, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL);
273 @@ -3108,12 +3103,9 @@ gtk_scrolled_window_add (GtkContainer *container,
274      g_warning ("gtk_scrolled_window_add(): cannot add non scrollable widget "
275                "use gtk_scrolled_window_add_with_viewport() instead");
276
277 -  if (priv->overlay_scrollbars)
278 -    {
279 -      g_signal_connect_after (child, "expose-event",
280 -                              G_CALLBACK (gtk_scrolled_window_child_expose),
281 -                              container);
282 -    }
283 +  g_signal_connect_after (child, "expose-event",
284 +                          G_CALLBACK (gtk_scrolled_window_child_expose),
285 +                          container);
286  }
287
288  static void
289 @@ -3128,12 +3120,9 @@ gtk_scrolled_window_remove (GtkContainer *container,
290
291    priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (container);
292
293 -  if (priv->overlay_scrollbars)
294 -    {
295 -      g_signal_handlers_disconnect_by_func (child,
296 -                                            gtk_scrolled_window_child_expose,
297 -                                            container);
298 -    }
299 +  g_signal_handlers_disconnect_by_func (child,
300 +                                        gtk_scrolled_window_child_expose,
301 +                                        container);
302
303    gtk_widget_set_scroll_adjustments (child, NULL, NULL);
304
305 @@ -3624,6 +3613,9 @@ gtk_scrolled_window_child_expose (GtkWidget         *widget,
306     GdkRectangle hslider_rect;
307     cairo_t   *cr;
308
309 +   if (!priv->overlay_scrollbars)
310 +     return FALSE;
311 +
312     cr = gdk_cairo_create (eevent->window);
313     gdk_cairo_region (cr, eevent->region);
314     cairo_clip (cr);
315 @@ -3769,27 +3761,32 @@ static void
316  gtk_scrolled_window_expose_scrollbars (GtkAdjustment     *adj,
317                                         GtkScrolledWindow *scrolled_window)
318  {
319 -  GtkWidget *child = gtk_bin_get_child (GTK_BIN (scrolled_window));
320 +  GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
321
322 -  if (child && gtk_widget_get_visible (child))
323 +  if (priv->overlay_scrollbars)
324      {
325 -      GtkAllocation alloc;
326 -
327 -      gtk_widget_get_allocation (child, &alloc);
328 -
329 -      if (scrolled_window->vscrollbar)
330 -        gtk_widget_queue_draw_area (child,
331 -                                    alloc.width - 20,
332 -                                    0,
333 -                                    20,
334 -                                    alloc.height);
335 +      GtkWidget *child = gtk_bin_get_child (GTK_BIN (scrolled_window));
336
337 -      if (scrolled_window->hscrollbar)
338 -        gtk_widget_queue_draw_area (child,
339 -                                    0,
340 -                                    alloc.height - 20,
341 -                                    alloc.width,
342 -                                    20);
343 +      if (child && gtk_widget_get_visible (child))
344 +        {
345 +          GtkAllocation alloc;
346 +
347 +          gtk_widget_get_allocation (child, &alloc);
348 +
349 +          if (scrolled_window->vscrollbar)
350 +            gtk_widget_queue_draw_area (child,
351 +                                        alloc.width - 20,
352 +                                        0,
353 +                                        20,
354 +                                        alloc.height);
355 +
356 +          if (scrolled_window->hscrollbar)
357 +            gtk_widget_queue_draw_area (child,
358 +                                        0,
359 +                                        alloc.height - 20,
360 +                                        alloc.width,
361 +                                        20);
362 +        }
363      }
364  }
365
366 @@ -3798,17 +3795,14 @@ gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings,
367                                                  GParamSpec  *arg,
368                                                  gpointer     user_data)
369  {
370 -  GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (user_data);
371    GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (user_data);
372
373 -  /* FIXME: tear down/set up things to make the switch */
374 -
375    g_object_get (settings,
376                  "gtk-enable-overlay-scrollbars",
377                  &priv->overlay_scrollbars,
378                  NULL);
379
380 -  g_print ("enable-overlay-scrollbar is now: %d\n", priv->overlay_scrollbars);
381 +  gtk_widget_queue_resize (user_data);
382  }
383
384  #define __GTK_SCROLLED_WINDOW_C__
385 --
386 1.7.10.2 (Apple Git-33)