summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Gerecke <killertofu@gmail.com>2017-06-12 15:41:51 -0700
committerCarlos Garnacho <carlosg@gnome.org>2017-07-20 14:27:28 +0200
commit837c2002e9e1acdf44c304aaa123bd8b7e4740d4 (patch)
tree23a24a2929a4064c0766060a1d09f0016fc5676a
parent3be5aae56a6849254c149a81fd2e85a93c94ea8a (diff)
downloadgtk+-837c2002e9e1acdf44c304aaa123bd8b7e4740d4.tar.gz
wayland: Implement support for tablet wheel scrolling
Adds support for creating scroll events from Wayland tablet wheel events. Even though no Wacom tablet puck has a smooth-scrolling wheel, both event types need to be generated to make the upper layers happy. https://bugzilla.gnome.org/show_bug.cgi?id=783716
-rw-r--r--gdk/wayland/gdkdevice-wayland.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index e7d5a3bb6f..1f043f61ff 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -3441,6 +3441,9 @@ gdk_wayland_tablet_flush_frame_event (GdkWaylandTabletData *tablet,
sizeof (gdouble) *
gdk_device_get_n_axes (tablet->current_device));
break;
+ case GDK_SCROLL:
+ event->scroll.time = time;
+ break;
case GDK_PROXIMITY_IN:
case GDK_PROXIMITY_OUT:
event->proximity.time = time;
@@ -3862,7 +3865,32 @@ tablet_tool_handle_wheel (void *data,
int32_t degrees,
int32_t clicks)
{
- /* FIXME: Handle wheel */
+ GdkWaylandTabletToolData *tool = data;
+ GdkWaylandTabletData *tablet = tool->current_tablet;
+ GdkWaylandSeat *seat = GDK_WAYLAND_SEAT (tablet->seat);
+ GdkEvent *event;
+
+ GDK_NOTE (EVENTS,
+ g_message ("tablet tool %d wheel %d/%d",
+ gdk_device_tool_get_tool_type (tool->tool), degrees, clicks));
+
+ if (clicks == 0)
+ return;
+
+ /* Send smooth event */
+ event = create_scroll_event (seat, &tablet->pointer_info,
+ tablet->master, tablet->current_device, FALSE);
+ gdk_event_set_device_tool (event, tablet->current_tool->tool);
+ event->scroll.direction = GDK_SCROLL_SMOOTH;
+ event->scroll.delta_y = clicks;
+ _gdk_wayland_display_deliver_event (seat->display, event);
+
+ /* Send discrete event */
+ event = create_scroll_event (seat, &tablet->pointer_info,
+ tablet->master, tablet->current_device, TRUE);
+ gdk_event_set_device_tool (event, tablet->current_tool->tool);
+ event->scroll.direction = (clicks > 0) ? GDK_SCROLL_DOWN : GDK_SCROLL_UP;
+ _gdk_wayland_display_deliver_event (seat->display, event);
}
static void