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
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
11 gtk/gtkscrolledwindow.c | 97 +++++++++++++++++++++++++++++++++++------------
12 1 file changed, 72 insertions(+), 25 deletions(-)
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 {
20 gint sb_scroll_direction;
21 guint sb_scroll_timeout_id;
23 + gboolean overlay_scrollbars;
24 } GtkScrolledWindowPrivate;
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);
31 +static void gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings,
33 + gpointer user_data);
35 static guint signals[LAST_SIGNAL] = {0};
37 G_DEFINE_TYPE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN)
39 -static gboolean overlay_scrollbars = TRUE;
42 add_scroll_binding (GtkBindingSet *binding_set,
44 @@ -501,6 +505,7 @@ static void
45 gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
47 GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
48 + GtkSettings *settings;
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);
56 + settings = gtk_widget_get_settings (GTK_WIDGET (scrolled_window));
57 + g_object_get (settings,
58 + "gtk-enable-overlay-scrollbars",
59 + &priv->overlay_scrollbars,
61 + g_signal_connect (settings, "notify::gtk-enable-overlay-scrollbars",
62 + G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed),
65 if (g_getenv ("GTK2_KINETIC_SCROLLING"))
67 gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE);
68 gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE);
71 - if (overlay_scrollbars)
72 + if (priv->overlay_scrollbars)
74 priv->opacity = g_object_new (GTK_TYPE_ADJUSTMENT,
76 @@ -586,6 +600,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
77 GtkAdjustment *hadjustment)
80 + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
82 g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
84 @@ -618,7 +633,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
85 gtk_scrolled_window_adjustment_changed,
88 - if (overlay_scrollbars)
89 + if (priv->overlay_scrollbars)
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);
97 - if (overlay_scrollbars)
98 + if (priv->overlay_scrollbars)
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)
106 + GtkScrolledWindowPrivate *priv;
108 g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
110 @@ -685,6 +701,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
111 vadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
113 bin = GTK_BIN (scrolled_window);
114 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
116 if (!scrolled_window->vscrollbar)
118 @@ -709,7 +726,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
119 gtk_scrolled_window_adjustment_changed,
122 - if (overlay_scrollbars)
123 + if (priv->overlay_scrollbars)
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);
131 - if (overlay_scrollbars)
132 + if (priv->overlay_scrollbars)
134 g_signal_connect (vadjustment,
136 @@ -1208,7 +1225,7 @@ gtk_scrolled_window_destroy (GtkObject *object)
137 gtk_scrolled_window_adjustment_changed,
140 - if (overlay_scrollbars)
141 + if (priv->overlay_scrollbars)
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,
149 - if (overlay_scrollbars)
150 + if (priv->overlay_scrollbars)
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;
158 + g_signal_handlers_disconnect_by_func (gtk_widget_get_settings (GTK_WIDGET (scrolled_window)),
159 + G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed),
162 if (priv->release_timeout_id)
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;
171 g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
172 g_return_if_fail (requisition != NULL);
174 scrolled_window = GTK_SCROLLED_WINDOW (widget);
175 bin = GTK_BIN (scrolled_window);
176 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
178 scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window);
180 @@ -1666,7 +1689,7 @@ gtk_scrolled_window_size_request (GtkWidget *widget,
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)
187 GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (bin->child, FALSE);
189 @@ -1681,7 +1704,7 @@ gtk_scrolled_window_size_request (GtkWidget *widget,
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)
196 GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (bin->child, FALSE);
198 @@ -1695,7 +1718,7 @@ gtk_scrolled_window_size_request (GtkWidget *widget,
202 - if (! overlay_scrollbars)
203 + if (! priv->overlay_scrollbars)
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);
211 - if (overlay_scrollbars)
212 + if (priv->overlay_scrollbars)
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);
219 scrolled_window = GTK_SCROLLED_WINDOW (widget);
220 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
221 bin = GTK_BIN (scrolled_window);
223 - if (overlay_scrollbars)
224 + if (priv->overlay_scrollbars)
225 gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window);
227 scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window);
228 gtk_widget_style_get (widget, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL);
230 - priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
232 widget->allocation = *allocation;
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);
239 - if (!overlay_scrollbars && scrolled_window->hscrollbar_visible)
240 + if (!priv->overlay_scrollbars && scrolled_window->hscrollbar_visible)
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);
248 - if (!overlay_scrollbars && scrolled_window->vscrollbar_visible)
249 + if (!priv->overlay_scrollbars && scrolled_window->vscrollbar_visible)
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)
256 GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
257 + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
258 gboolean handled = FALSE;
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))
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)))
270 @@ -2108,7 +2131,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
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)))
279 @@ -2134,7 +2157,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
281 range = scrolled_window->hscrollbar;
283 - if (range && (overlay_scrollbars || gtk_widget_get_visible (range)))
284 + if (range && (priv->overlay_scrollbars || gtk_widget_get_visible (range)))
286 GtkAdjustment *adj = GTK_RANGE (range)->adjustment;
287 gdouble delta, new_value;
288 @@ -2994,11 +3017,13 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
291 GtkScrolledWindow *scrolled_win;
292 + GtkScrolledWindowPrivate *priv;
294 g_return_if_fail (adjustment != NULL);
295 g_return_if_fail (data != NULL);
297 scrolled_win = GTK_SCROLLED_WINDOW (data);
298 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (data);
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,
306 - if (overlay_scrollbars)
307 + if (priv->overlay_scrollbars)
308 gtk_scrolled_window_start_fade_in_animation (scrolled_win);
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);
315 - if (overlay_scrollbars)
316 + if (priv->overlay_scrollbars)
317 gtk_scrolled_window_start_fade_in_animation (scrolled_window);
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");
324 - if (overlay_scrollbars)
325 + if (priv->overlay_scrollbars)
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,
333 + GtkScrolledWindowPrivate *priv;
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);
339 - if (overlay_scrollbars)
340 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (container);
342 + if (priv->overlay_scrollbars)
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,
351 +gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings,
353 + gpointer user_data)
355 + GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (user_data);
356 + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (user_data);
358 + /* FIXME: tear down/set up things to make the switch */
360 + g_object_get (settings,
361 + "gtk-enable-overlay-scrollbars",
362 + &priv->overlay_scrollbars,
365 + g_print ("enable-overlay-scrollbar is now: %d\n", priv->overlay_scrollbars);
368 #define __GTK_SCROLLED_WINDOW_C__
369 #include "gtkaliasdef.c"
371 1.7.10.2 (Apple Git-33)