From 3dd5e88c07f659d66ee0f7305a96b51b7fe1072d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 4 Mar 2012 19:12:27 -0500 Subject: [PATCH] xi2: Normalize scroll deltas XI2 provides us with an increment for each scroll valuator, and by dividing the delta by the increment, we obtain normalized values in some abstract 'scroll unit'. For mouse wheels, the evdev driver reports an increment of -1, so doing this division fixes the inverted scrolling with wheels that we've seen recently. --- gdk/x11/gdkdevice-xi2.c | 7 +++++-- gdk/x11/gdkdevicemanager-xi2.c | 8 +++++--- gdk/x11/gdkprivate-x11.h | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c index 6e496261eb..263b3f3a67 100644 --- a/gdk/x11/gdkdevice-xi2.c +++ b/gdk/x11/gdkdevice-xi2.c @@ -38,6 +38,7 @@ struct _ScrollValuator guint direction : 4; guint last_value_valid : 1; gdouble last_value; + gdouble increment; }; struct _GdkX11DeviceXI2 @@ -791,7 +792,8 @@ _gdk_x11_device_xi2_translate_state (XIModifierState *mods_state, void _gdk_x11_device_xi2_add_scroll_valuator (GdkX11DeviceXI2 *device, guint n_valuator, - GdkScrollDirection direction) + GdkScrollDirection direction, + gdouble increment) { ScrollValuator scroll; @@ -801,6 +803,7 @@ _gdk_x11_device_xi2_add_scroll_valuator (GdkX11DeviceXI2 *device, scroll.n_valuator = n_valuator; scroll.direction = direction; scroll.last_value_valid = FALSE; + scroll.increment = increment; g_array_append_val (device->scroll_valuators, scroll); } @@ -834,7 +837,7 @@ _gdk_x11_device_xi2_get_scroll_delta (GdkX11DeviceXI2 *device, if (scroll->last_value_valid) { if (delta_ret) - *delta_ret = valuator_value - scroll->last_value; + *delta_ret = (valuator_value - scroll->last_value) / scroll->increment; scroll->last_value = valuator_value; } diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index b4a0256563..6f93fd21b2 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -247,15 +247,17 @@ translate_device_classes (GdkDisplay *display, direction = GDK_SCROLL_RIGHT; GDK_NOTE (INPUT, - g_message ("\n\tscroll valuator %d: %s", + g_message ("\n\tscroll valuator %d: %s, increment %f", scroll_info->number, scroll_info->scroll_type == XIScrollTypeVertical ? "vertical" - : "horizontal")); + : "horizontal", + scroll_info->increment)); _gdk_x11_device_xi2_add_scroll_valuator (GDK_X11_DEVICE_XI2 (device), scroll_info->number, - direction); + direction, + scroll_info->increment); } #endif /* XINPUT_2_2 */ default: diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 14ab2fd391..d17d4fd3df 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -239,7 +239,8 @@ GdkDevice * _gdk_x11_device_manager_xi2_lookup (GdkX11DeviceManagerXI2 *devic gint device_id); void _gdk_x11_device_xi2_add_scroll_valuator (GdkX11DeviceXI2 *device, guint n_valuator, - GdkScrollDirection direction); + GdkScrollDirection direction, + gdouble increment); gboolean _gdk_x11_device_xi2_get_scroll_delta (GdkX11DeviceXI2 *device, guint n_valuator, gdouble valuator_value,