[gtk/wip/carlosg/for-master] gdk/x11: Transform XI_Motion based scroll into discrete
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/carlosg/for-master] gdk/x11: Transform XI_Motion based scroll into discrete
- Date: Wed, 16 Dec 2020 13:42:10 +0000 (UTC)
commit c95a32def80e73b1e789c7109d48a6986379a65e
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Dec 16 14:07:13 2020 +0100
gdk/x11: Transform XI_Motion based scroll into discrete
Depending on the input driver, we will get XI_Motion based scroll
events for regular mouse wheels. These are intended to be handled
as discrete scroll, so detect smooth scroll events that move by
exactly 1.0 in either direction.
Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/3459
gdk/x11/gdkdevicemanager-xi2.c | 46 ++++++++++++++++++++++++++++++++++--------
1 file changed, 38 insertions(+), 8 deletions(-)
---
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index 8e6c05d15c..3165205a5f 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -1716,19 +1716,49 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
scroll_valuators_changed (GDK_X11_DEVICE_XI2 (source_device),
&xev->valuators, &delta_x, &delta_y))
{
+ GdkModifierType state;
+
GDK_DISPLAY_NOTE (display, EVENTS,
g_message ("smooth scroll: \n\tdevice: %u\n\tsource device: %u\n\twindow %ld\n\tdeltas:
%f %f",
xev->deviceid, xev->sourceid,
xev->event, delta_x, delta_y));
- event = gdk_scroll_event_new (surface,
- device,
- NULL,
- xev->time,
- _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group),
- delta_x,
- delta_y,
- delta_x == 0.0 && delta_y == 0.0);
+ state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
+
+ if (gdk_device_get_source (source_device) != GDK_SOURCE_TOUCHPAD &&
+ ((delta_x == 0.0 && ABS (delta_y) == 1.0) ||
+ (ABS (delta_x) == 1.0 && delta_y == 0.0)))
+ {
+ GdkScrollDirection direction;
+
+ if (delta_x > 0)
+ direction = GDK_SCROLL_RIGHT;
+ else if (delta_x < 0)
+ direction = GDK_SCROLL_LEFT;
+ else if (delta_y > 0)
+ direction = GDK_SCROLL_DOWN;
+ else
+ direction = GDK_SCROLL_UP;
+
+ event = gdk_scroll_event_new_discrete (surface,
+ device,
+ NULL,
+ xev->time,
+ state,
+ direction,
+ FALSE);
+ }
+ else
+ {
+ event = gdk_scroll_event_new (surface,
+ device,
+ NULL,
+ xev->time,
+ state,
+ delta_x,
+ delta_y,
+ delta_x == 0.0 && delta_y == 0.0);
+ }
break;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]