diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2021-02-15 17:27:26 +0000 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2021-02-15 17:27:26 +0000 |
commit | dca64da1fe6de5e40219c601241e4f1eb7e0fd14 (patch) | |
tree | 6f8fb35cbbc9ba979cf90b6e1c7ffc0e9420d8e8 | |
parent | 5f13ee0afe062133bfa1fffd38bdcb0104cb4404 (diff) | |
parent | d4943ef2fbc5a402bb5f43f40c93700b7263f07b (diff) | |
download | gtk+-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.c | 36 |
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); } |