From 53f6e6c3151ca4c4e2071679c7ed31e8a8e48bf4 Mon Sep 17 00:00:00 2001 From: werapi Date: Wed, 7 Jan 2026 11:02:19 +0100 Subject: [PATCH] fix: tablet pen press not focusing windows --- src/ext-protocol/tablet.h | 23 +++++++++++++++-------- src/mango.c | 22 ++++++++++++++-------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/ext-protocol/tablet.h b/src/ext-protocol/tablet.h index 2e1f21eb..449a55f6 100644 --- a/src/ext-protocol/tablet.h +++ b/src/ext-protocol/tablet.h @@ -211,15 +211,22 @@ void tablettoolbutton(struct wl_listener *listener, void *data) { void tablettooltip(struct wl_listener *listener, void *data) { struct wlr_tablet_tool_tip_event *event = data; + struct wlr_pointer_button_event fakeptrbtnevent = { + .button = BTN_LEFT, + .state = event->state == WLR_TABLET_TOOL_TIP_UP + ? WL_POINTER_BUTTON_STATE_RELEASED + : WL_POINTER_BUTTON_STATE_PRESSED, + .time_msec = event->time_msec, + }; + + if (handle_buttonpress(&fakeptrbtnevent)) + return; + if (!tablet_curr_surface) { - struct wlr_pointer_button_event fakeptrbtnevent = { - .button = BTN_LEFT, - .state = event->state == WLR_TABLET_TOOL_TIP_UP - ? WL_POINTER_BUTTON_STATE_RELEASED - : WL_POINTER_BUTTON_STATE_PRESSED, - .time_msec = event->time_msec, - }; - buttonpress(NULL, (void *)&fakeptrbtnevent); + wlr_seat_pointer_notify_button(seat, fakeptrbtnevent.time_msec, + fakeptrbtnevent.button, + fakeptrbtnevent.state); + return; } if (event->state == WLR_TABLET_TOOL_TIP_UP) { diff --git a/src/mango.c b/src/mango.c index 8d9b357a..bfbcbdbd 100644 --- a/src/mango.c +++ b/src/mango.c @@ -495,6 +495,7 @@ static void axisnotify(struct wl_listener *listener, void *data); // 滚轮事件处理 static void buttonpress(struct wl_listener *listener, void *data); // 鼠标按键事件处理 +static bool handle_buttonpress(struct wlr_pointer_button_event *event); static int ongesture(struct wlr_pointer_swipe_end_event *event); static void swipe_begin(struct wl_listener *listener, void *data); static void swipe_update(struct wl_listener *listener, void *data); @@ -1770,6 +1771,13 @@ bool check_trackpad_disabled(struct wlr_pointer *pointer) { void // 鼠标按键事件 buttonpress(struct wl_listener *listener, void *data) { struct wlr_pointer_button_event *event = data; + + if (!handle_buttonpress(event)) + wlr_seat_pointer_notify_button(seat, event->time_msec, event->button, + event->state); +} + +bool handle_buttonpress(struct wlr_pointer_button_event *event) { struct wlr_keyboard *hard_keyboard, *keyboard; unsigned int hard_mods, mods; Client *c; @@ -1785,7 +1793,7 @@ buttonpress(struct wl_listener *listener, void *data) { wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); if (check_trackpad_disabled(event->pointer)) { - return; + return true; } switch (event->state) { @@ -1834,12 +1842,12 @@ buttonpress(struct wl_listener *listener, void *data) { event->button == m->button && m->func && (selmon->isoverview == 1 || m->button == BTN_MIDDLE) && c) { m->func(&m->arg); - return; + return true; } else if (CLEANMASK(mods) == CLEANMASK(m->mod) && event->button == m->button && m->func && CLEANMASK(m->mod) != 0) { m->func(&m->arg); - return; + return true; } } break; @@ -1870,16 +1878,14 @@ buttonpress(struct wl_listener *listener, void *data) { apply_window_snap(tmpc); } tmpc->drag_to_tile = false; - return; + return true; } else { cursor_mode = CurNormal; } break; } - /* If the event wasn't handled by the compositor, notify the client with - * pointer focus that a button press has occurred */ - wlr_seat_pointer_notify_button(seat, event->time_msec, event->button, - event->state); + /* If the event wasn't handled by the compositor, return false */ + return false; } void checkidleinhibitor(struct wlr_surface *exclude) {