6bdd276d05
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
160 lines
6.6 KiB
Diff
160 lines
6.6 KiB
Diff
From 3e4fba4264957d704d9c01496eef57e897b7d691 Mon Sep 17 00:00:00 2001
|
|
From: Michael Natterer <mitch@gimp.org>
|
|
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)
|