linux-packaging-mono/external/bockbuild/packages/patches/gtk/0053-gtk-add-an-overlay-policy-API-to-GtkScrolledWindow.patch
Xamarin Public Jenkins (auto-signing) 6bdd276d05 Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
2017-04-10 11:41:01 +00:00

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)