Fix 'mono' package typo
[mono-project.git] / bockbuild / mac-sdk / patches / gtk / 0016-gtk-correctly-handle-toggling-of-the-scrollbar-visib.patch
blobd53385ff48428c7ca8d54f2dacabbc593bd1bc3e
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
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(-)
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);
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 - }
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;
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);
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);
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;
63 + g_signal_connect (priv->opacity, "value-changed",
64 + G_CALLBACK (gtk_scrolled_window_expose_scrollbars),
65 + scrolled_window);
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);
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);
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);
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
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);
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);
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);
128 - if (priv->overlay_scrollbars)
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);
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);
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);
150 - if (priv->overlay_scrollbars)
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
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);
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);
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);
184 - if (priv->overlay_scrollbars)
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);
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);
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);
207 - if (priv->overlay_scrollbars)
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);
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);
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;
229 + if (priv->opacity)
231 + g_object_unref (priv->opacity);
232 + priv->opacity = NULL;
235 GTK_OBJECT_CLASS (gtk_scrolled_window_parent_class)->destroy (object);
238 @@ -1482,11 +1466,23 @@ static gboolean
239 gtk_scrolled_window_expose (GtkWidget *widget,
240 GdkEventExpose *event)
242 + GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
243 GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (widget);
245 if (gtk_widget_is_drawable (widget))
247 - if (event->window == priv->overshoot_window)
248 + GdkWindow *hscrollbar_window = NULL;
249 + GdkWindow *vscrollbar_window = NULL;
251 + if (scrolled_window->hscrollbar)
252 + hscrollbar_window = gtk_widget_get_window (scrolled_window->hscrollbar);
254 + if (scrolled_window->vscrollbar)
255 + vscrollbar_window = gtk_widget_get_window (scrolled_window->vscrollbar);
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);
267 - if (priv->overlay_scrollbars)
268 - gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window);
269 + gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window);
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");
277 - if (priv->overlay_scrollbars)
279 - g_signal_connect_after (child, "expose-event",
280 - G_CALLBACK (gtk_scrolled_window_child_expose),
281 - container);
283 + g_signal_connect_after (child, "expose-event",
284 + G_CALLBACK (gtk_scrolled_window_child_expose),
285 + container);
288 static void
289 @@ -3128,12 +3120,9 @@ gtk_scrolled_window_remove (GtkContainer *container,
291 priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (container);
293 - if (priv->overlay_scrollbars)
295 - g_signal_handlers_disconnect_by_func (child,
296 - gtk_scrolled_window_child_expose,
297 - container);
299 + g_signal_handlers_disconnect_by_func (child,
300 + gtk_scrolled_window_child_expose,
301 + container);
303 gtk_widget_set_scroll_adjustments (child, NULL, NULL);
305 @@ -3624,6 +3613,9 @@ gtk_scrolled_window_child_expose (GtkWidget *widget,
306 GdkRectangle hslider_rect;
307 cairo_t *cr;
309 + if (!priv->overlay_scrollbars)
310 + return FALSE;
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)
319 - GtkWidget *child = gtk_bin_get_child (GTK_BIN (scrolled_window));
320 + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
322 - if (child && gtk_widget_get_visible (child))
323 + if (priv->overlay_scrollbars)
325 - GtkAllocation alloc;
327 - gtk_widget_get_allocation (child, &alloc);
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));
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))
345 + GtkAllocation alloc;
347 + gtk_widget_get_allocation (child, &alloc);
349 + if (scrolled_window->vscrollbar)
350 + gtk_widget_queue_draw_area (child,
351 + alloc.width - 20,
352 + 0,
353 + 20,
354 + alloc.height);
356 + if (scrolled_window->hscrollbar)
357 + gtk_widget_queue_draw_area (child,
358 + 0,
359 + alloc.height - 20,
360 + alloc.width,
361 + 20);
366 @@ -3798,17 +3795,14 @@ gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings,
367 GParamSpec *arg,
368 gpointer user_data)
370 - GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (user_data);
371 GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (user_data);
373 - /* FIXME: tear down/set up things to make the switch */
375 g_object_get (settings,
376 "gtk-enable-overlay-scrollbars",
377 &priv->overlay_scrollbars,
378 NULL);
380 - g_print ("enable-overlay-scrollbar is now: %d\n", priv->overlay_scrollbars);
381 + gtk_widget_queue_resize (user_data);
384 #define __GTK_SCROLLED_WINDOW_C__
386 1.7.10.2 (Apple Git-33)