From 3e4fba4264957d704d9c01496eef57e897b7d691 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 3 May 2013 11:55:51 +0200 Subject: [PATCH 53/68] gtk: add an "overlay policy" API to GtkScrolledWindow which allows to turn off drawing of the overlay scrollbars, while keeping scrolling enabled. --- gtk/gtkscrolledwindow.c | 68 ++++++++++++++++++++++++++++++++++++++++++----- gtk/gtkscrolledwindow.h | 6 +++++ 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 9def3aa..a643b7d 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -121,6 +121,9 @@ typedef struct { gdouble unclamped_hadj_value; gdouble unclamped_vadj_value; + GtkPolicyType hoverlay_policy; + GtkPolicyType voverlay_policy; + GtkAllocation viewport_allocation; CALayer *vbar_layer; CALayer *hbar_layer; @@ -536,6 +539,9 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) NULL); g_object_ref_sink (priv->opacity); + priv->hoverlay_policy = GTK_POLICY_AUTOMATIC; + priv->voverlay_policy = GTK_POLICY_AUTOMATIC; + priv->sb_min_height = 20; priv->sb_padding = 2; priv->sb_radius = 3; @@ -865,6 +871,42 @@ gtk_scrolled_window_get_policy (GtkScrolledWindow *scrolled_window, *vscrollbar_policy = scrolled_window->vscrollbar_policy; } +void +gtk_scrolled_window_set_overlay_policy (GtkScrolledWindow *scrolled_window, + GtkPolicyType hoverlay_policy, + GtkPolicyType voverlay_policy) +{ + GtkScrolledWindowPrivate *priv; + + g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window)); + g_return_if_fail (hoverlay_policy == GTK_POLICY_AUTOMATIC || + hoverlay_policy == GTK_POLICY_NEVER); + g_return_if_fail (voverlay_policy == GTK_POLICY_AUTOMATIC || + voverlay_policy == GTK_POLICY_NEVER); + + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); + + priv->hoverlay_policy = hoverlay_policy; + priv->voverlay_policy = voverlay_policy; +} + +void +gtk_scrolled_window_get_overlay_policy (GtkScrolledWindow *scrolled_window, + GtkPolicyType *hoverlay_policy, + GtkPolicyType *voverlay_policy) +{ + GtkScrolledWindowPrivate *priv; + + g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window)); + + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window); + + if (hoverlay_policy) + *hoverlay_policy = priv->hoverlay_policy; + if (voverlay_policy) + *voverlay_policy = priv->voverlay_policy; +} + static void gtk_scrolled_window_update_real_placement (GtkScrolledWindow *scrolled_window) { @@ -1309,7 +1351,10 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window) &vbar_rect, &vslider_rect, &hbar_rect, &hslider_rect); - if (priv->sb_visible && scrolled_window->vscrollbar && vbar_rect.width > 0) + if (priv->sb_visible && + scrolled_window->vscrollbar && + priv->voverlay_policy == GTK_POLICY_AUTOMATIC && + vbar_rect.width > 0) { rect.origin.x = priv->viewport_allocation.x + vbar_rect.x; rect.origin.y = priv->viewport_allocation.y + vbar_rect.y; @@ -1326,7 +1371,10 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window) priv->vbar_layer.opacity = 0.0; } - if (priv->sb_visible && scrolled_window->hscrollbar && hbar_rect.width > 0) + if (priv->sb_visible && + scrolled_window->hscrollbar && + priv->hoverlay_policy == GTK_POLICY_AUTOMATIC && + hbar_rect.width > 0) { rect.origin.x = priv->viewport_allocation.x + hbar_rect.x; rect.origin.y = priv->viewport_allocation.y + hbar_rect.y; @@ -1334,8 +1382,12 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window) rect.size.height = hbar_rect.height; /* don't overlap in the corner */ - if (scrolled_window->vscrollbar && vbar_rect.width > 0) - rect.size.width -= vbar_rect.width; + if (scrolled_window->vscrollbar && + priv->voverlay_policy == GTK_POLICY_AUTOMATIC && + vbar_rect.width > 0) + { + rect.size.width -= vbar_rect.width; + } rect.origin.y = window_height - rect.origin.y - rect.size.height; @@ -1347,7 +1399,9 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window) priv->hbar_layer.opacity = 0.0; } - if (scrolled_window->vscrollbar && vslider_rect.width > 0) + if (scrolled_window->vscrollbar && + priv->voverlay_policy == GTK_POLICY_AUTOMATIC && + vslider_rect.width > 0) { rect.origin.x = priv->viewport_allocation.x + vslider_rect.x; rect.origin.y = priv->viewport_allocation.y + vslider_rect.y; @@ -1365,7 +1419,9 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window) priv->vslider_layer.opacity = 0.0; } - if (scrolled_window->hscrollbar && hslider_rect.width > 0) + if (scrolled_window->hscrollbar && + priv->hoverlay_policy == GTK_POLICY_AUTOMATIC && + hslider_rect.width > 0) { rect.origin.x = priv->viewport_allocation.x + hslider_rect.x; rect.origin.y = priv->viewport_allocation.y + hslider_rect.y; diff --git a/gtk/gtkscrolledwindow.h b/gtk/gtkscrolledwindow.h index f75596d..69dcb43 100644 --- a/gtk/gtkscrolledwindow.h +++ b/gtk/gtkscrolledwindow.h @@ -116,6 +116,12 @@ void gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolle void gtk_scrolled_window_get_policy (GtkScrolledWindow *scrolled_window, GtkPolicyType *hscrollbar_policy, GtkPolicyType *vscrollbar_policy); +void gtk_scrolled_window_set_overlay_policy (GtkScrolledWindow *scrolled_window, + GtkPolicyType hoverlay_policy, + GtkPolicyType voverlay_policy); +void gtk_scrolled_window_get_overlay_policy (GtkScrolledWindow *scrolled_window, + GtkPolicyType *hoverlay_policy, + GtkPolicyType *voverlay_policy); void gtk_scrolled_window_set_placement (GtkScrolledWindow *scrolled_window, GtkCornerType window_placement); void gtk_scrolled_window_unset_placement (GtkScrolledWindow *scrolled_window); -- 1.7.10.2 (Apple Git-33)