06a2fc7c331b215c194b5c6bd2701df65a463960
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0015-Use-gtk-enable-overlay-scrollbars-in-GtkScrolledWind.patch
1 From eea6eef69858ff65ff8ccf46bb640bcc0580f592 Mon Sep 17 00:00:00 2001
2 From: Kristian Rietveld <kris@lanedo.com>
3 Date: Sun, 29 Jul 2012 16:14:09 +0200
4 Subject: [PATCH 15/68] Use gtk-enable-overlay-scrollbars in GtkScrolledWindow
5
6 And listen for changes to this setting.  Move overlay_scrollbars variable
7 to GtkScrolledWindowPrivate, because we are going to have to monitor for
8 each scrolled window whether it has transformed itself in response to the
9 signal.
10 ---
11  gtk/gtkscrolledwindow.c |   97 +++++++++++++++++++++++++++++++++++------------
12  1 file changed, 72 insertions(+), 25 deletions(-)
13
14 diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
15 index 70de6ec..3220e91 100644
16 --- a/gtk/gtkscrolledwindow.c
17 +++ b/gtk/gtkscrolledwindow.c
18 @@ -140,6 +140,8 @@ typedef struct {
19
20    gint           sb_scroll_direction;
21    guint          sb_scroll_timeout_id;
22 +
23 +  gboolean       overlay_scrollbars;
24  } GtkScrolledWindowPrivate;
25
26  #define GTK_SCROLLED_WINDOW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_SCROLLED_WINDOW, GtkScrolledWindowPrivate))
27 @@ -260,12 +262,14 @@ static gboolean gtk_scrolled_window_child_expose (GtkWidget         *widget,
28  static void  gtk_scrolled_window_expose_scrollbars (GtkAdjustment     *adj,
29                                                      GtkScrolledWindow *scrolled_window);
30
31 +static void gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings,
32 +                                                            GParamSpec  *arg,
33 +                                                            gpointer     user_data);
34 +
35  static guint signals[LAST_SIGNAL] = {0};
36
37  G_DEFINE_TYPE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN)
38
39 -static gboolean overlay_scrollbars = TRUE;
40 -
41  static void
42  add_scroll_binding (GtkBindingSet  *binding_set,
43                     guint           keyval,
44 @@ -501,6 +505,7 @@ static void
45  gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
46  {
47    GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
48 +  GtkSettings *settings;
49
50    gtk_widget_set_has_window (GTK_WIDGET (scrolled_window), FALSE);
51    gtk_widget_set_can_focus (GTK_WIDGET (scrolled_window), TRUE);
52 @@ -515,13 +520,22 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
53    scrolled_window->window_placement = GTK_CORNER_TOP_LEFT;
54    gtk_scrolled_window_update_real_placement (scrolled_window);
55
56 +  settings = gtk_widget_get_settings (GTK_WIDGET (scrolled_window));
57 +  g_object_get (settings,
58 +                "gtk-enable-overlay-scrollbars",
59 +                &priv->overlay_scrollbars,
60 +                NULL);
61 +  g_signal_connect (settings, "notify::gtk-enable-overlay-scrollbars",
62 +                    G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed),
63 +                    scrolled_window);
64 +
65    if (g_getenv ("GTK2_KINETIC_SCROLLING"))
66      {
67        gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE);
68        gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE);
69      }
70
71 -  if (overlay_scrollbars)
72 +  if (priv->overlay_scrollbars)
73      {
74        priv->opacity = g_object_new (GTK_TYPE_ADJUSTMENT,
75                                      "lower", 0.0,
76 @@ -586,6 +600,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
77                                      GtkAdjustment     *hadjustment)
78  {
79    GtkBin *bin;
80 +  GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
81
82    g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
83    if (hadjustment)
84 @@ -618,7 +633,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
85                                             gtk_scrolled_window_adjustment_changed,
86                                             scrolled_window);
87
88 -      if (overlay_scrollbars)
89 +      if (priv->overlay_scrollbars)
90          {
91            g_signal_handlers_disconnect_by_func (old_adjustment,
92                                                  gtk_scrolled_window_adjustment_value_changed,
93 @@ -643,7 +658,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
94    gtk_scrolled_window_adjustment_changed (hadjustment, scrolled_window);
95    gtk_scrolled_window_adjustment_value_changed (hadjustment, scrolled_window);
96
97 -  if (overlay_scrollbars)
98 +  if (priv->overlay_scrollbars)
99      {
100        g_signal_connect (hadjustment, "value-changed",
101                          G_CALLBACK (gtk_scrolled_window_adjustment_value_changed),
102 @@ -677,6 +692,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
103                                      GtkAdjustment     *vadjustment)
104  {
105    GtkBin *bin;
106 +  GtkScrolledWindowPrivate *priv;
107
108    g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
109    if (vadjustment)
110 @@ -685,6 +701,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
111      vadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
112
113    bin = GTK_BIN (scrolled_window);
114 +  priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
115
116    if (!scrolled_window->vscrollbar)
117      {
118 @@ -709,7 +726,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
119                                             gtk_scrolled_window_adjustment_changed,
120                                             scrolled_window);
121
122 -      if (overlay_scrollbars)
123 +      if (priv->overlay_scrollbars)
124          {
125            g_signal_handlers_disconnect_by_func (old_adjustment,
126                                                  gtk_scrolled_window_adjustment_value_changed,
127 @@ -734,7 +751,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
128    gtk_scrolled_window_adjustment_changed (vadjustment, scrolled_window);
129    gtk_scrolled_window_adjustment_value_changed (vadjustment, scrolled_window);
130
131 -  if (overlay_scrollbars)
132 +  if (priv->overlay_scrollbars)
133      {
134        g_signal_connect (vadjustment,
135                          "value-changed",
136 @@ -1208,7 +1225,7 @@ gtk_scrolled_window_destroy (GtkObject *object)
137                                             gtk_scrolled_window_adjustment_changed,
138                                             scrolled_window);
139
140 -      if (overlay_scrollbars)
141 +      if (priv->overlay_scrollbars)
142          {
143            g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)),
144                                                  gtk_scrolled_window_adjustment_value_changed,
145 @@ -1229,7 +1246,7 @@ gtk_scrolled_window_destroy (GtkObject *object)
146                                             gtk_scrolled_window_adjustment_changed,
147                                             scrolled_window);
148
149 -      if (overlay_scrollbars)
150 +      if (priv->overlay_scrollbars)
151          {
152            g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)),
153                                                  gtk_scrolled_window_adjustment_value_changed,
154 @@ -1245,6 +1262,10 @@ gtk_scrolled_window_destroy (GtkObject *object)
155        scrolled_window->vscrollbar = NULL;
156      }
157
158 +  g_signal_handlers_disconnect_by_func (gtk_widget_get_settings (GTK_WIDGET (scrolled_window)),
159 +                                        G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed),
160 +                                        scrolled_window);
161 +
162    if (priv->release_timeout_id)
163      {
164        g_source_remove (priv->release_timeout_id);
165 @@ -1641,12 +1662,14 @@ gtk_scrolled_window_size_request (GtkWidget      *widget,
166    GtkRequisition hscrollbar_requisition;
167    GtkRequisition vscrollbar_requisition;
168    GtkRequisition child_requisition;
169 +  GtkScrolledWindowPrivate *priv;
170
171    g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
172    g_return_if_fail (requisition != NULL);
173
174    scrolled_window = GTK_SCROLLED_WINDOW (widget);
175    bin = GTK_BIN (scrolled_window);
176 +  priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
177
178    scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window);
179
180 @@ -1666,7 +1689,7 @@ gtk_scrolled_window_size_request (GtkWidget      *widget,
181
182        if (scrolled_window->hscrollbar_policy == GTK_POLICY_NEVER)
183         requisition->width += child_requisition.width;
184 -      else if (! overlay_scrollbars)
185 +      else if (! priv->overlay_scrollbars)
186         {
187           GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (bin->child, FALSE);
188
189 @@ -1681,7 +1704,7 @@ gtk_scrolled_window_size_request (GtkWidget      *widget,
190
191        if (scrolled_window->vscrollbar_policy == GTK_POLICY_NEVER)
192         requisition->height += child_requisition.height;
193 -      else if (! overlay_scrollbars)
194 +      else if (! priv->overlay_scrollbars)
195         {
196           GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (bin->child, FALSE);
197
198 @@ -1695,7 +1718,7 @@ gtk_scrolled_window_size_request (GtkWidget      *widget,
199         }
200      }
201
202 -  if (! overlay_scrollbars)
203 +  if (! priv->overlay_scrollbars)
204      {
205        if (scrolled_window->hscrollbar_policy == GTK_POLICY_AUTOMATIC ||
206            scrolled_window->hscrollbar_policy == GTK_POLICY_ALWAYS)
207 @@ -1752,7 +1775,7 @@ gtk_scrolled_window_relative_allocation (GtkWidget     *widget,
208    allocation->width = MAX (1, (gint)widget->allocation.width - allocation->x * 2);
209    allocation->height = MAX (1, (gint)widget->allocation.height - allocation->y * 2);
210
211 -  if (overlay_scrollbars)
212 +  if (priv->overlay_scrollbars)
213      return;
214
215    if (scrolled_window->vscrollbar_visible)
216 @@ -1909,16 +1932,15 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
217    g_return_if_fail (allocation != NULL);
218
219    scrolled_window = GTK_SCROLLED_WINDOW (widget);
220 +  priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
221    bin = GTK_BIN (scrolled_window);
222
223 -  if (overlay_scrollbars)
224 +  if (priv->overlay_scrollbars)
225      gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window);
226
227    scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window);
228    gtk_widget_style_get (widget, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL);
229
230 -  priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
231 -
232    widget->allocation = *allocation;
233
234    if (scrolled_window->hscrollbar_policy == GTK_POLICY_ALWAYS)
235 @@ -1972,7 +1994,7 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
236        gtk_scrolled_window_relative_allocation (widget, &relative_allocation);
237      }
238
239 -  if (!overlay_scrollbars && scrolled_window->hscrollbar_visible)
240 +  if (!priv->overlay_scrollbars && scrolled_window->hscrollbar_visible)
241      {
242        GtkRequisition hscrollbar_requisition;
243        gtk_widget_get_child_requisition (scrolled_window->hscrollbar,
244 @@ -2020,7 +2042,7 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
245    else if (gtk_widget_get_visible (scrolled_window->hscrollbar))
246      gtk_widget_hide (scrolled_window->hscrollbar);
247
248 -  if (!overlay_scrollbars && scrolled_window->vscrollbar_visible)
249 +  if (!priv->overlay_scrollbars && scrolled_window->vscrollbar_visible)
250      {
251        GtkRequisition vscrollbar_requisition;
252        if (!gtk_widget_get_visible (scrolled_window->vscrollbar))
253 @@ -2080,6 +2102,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
254                                   GdkEventScroll *event)
255  {
256    GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
257 +  GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
258    gboolean handled = FALSE;
259    gdouble delta_x;
260    gdouble delta_y;
261 @@ -2090,7 +2113,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
262    if (gdk_event_get_scroll_deltas ((GdkEvent *) event, &delta_x, &delta_y))
263      {
264        if (delta_x != 0.0 && scrolled_window->hscrollbar &&
265 -          (overlay_scrollbars || gtk_widget_get_visible (scrolled_window->hscrollbar)))
266 +          (priv->overlay_scrollbars || gtk_widget_get_visible (scrolled_window->hscrollbar)))
267          {
268            GtkAdjustment *adj;
269            gdouble new_value;
270 @@ -2108,7 +2131,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
271          }
272
273        if (delta_y != 0.0 && scrolled_window->vscrollbar &&
274 -          (overlay_scrollbars || gtk_widget_get_visible (scrolled_window->vscrollbar)))
275 +          (priv->overlay_scrollbars || gtk_widget_get_visible (scrolled_window->vscrollbar)))
276          {
277            GtkAdjustment *adj;
278            gdouble new_value;
279 @@ -2134,7 +2157,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
280        else
281          range = scrolled_window->hscrollbar;
282
283 -      if (range && (overlay_scrollbars || gtk_widget_get_visible (range)))
284 +      if (range && (priv->overlay_scrollbars || gtk_widget_get_visible (range)))
285          {
286            GtkAdjustment *adj = GTK_RANGE (range)->adjustment;
287            gdouble delta, new_value;
288 @@ -2994,11 +3017,13 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
289                                         gpointer       data)
290  {
291    GtkScrolledWindow *scrolled_win;
292 +  GtkScrolledWindowPrivate *priv;
293
294    g_return_if_fail (adjustment != NULL);
295    g_return_if_fail (data != NULL);
296
297    scrolled_win = GTK_SCROLLED_WINDOW (data);
298 +  priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (data);
299
300    if (scrolled_win->hscrollbar &&
301        adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_win->hscrollbar)))
302 @@ -3029,7 +3054,7 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
303         }
304      }
305
306 -  if (overlay_scrollbars)
307 +  if (priv->overlay_scrollbars)
308      gtk_scrolled_window_start_fade_in_animation (scrolled_win);
309  }
310
311 @@ -3052,7 +3077,7 @@ gtk_scrolled_window_adjustment_value_changed (GtkAdjustment *adjustment,
312             adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)))
313      priv->unclamped_hadj_value = gtk_adjustment_get_value (adjustment);
314
315 -  if (overlay_scrollbars)
316 +  if (priv->overlay_scrollbars)
317      gtk_scrolled_window_start_fade_in_animation (scrolled_window);
318  }
319
320 @@ -3083,7 +3108,7 @@ gtk_scrolled_window_add (GtkContainer *container,
321      g_warning ("gtk_scrolled_window_add(): cannot add non scrollable widget "
322                "use gtk_scrolled_window_add_with_viewport() instead");
323
324 -  if (overlay_scrollbars)
325 +  if (priv->overlay_scrollbars)
326      {
327        g_signal_connect_after (child, "expose-event",
328                                G_CALLBACK (gtk_scrolled_window_child_expose),
329 @@ -3095,11 +3120,15 @@ static void
330  gtk_scrolled_window_remove (GtkContainer *container,
331                             GtkWidget    *child)
332  {
333 +  GtkScrolledWindowPrivate *priv;
334 +
335    g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container));
336    g_return_if_fail (child != NULL);
337    g_return_if_fail (GTK_BIN (container)->child == child);
338
339 -  if (overlay_scrollbars)
340 +  priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (container);
341 +
342 +  if (priv->overlay_scrollbars)
343      {
344        g_signal_handlers_disconnect_by_func (child,
345                                              gtk_scrolled_window_child_expose,
346 @@ -3764,5 +3793,23 @@ gtk_scrolled_window_expose_scrollbars (GtkAdjustment     *adj,
347      }
348  }
349
350 +static void
351 +gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings,
352 +                                                GParamSpec  *arg,
353 +                                                gpointer     user_data)
354 +{
355 +  GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (user_data);
356 +  GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (user_data);
357 +
358 +  /* FIXME: tear down/set up things to make the switch */
359 +
360 +  g_object_get (settings,
361 +                "gtk-enable-overlay-scrollbars",
362 +                &priv->overlay_scrollbars,
363 +                NULL);
364 +
365 +  g_print ("enable-overlay-scrollbar is now: %d\n", priv->overlay_scrollbars);
366 +}
367 +
368  #define __GTK_SCROLLED_WINDOW_C__
369  #include "gtkaliasdef.c"
370 --
371 1.7.10.2 (Apple Git-33)