1 From 3e4fba4264957d704d9c01496eef57e897b7d691 Mon Sep 17 00:00:00 2001
2 From: Michael Natterer <mitch@gimp.org>
3 Date: Fri, 3 May 2013 11:55:51 +0200
4 Subject: [PATCH 53/68] gtk: add an "overlay policy" API to GtkScrolledWindow
6 which allows to turn off drawing of the overlay scrollbars,
7 while keeping scrolling enabled.
9 gtk/gtkscrolledwindow.c | 68 ++++++++++++++++++++++++++++++++++++++++++-----
10 gtk/gtkscrolledwindow.h | 6 +++++
11 2 files changed, 68 insertions(+), 6 deletions(-)
13 diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
14 index 9def3aa..a643b7d 100644
15 --- a/gtk/gtkscrolledwindow.c
16 +++ b/gtk/gtkscrolledwindow.c
17 @@ -121,6 +121,9 @@ typedef struct {
18 gdouble unclamped_hadj_value;
19 gdouble unclamped_vadj_value;
21 + GtkPolicyType hoverlay_policy;
22 + GtkPolicyType voverlay_policy;
24 GtkAllocation viewport_allocation;
27 @@ -536,6 +539,9 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
29 g_object_ref_sink (priv->opacity);
31 + priv->hoverlay_policy = GTK_POLICY_AUTOMATIC;
32 + priv->voverlay_policy = GTK_POLICY_AUTOMATIC;
34 priv->sb_min_height = 20;
37 @@ -865,6 +871,42 @@ gtk_scrolled_window_get_policy (GtkScrolledWindow *scrolled_window,
38 *vscrollbar_policy = scrolled_window->vscrollbar_policy;
42 +gtk_scrolled_window_set_overlay_policy (GtkScrolledWindow *scrolled_window,
43 + GtkPolicyType hoverlay_policy,
44 + GtkPolicyType voverlay_policy)
46 + GtkScrolledWindowPrivate *priv;
48 + g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
49 + g_return_if_fail (hoverlay_policy == GTK_POLICY_AUTOMATIC ||
50 + hoverlay_policy == GTK_POLICY_NEVER);
51 + g_return_if_fail (voverlay_policy == GTK_POLICY_AUTOMATIC ||
52 + voverlay_policy == GTK_POLICY_NEVER);
54 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
56 + priv->hoverlay_policy = hoverlay_policy;
57 + priv->voverlay_policy = voverlay_policy;
61 +gtk_scrolled_window_get_overlay_policy (GtkScrolledWindow *scrolled_window,
62 + GtkPolicyType *hoverlay_policy,
63 + GtkPolicyType *voverlay_policy)
65 + GtkScrolledWindowPrivate *priv;
67 + g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
69 + priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
71 + if (hoverlay_policy)
72 + *hoverlay_policy = priv->hoverlay_policy;
73 + if (voverlay_policy)
74 + *voverlay_policy = priv->voverlay_policy;
78 gtk_scrolled_window_update_real_placement (GtkScrolledWindow *scrolled_window)
80 @@ -1309,7 +1351,10 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window)
81 &vbar_rect, &vslider_rect,
82 &hbar_rect, &hslider_rect);
84 - if (priv->sb_visible && scrolled_window->vscrollbar && vbar_rect.width > 0)
85 + if (priv->sb_visible &&
86 + scrolled_window->vscrollbar &&
87 + priv->voverlay_policy == GTK_POLICY_AUTOMATIC &&
88 + vbar_rect.width > 0)
90 rect.origin.x = priv->viewport_allocation.x + vbar_rect.x;
91 rect.origin.y = priv->viewport_allocation.y + vbar_rect.y;
92 @@ -1326,7 +1371,10 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window)
93 priv->vbar_layer.opacity = 0.0;
96 - if (priv->sb_visible && scrolled_window->hscrollbar && hbar_rect.width > 0)
97 + if (priv->sb_visible &&
98 + scrolled_window->hscrollbar &&
99 + priv->hoverlay_policy == GTK_POLICY_AUTOMATIC &&
100 + hbar_rect.width > 0)
102 rect.origin.x = priv->viewport_allocation.x + hbar_rect.x;
103 rect.origin.y = priv->viewport_allocation.y + hbar_rect.y;
104 @@ -1334,8 +1382,12 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window)
105 rect.size.height = hbar_rect.height;
107 /* don't overlap in the corner */
108 - if (scrolled_window->vscrollbar && vbar_rect.width > 0)
109 - rect.size.width -= vbar_rect.width;
110 + if (scrolled_window->vscrollbar &&
111 + priv->voverlay_policy == GTK_POLICY_AUTOMATIC &&
112 + vbar_rect.width > 0)
114 + rect.size.width -= vbar_rect.width;
117 rect.origin.y = window_height - rect.origin.y - rect.size.height;
119 @@ -1347,7 +1399,9 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window)
120 priv->hbar_layer.opacity = 0.0;
123 - if (scrolled_window->vscrollbar && vslider_rect.width > 0)
124 + if (scrolled_window->vscrollbar &&
125 + priv->voverlay_policy == GTK_POLICY_AUTOMATIC &&
126 + vslider_rect.width > 0)
128 rect.origin.x = priv->viewport_allocation.x + vslider_rect.x;
129 rect.origin.y = priv->viewport_allocation.y + vslider_rect.y;
130 @@ -1365,7 +1419,9 @@ gtk_scrolled_window_update_scrollbars (GtkScrolledWindow *scrolled_window)
131 priv->vslider_layer.opacity = 0.0;
134 - if (scrolled_window->hscrollbar && hslider_rect.width > 0)
135 + if (scrolled_window->hscrollbar &&
136 + priv->hoverlay_policy == GTK_POLICY_AUTOMATIC &&
137 + hslider_rect.width > 0)
139 rect.origin.x = priv->viewport_allocation.x + hslider_rect.x;
140 rect.origin.y = priv->viewport_allocation.y + hslider_rect.y;
141 diff --git a/gtk/gtkscrolledwindow.h b/gtk/gtkscrolledwindow.h
142 index f75596d..69dcb43 100644
143 --- a/gtk/gtkscrolledwindow.h
144 +++ b/gtk/gtkscrolledwindow.h
145 @@ -116,6 +116,12 @@ void gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolle
146 void gtk_scrolled_window_get_policy (GtkScrolledWindow *scrolled_window,
147 GtkPolicyType *hscrollbar_policy,
148 GtkPolicyType *vscrollbar_policy);
149 +void gtk_scrolled_window_set_overlay_policy (GtkScrolledWindow *scrolled_window,
150 + GtkPolicyType hoverlay_policy,
151 + GtkPolicyType voverlay_policy);
152 +void gtk_scrolled_window_get_overlay_policy (GtkScrolledWindow *scrolled_window,
153 + GtkPolicyType *hoverlay_policy,
154 + GtkPolicyType *voverlay_policy);
155 void gtk_scrolled_window_set_placement (GtkScrolledWindow *scrolled_window,
156 GtkCornerType window_placement);
157 void gtk_scrolled_window_unset_placement (GtkScrolledWindow *scrolled_window);
159 1.7.10.2 (Apple Git-33)