From eea6eef69858ff65ff8ccf46bb640bcc0580f592 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Sun, 29 Jul 2012 16:14:09 +0200 Subject: [PATCH 15/68] Use gtk-enable-overlay-scrollbars in GtkScrolledWindow And listen for changes to this setting. Move overlay_scrollbars variable to GtkScrolledWindowPrivate, because we are going to have to monitor for each scrolled window whether it has transformed itself in response to the signal. --- gtk/gtkscrolledwindow.c | 97 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 25 deletions(-) diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 70de6ec..3220e91 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -140,6 +140,8 @@ typedef struct { gint sb_scroll_direction; guint sb_scroll_timeout_id; + + gboolean overlay_scrollbars; } GtkScrolledWindowPrivate; #define GTK_SCROLLED_WINDOW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_SCROLLED_WINDOW, GtkScrolledWindowPrivate)) @@ -260,12 +262,14 @@ static gboolean gtk_scrolled_window_child_expose (GtkWidget *widget, static void gtk_scrolled_window_expose_scrollbars (GtkAdjustment *adj, GtkScrolledWindow *scrolled_window); +static void gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings, + GParamSpec *arg, + gpointer user_data); + static guint signals[LAST_SIGNAL] = {0}; G_DEFINE_TYPE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN) -static gboolean overlay_scrollbars = TRUE; - static void add_scroll_binding (GtkBindingSet *binding_set, guint keyval, @@ -501,6 +505,7 @@ static void gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) { GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); + GtkSettings *settings; gtk_widget_set_has_window (GTK_WIDGET (scrolled_window), FALSE); gtk_widget_set_can_focus (GTK_WIDGET (scrolled_window), TRUE); @@ -515,13 +520,22 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) scrolled_window->window_placement = GTK_CORNER_TOP_LEFT; gtk_scrolled_window_update_real_placement (scrolled_window); + settings = gtk_widget_get_settings (GTK_WIDGET (scrolled_window)); + g_object_get (settings, + "gtk-enable-overlay-scrollbars", + &priv->overlay_scrollbars, + NULL); + g_signal_connect (settings, "notify::gtk-enable-overlay-scrollbars", + G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed), + scrolled_window); + if (g_getenv ("GTK2_KINETIC_SCROLLING")) { gtk_scrolled_window_set_kinetic_scrolling (scrolled_window, TRUE); gtk_scrolled_window_set_capture_button_press (scrolled_window, TRUE); } - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { priv->opacity = g_object_new (GTK_TYPE_ADJUSTMENT, "lower", 0.0, @@ -586,6 +600,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window, GtkAdjustment *hadjustment) { GtkBin *bin; + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window)); if (hadjustment) @@ -618,7 +633,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window, gtk_scrolled_window_adjustment_changed, scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_handlers_disconnect_by_func (old_adjustment, gtk_scrolled_window_adjustment_value_changed, @@ -643,7 +658,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window, gtk_scrolled_window_adjustment_changed (hadjustment, scrolled_window); gtk_scrolled_window_adjustment_value_changed (hadjustment, scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_connect (hadjustment, "value-changed", G_CALLBACK (gtk_scrolled_window_adjustment_value_changed), @@ -677,6 +692,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window, GtkAdjustment *vadjustment) { GtkBin *bin; + GtkScrolledWindowPrivate *priv; g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window)); if (vadjustment) @@ -685,6 +701,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window, vadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL); bin = GTK_BIN (scrolled_window); + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); if (!scrolled_window->vscrollbar) { @@ -709,7 +726,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window, gtk_scrolled_window_adjustment_changed, scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_handlers_disconnect_by_func (old_adjustment, gtk_scrolled_window_adjustment_value_changed, @@ -734,7 +751,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window, gtk_scrolled_window_adjustment_changed (vadjustment, scrolled_window); gtk_scrolled_window_adjustment_value_changed (vadjustment, scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_connect (vadjustment, "value-changed", @@ -1208,7 +1225,7 @@ gtk_scrolled_window_destroy (GtkObject *object) gtk_scrolled_window_adjustment_changed, scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)), gtk_scrolled_window_adjustment_value_changed, @@ -1229,7 +1246,7 @@ gtk_scrolled_window_destroy (GtkObject *object) gtk_scrolled_window_adjustment_changed, scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_handlers_disconnect_by_func (gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)), gtk_scrolled_window_adjustment_value_changed, @@ -1245,6 +1262,10 @@ gtk_scrolled_window_destroy (GtkObject *object) scrolled_window->vscrollbar = NULL; } + g_signal_handlers_disconnect_by_func (gtk_widget_get_settings (GTK_WIDGET (scrolled_window)), + G_CALLBACK (gtk_scrolled_window_overlay_scrollbars_changed), + scrolled_window); + if (priv->release_timeout_id) { g_source_remove (priv->release_timeout_id); @@ -1641,12 +1662,14 @@ gtk_scrolled_window_size_request (GtkWidget *widget, GtkRequisition hscrollbar_requisition; GtkRequisition vscrollbar_requisition; GtkRequisition child_requisition; + GtkScrolledWindowPrivate *priv; g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget)); g_return_if_fail (requisition != NULL); scrolled_window = GTK_SCROLLED_WINDOW (widget); bin = GTK_BIN (scrolled_window); + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window); @@ -1666,7 +1689,7 @@ gtk_scrolled_window_size_request (GtkWidget *widget, if (scrolled_window->hscrollbar_policy == GTK_POLICY_NEVER) requisition->width += child_requisition.width; - else if (! overlay_scrollbars) + else if (! priv->overlay_scrollbars) { GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (bin->child, FALSE); @@ -1681,7 +1704,7 @@ gtk_scrolled_window_size_request (GtkWidget *widget, if (scrolled_window->vscrollbar_policy == GTK_POLICY_NEVER) requisition->height += child_requisition.height; - else if (! overlay_scrollbars) + else if (! priv->overlay_scrollbars) { GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (bin->child, FALSE); @@ -1695,7 +1718,7 @@ gtk_scrolled_window_size_request (GtkWidget *widget, } } - if (! overlay_scrollbars) + if (! priv->overlay_scrollbars) { if (scrolled_window->hscrollbar_policy == GTK_POLICY_AUTOMATIC || scrolled_window->hscrollbar_policy == GTK_POLICY_ALWAYS) @@ -1752,7 +1775,7 @@ gtk_scrolled_window_relative_allocation (GtkWidget *widget, allocation->width = MAX (1, (gint)widget->allocation.width - allocation->x * 2); allocation->height = MAX (1, (gint)widget->allocation.height - allocation->y * 2); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) return; if (scrolled_window->vscrollbar_visible) @@ -1909,16 +1932,15 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, g_return_if_fail (allocation != NULL); scrolled_window = GTK_SCROLLED_WINDOW (widget); + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); bin = GTK_BIN (scrolled_window); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) gtk_scrolled_window_expose_scrollbars (NULL, scrolled_window); scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window); gtk_widget_style_get (widget, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL); - priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); - widget->allocation = *allocation; if (scrolled_window->hscrollbar_policy == GTK_POLICY_ALWAYS) @@ -1972,7 +1994,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, gtk_scrolled_window_relative_allocation (widget, &relative_allocation); } - if (!overlay_scrollbars && scrolled_window->hscrollbar_visible) + if (!priv->overlay_scrollbars && scrolled_window->hscrollbar_visible) { GtkRequisition hscrollbar_requisition; gtk_widget_get_child_requisition (scrolled_window->hscrollbar, @@ -2020,7 +2042,7 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, else if (gtk_widget_get_visible (scrolled_window->hscrollbar)) gtk_widget_hide (scrolled_window->hscrollbar); - if (!overlay_scrollbars && scrolled_window->vscrollbar_visible) + if (!priv->overlay_scrollbars && scrolled_window->vscrollbar_visible) { GtkRequisition vscrollbar_requisition; if (!gtk_widget_get_visible (scrolled_window->vscrollbar)) @@ -2080,6 +2102,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget, GdkEventScroll *event) { GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget); + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); gboolean handled = FALSE; gdouble delta_x; gdouble delta_y; @@ -2090,7 +2113,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget, if (gdk_event_get_scroll_deltas ((GdkEvent *) event, &delta_x, &delta_y)) { if (delta_x != 0.0 && scrolled_window->hscrollbar && - (overlay_scrollbars || gtk_widget_get_visible (scrolled_window->hscrollbar))) + (priv->overlay_scrollbars || gtk_widget_get_visible (scrolled_window->hscrollbar))) { GtkAdjustment *adj; gdouble new_value; @@ -2108,7 +2131,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget, } if (delta_y != 0.0 && scrolled_window->vscrollbar && - (overlay_scrollbars || gtk_widget_get_visible (scrolled_window->vscrollbar))) + (priv->overlay_scrollbars || gtk_widget_get_visible (scrolled_window->vscrollbar))) { GtkAdjustment *adj; gdouble new_value; @@ -2134,7 +2157,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget, else range = scrolled_window->hscrollbar; - if (range && (overlay_scrollbars || gtk_widget_get_visible (range))) + if (range && (priv->overlay_scrollbars || gtk_widget_get_visible (range))) { GtkAdjustment *adj = GTK_RANGE (range)->adjustment; gdouble delta, new_value; @@ -2994,11 +3017,13 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment, gpointer data) { GtkScrolledWindow *scrolled_win; + GtkScrolledWindowPrivate *priv; g_return_if_fail (adjustment != NULL); g_return_if_fail (data != NULL); scrolled_win = GTK_SCROLLED_WINDOW (data); + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (data); if (scrolled_win->hscrollbar && adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_win->hscrollbar))) @@ -3029,7 +3054,7 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment, } } - if (overlay_scrollbars) + if (priv->overlay_scrollbars) gtk_scrolled_window_start_fade_in_animation (scrolled_win); } @@ -3052,7 +3077,7 @@ gtk_scrolled_window_adjustment_value_changed (GtkAdjustment *adjustment, adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar))) priv->unclamped_hadj_value = gtk_adjustment_get_value (adjustment); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) gtk_scrolled_window_start_fade_in_animation (scrolled_window); } @@ -3083,7 +3108,7 @@ gtk_scrolled_window_add (GtkContainer *container, g_warning ("gtk_scrolled_window_add(): cannot add non scrollable widget " "use gtk_scrolled_window_add_with_viewport() instead"); - if (overlay_scrollbars) + if (priv->overlay_scrollbars) { g_signal_connect_after (child, "expose-event", G_CALLBACK (gtk_scrolled_window_child_expose), @@ -3095,11 +3120,15 @@ static void gtk_scrolled_window_remove (GtkContainer *container, GtkWidget *child) { + GtkScrolledWindowPrivate *priv; + g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container)); g_return_if_fail (child != NULL); g_return_if_fail (GTK_BIN (container)->child == child); - if (overlay_scrollbars) + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (container); + + if (priv->overlay_scrollbars) { g_signal_handlers_disconnect_by_func (child, gtk_scrolled_window_child_expose, @@ -3764,5 +3793,23 @@ gtk_scrolled_window_expose_scrollbars (GtkAdjustment *adj, } } +static void +gtk_scrolled_window_overlay_scrollbars_changed (GtkSettings *settings, + GParamSpec *arg, + gpointer user_data) +{ + GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (user_data); + GtkScrolledWindowPrivate *priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (user_data); + + /* FIXME: tear down/set up things to make the switch */ + + g_object_get (settings, + "gtk-enable-overlay-scrollbars", + &priv->overlay_scrollbars, + NULL); + + g_print ("enable-overlay-scrollbar is now: %d\n", priv->overlay_scrollbars); +} + #define __GTK_SCROLLED_WINDOW_C__ #include "gtkaliasdef.c" -- 1.7.10.2 (Apple Git-33)