[gtk: 3/7] gtkscrolledwindow: Add scroll unit handling
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk: 3/7] gtkscrolledwindow: Add scroll unit handling
- Date: Sat, 19 Mar 2022 00:47:11 +0000 (UTC)
commit 53956e5389e7ea2a48f5133f27ac2a42b4de82aa
Author: panoplie <59100-panoplie users noreply gitlab gnome org>
Date: Mon Feb 21 16:24:00 2022 +0100
gtkscrolledwindow: Add scroll unit handling
On the "scroll" signal, the widget uses
gtk_event_controller_scroll_get_unit() to get the
scroll unit.
When the unit is GDK_SCROLL_UNIT_WHEEL, the
behavior is unchanged: the widget scrolls a
certain number of pixels at each wheel detent
click. This number of pixels is determined by the
window dimensions in get_wheel_detent_scroll_step().
When the delta unit is GDK_SCROLL_UNIT_SURFACE, the
widget directly adds the delta to the number of
scrolled pixels no matter the window dimensions.
gtk/gtkscrolledwindow.c | 76 ++++++++++++++++++++++++++-----------------------
1 file changed, 41 insertions(+), 35 deletions(-)
---
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 4879fee68d..416c8288eb 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1226,15 +1226,14 @@ check_update_scrollbar_proximity (GtkScrolledWindow *sw,
}
static double
-get_scroll_unit (GtkScrolledWindow *sw,
- GtkOrientation orientation,
- GtkEventControllerScroll *scroll)
+get_wheel_detent_scroll_step (GtkScrolledWindow *sw,
+ GtkOrientation orientation)
{
GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (sw);
GtkScrollbar *scrollbar;
GtkAdjustment *adj;
double page_size;
- double scroll_unit;
+ double scroll_step;
if (orientation == GTK_ORIENTATION_HORIZONTAL)
scrollbar = GTK_SCROLLBAR (priv->hscrollbar);
@@ -1246,20 +1245,9 @@ get_scroll_unit (GtkScrolledWindow *sw,
adj = gtk_scrollbar_get_adjustment (scrollbar);
page_size = gtk_adjustment_get_page_size (adj);
- scroll_unit = pow (page_size, 2.0 / 3.0);
+ scroll_step = pow (page_size, 2.0 / 3.0);
-#ifdef GDK_WINDOWING_MACOS
- {
- GdkEvent *event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (scroll));
-
- if (event != NULL &&
- gdk_event_get_event_type (event) == GDK_SCROLL &&
- gdk_scroll_event_get_direction (event) == GDK_SCROLL_SMOOTH)
- scroll_unit = 1;
- }
-#endif
-
- return scroll_unit;
+ return scroll_step;
}
static gboolean
@@ -1401,12 +1389,18 @@ scrolled_window_scroll (GtkScrolledWindow *scrolled_window,
{
GtkAdjustment *adj;
double new_value;
- double scroll_unit;
+ GdkScrollUnit scroll_unit;
adj = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->hscrollbar));
- scroll_unit = get_scroll_unit (scrolled_window, GTK_ORIENTATION_HORIZONTAL, scroll);
+ scroll_unit = gtk_event_controller_scroll_get_unit (scroll);
+
+ if (scroll_unit == GDK_SCROLL_UNIT_WHEEL)
+ {
+ delta_x *= get_wheel_detent_scroll_step (scrolled_window,
+ GTK_ORIENTATION_HORIZONTAL);
+ }
- new_value = priv->unclamped_hadj_value + delta_x * scroll_unit;
+ new_value = priv->unclamped_hadj_value + delta_x;
_gtk_scrolled_window_set_adjustment_value (scrolled_window, adj,
new_value);
}
@@ -1416,12 +1410,18 @@ scrolled_window_scroll (GtkScrolledWindow *scrolled_window,
{
GtkAdjustment *adj;
double new_value;
- double scroll_unit;
+ GdkScrollUnit scroll_unit;
adj = gtk_scrollbar_get_adjustment (GTK_SCROLLBAR (priv->vscrollbar));
- scroll_unit = get_scroll_unit (scrolled_window, GTK_ORIENTATION_VERTICAL, scroll);
+ scroll_unit = gtk_event_controller_scroll_get_unit (scroll);
+
+ if (scroll_unit == GDK_SCROLL_UNIT_WHEEL)
+ {
+ delta_y *= get_wheel_detent_scroll_step (scrolled_window,
+ GTK_ORIENTATION_VERTICAL);
+ }
- new_value = priv->unclamped_vadj_value + delta_y * scroll_unit;
+ new_value = priv->unclamped_vadj_value + delta_y;
_gtk_scrolled_window_set_adjustment_value (scrolled_window, adj,
new_value);
}
@@ -1468,30 +1468,36 @@ scroll_controller_decelerate (GtkEventControllerScroll *scroll,
double initial_vel_y,
GtkScrolledWindow *scrolled_window)
{
- double unit_x, unit_y;
+ GdkScrollUnit scroll_unit;
gboolean shifted;
GdkModifierType state;
-
+ scroll_unit = gtk_event_controller_scroll_get_unit (scroll);
state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (scroll));
shifted = (state & GDK_SHIFT_MASK) != 0;
- unit_x = get_scroll_unit (scrolled_window, GTK_ORIENTATION_HORIZONTAL, scroll);
- unit_y = get_scroll_unit (scrolled_window, GTK_ORIENTATION_VERTICAL, scroll);
-
if (shifted)
{
- gtk_scrolled_window_decelerate (scrolled_window,
- initial_vel_y * unit_x,
- initial_vel_x * unit_y);
+ double tmp;
+
+ tmp = initial_vel_x;
+ initial_vel_x = initial_vel_y;
+ initial_vel_y = tmp;
}
- else
+
+ if (scroll_unit == GDK_SCROLL_UNIT_WHEEL)
{
- gtk_scrolled_window_decelerate (scrolled_window,
- initial_vel_x * unit_x,
- initial_vel_y * unit_y);
+ initial_vel_x *= get_wheel_detent_scroll_step (scrolled_window,
+ GTK_ORIENTATION_HORIZONTAL);
+
+ initial_vel_y *= get_wheel_detent_scroll_step (scrolled_window,
+ GTK_ORIENTATION_VERTICAL);
}
+
+ gtk_scrolled_window_decelerate (scrolled_window,
+ initial_vel_x,
+ initial_vel_y);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]