diff options
author | Jason Gerecke <killertofu@gmail.com> | 2017-06-12 15:41:51 -0700 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2017-07-20 14:27:28 +0200 |
commit | 837c2002e9e1acdf44c304aaa123bd8b7e4740d4 (patch) | |
tree | 23a24a2929a4064c0766060a1d09f0016fc5676a | |
parent | 3be5aae56a6849254c149a81fd2e85a93c94ea8a (diff) | |
download | gtk+-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.c | 30 |
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 |