summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkdevicemanager-xi2.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11/gdkdevicemanager-xi2.c')
-rw-r--r--gdk/x11/gdkdevicemanager-xi2.c46
1 files 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;
}