6bdd276d05
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
372 lines
15 KiB
Diff
372 lines
15 KiB
Diff
From eea6eef69858ff65ff8ccf46bb640bcc0580f592 Mon Sep 17 00:00:00 2001
|
|
From: Kristian Rietveld <kris@lanedo.com>
|
|
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)
|