From f7e050c58f61a15bf5987e2e3d280a72666f6381 Mon Sep 17 00:00:00 2001 From: Tudor Brindus Date: Thu, 4 Jun 2020 00:31:19 -0400 Subject: [PATCH] input/cursor: refactor tablet tool tip events into seatops This commit moves tool tip event generation into seatops. In doing so, some corner cases where we'd erroneously (but likely harmlessly) generate both tablet and pointer events simultaneously are eliminated. --- sway/input/cursor.c | 45 ++++++++++++++++--------------------- sway/input/seatop_default.c | 6 ++++- sway/input/seatop_down.c | 1 + 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 85d0e825..1a211c3b 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -663,37 +663,30 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) { node_at_coords(seat, cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); - if (!surface || !wlr_surface_accepts_tablet_v2(tablet_v2, surface)) { - // If we started holding the tool tip down on a surface that accepts tablet - // v2, we should notify that surface if it gets released over a surface that - // doesn't support v2. - if (event->state == WLR_TABLET_TOOL_TIP_UP) { - wlr_tablet_v2_tablet_tool_notify_up(sway_tool->tablet_v2_tool); - } - - cursor->simulating_pointer_from_tool_tip = event->state == WLR_TABLET_TOOL_TIP_DOWN; + if (cursor->simulating_pointer_from_tool_tip && + event->state == WLR_TABLET_TOOL_TIP_UP) { + cursor->simulating_pointer_from_tool_tip = false; dispatch_cursor_button(cursor, event->device, event->time_msec, - BTN_LEFT, cursor->simulating_pointer_from_tool_tip ? - WLR_BUTTON_PRESSED : WLR_BUTTON_RELEASED); + BTN_LEFT, WLR_BUTTON_RELEASED); wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat); transaction_commit_dirty(); - return; - } - - if (event->state == WLR_TABLET_TOOL_TIP_DOWN) { - wlr_tablet_v2_tablet_tool_notify_down(sway_tool->tablet_v2_tool); - wlr_tablet_tool_v2_start_implicit_grab(sway_tool->tablet_v2_tool); - } else { - if (cursor->simulating_pointer_from_tool_tip) { - dispatch_cursor_button(cursor, event->device, event->time_msec, BTN_LEFT, - WLR_BUTTON_RELEASED); - cursor->simulating_pointer_from_tool_tip = false; + } else if (!surface || !wlr_surface_accepts_tablet_v2(tablet_v2, surface)) { + // If we started holding the tool tip down on a surface that accepts + // tablet v2, we should notify that surface if it gets released over a + // surface that doesn't support v2. + if (event->state == WLR_TABLET_TOOL_TIP_UP) { + seatop_tablet_tool_tip(seat, sway_tool, event->time_msec, + WLR_TABLET_TOOL_TIP_UP); + } else { + cursor->simulating_pointer_from_tool_tip = true; + dispatch_cursor_button(cursor, event->device, event->time_msec, + BTN_LEFT, WLR_BUTTON_PRESSED); + wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat); + transaction_commit_dirty(); } - - wlr_tablet_v2_tablet_tool_notify_up(sway_tool->tablet_v2_tool); + } else { + seatop_tablet_tool_tip(seat, sway_tool, event->time_msec, event->state); } - - seatop_tablet_tool_tip(seat, sway_tool, event->time_msec, event->state); } static struct sway_tablet *get_tablet_for_device(struct sway_cursor *cursor, diff --git a/sway/input/seatop_default.c b/sway/input/seatop_default.c index 048bad75..072f4396 100644 --- a/sway/input/seatop_default.c +++ b/sway/input/seatop_default.c @@ -201,8 +201,12 @@ static void state_add_button(struct seatop_default_event *e, uint32_t button) { static void handle_tablet_tool_tip(struct sway_seat *seat, struct sway_tablet_tool *tool, uint32_t time_msec, enum wlr_tablet_tool_tip_state state) { - if (state != WLR_TABLET_TOOL_TIP_DOWN) { + if (state == WLR_TABLET_TOOL_TIP_UP) { + wlr_tablet_v2_tablet_tool_notify_up(tool->tablet_v2_tool); return; + } else if (state == WLR_TABLET_TOOL_TIP_DOWN) { + wlr_tablet_v2_tablet_tool_notify_down(tool->tablet_v2_tool); + wlr_tablet_tool_v2_start_implicit_grab(tool->tablet_v2_tool); } struct sway_cursor *cursor = seat->cursor; diff --git a/sway/input/seatop_down.c b/sway/input/seatop_down.c index dd8be6bf..0d24f480 100644 --- a/sway/input/seatop_down.c +++ b/sway/input/seatop_down.c @@ -54,6 +54,7 @@ static void handle_tablet_tool_tip(struct sway_seat *seat, struct sway_tablet_tool *tool, uint32_t time_msec, enum wlr_tablet_tool_tip_state state) { if (state == WLR_TABLET_TOOL_TIP_UP) { + wlr_tablet_v2_tablet_tool_notify_up(tool->tablet_v2_tool); seatop_begin_default(seat); } }