summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-02-15 17:27:26 +0000
committerCarlos Garnacho <carlosg@gnome.org>2021-02-15 17:27:26 +0000
commitdca64da1fe6de5e40219c601241e4f1eb7e0fd14 (patch)
tree6f8fb35cbbc9ba979cf90b6e1c7ffc0e9420d8e8
parent5f13ee0afe062133bfa1fffd38bdcb0104cb4404 (diff)
parentd4943ef2fbc5a402bb5f43f40c93700b7263f07b (diff)
downloadgtk+-dca64da1fe6de5e40219c601241e4f1eb7e0fd14.tar.gz
Merge branch 'touch-scroll-scale' into 'gtk-3-24'
Add scaling adjustment for touch dragging a scrolled window See merge request GNOME/gtk!2615
-rw-r--r--gtk/gtkscrolledwindow.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index bea7339f39..1364cd46cd 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1005,7 +1005,9 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment;
- gdouble dx, dy;
+ GtkScrollable *child;
+ GtkBorder border;
+ double dx, dy, scale, size;
gtk_scrolled_window_invalidate_overshoot (scrolled_window);
@@ -1018,10 +1020,25 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
GTK_EVENT_SEQUENCE_CLAIMED);
}
+ child = GTK_SCROLLABLE (gtk_bin_get_child (GTK_BIN (scrolled_window)));
+
hadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->hscrollbar));
if (hadjustment && may_hscroll (scrolled_window))
{
- dx = priv->drag_start_x - offset_x;
+ if (child && gtk_widget_get_visible (child))
+ {
+ size = gtk_widget_get_allocated_width (GTK_WIDGET (child));
+ if (gtk_scrollable_get_border (child, &border))
+ size -= border.left + border.right;
+
+ scale = gtk_adjustment_get_page_size (hadjustment) / size;
+ }
+ else
+ {
+ scale = 1.0;
+ }
+
+ dx = priv->drag_start_x - offset_x * scale;
_gtk_scrolled_window_set_adjustment_value (scrolled_window,
hadjustment, dx);
}
@@ -1029,7 +1046,20 @@ scrolled_window_drag_update_cb (GtkScrolledWindow *scrolled_window,
vadjustment = gtk_range_get_adjustment (GTK_RANGE (priv->vscrollbar));
if (vadjustment && may_vscroll (scrolled_window))
{
- dy = priv->drag_start_y - offset_y;
+ if (child && gtk_widget_get_visible (child))
+ {
+ size = gtk_widget_get_allocated_height (GTK_WIDGET (child));
+ if (gtk_scrollable_get_border (child, &border))
+ size -= border.top + border.bottom;
+
+ scale = gtk_adjustment_get_page_size (vadjustment) / size;
+ }
+ else
+ {
+ scale = 1.0;
+ }
+
+ dy = priv->drag_start_y - offset_y * scale;
_gtk_scrolled_window_set_adjustment_value (scrolled_window,
vadjustment, dy);
}