fix: tablet pen press not focusing windows

This commit is contained in:
werapi 2026-01-07 11:02:19 +01:00 committed by Sqooky
parent 667e69443d
commit abdfc56a2f
No known key found for this signature in database
GPG key ID: 6D5262FD73505E49
2 changed files with 30 additions and 17 deletions

View file

@ -217,15 +217,22 @@ void tablettoolbutton(struct wl_listener *listener, void *data) {
void tablettooltip(struct wl_listener *listener, void *data) { void tablettooltip(struct wl_listener *listener, void *data) {
struct wlr_tablet_tool_tip_event *event = 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) { if (!tablet_curr_surface) {
struct wlr_pointer_button_event fakeptrbtnevent = { wlr_seat_pointer_notify_button(seat, fakeptrbtnevent.time_msec,
.button = BTN_LEFT, fakeptrbtnevent.button,
.state = event->state == WLR_TABLET_TOOL_TIP_UP fakeptrbtnevent.state);
? WL_POINTER_BUTTON_STATE_RELEASED return;
: WL_POINTER_BUTTON_STATE_PRESSED,
.time_msec = event->time_msec,
};
buttonpress(NULL, (void *)&fakeptrbtnevent);
} }
if (event->state == WLR_TABLET_TOOL_TIP_UP) { if (event->state == WLR_TABLET_TOOL_TIP_UP) {

View file

@ -573,6 +573,7 @@ static void axisnotify(struct wl_listener *listener,
void *data); // 滚轮事件处理 void *data); // 滚轮事件处理
static void buttonpress(struct wl_listener *listener, static void buttonpress(struct wl_listener *listener,
void *data); // 鼠标按键事件处理 void *data); // 鼠标按键事件处理
static bool handle_buttonpress(struct wlr_pointer_button_event *event);
static int32_t ongesture(struct wlr_pointer_swipe_end_event *event); static int32_t ongesture(struct wlr_pointer_swipe_end_event *event);
static void swipe_begin(struct wl_listener *listener, void *data); static void swipe_begin(struct wl_listener *listener, void *data);
static void swipe_update(struct wl_listener *listener, void *data); static void swipe_update(struct wl_listener *listener, void *data);
@ -1998,6 +1999,13 @@ bool check_trackpad_disabled(struct wlr_pointer *pointer) {
void // 鼠标按键事件 void // 鼠标按键事件
buttonpress(struct wl_listener *listener, void *data) { buttonpress(struct wl_listener *listener, void *data) {
struct wlr_pointer_button_event *event = 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; struct wlr_keyboard *hard_keyboard, *keyboard;
uint32_t hard_mods, mods; uint32_t hard_mods, mods;
Client *c = NULL; Client *c = NULL;
@ -2013,7 +2021,7 @@ buttonpress(struct wl_listener *listener, void *data) {
wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); wlr_idle_notifier_v1_notify_activity(idle_notifier, seat);
if (check_trackpad_disabled(event->pointer)) { if (check_trackpad_disabled(event->pointer)) {
return; return true;
} }
switch (event->state) { switch (event->state) {
@ -2060,12 +2068,12 @@ buttonpress(struct wl_listener *listener, void *data) {
if (selmon->isoverview && event->button == BTN_LEFT && c) { if (selmon->isoverview && event->button == BTN_LEFT && c) {
toggleoverview(&(Arg){.i = 1}); toggleoverview(&(Arg){.i = 1});
return; return true;
} }
if (selmon->isoverview && event->button == BTN_RIGHT && c) { if (selmon->isoverview && event->button == BTN_RIGHT && c) {
pending_kill_client(c); pending_kill_client(c);
return; return true;
} }
if (CLEANMASK(mods) == CLEANMASK(m->mod) && if (CLEANMASK(mods) == CLEANMASK(m->mod) &&
@ -2073,7 +2081,7 @@ buttonpress(struct wl_listener *listener, void *data) {
(CLEANMASK(m->mod) != 0 || (CLEANMASK(m->mod) != 0 ||
(event->button != BTN_LEFT && event->button != BTN_RIGHT))) { (event->button != BTN_LEFT && event->button != BTN_RIGHT))) {
m->func(&m->arg); m->func(&m->arg);
return; return true;
} }
} }
break; break;
@ -2105,16 +2113,14 @@ buttonpress(struct wl_listener *listener, void *data) {
apply_window_snap(tmpc); apply_window_snap(tmpc);
} }
tmpc->drag_to_tile = false; tmpc->drag_to_tile = false;
return; return true;
} else { } else {
cursor_mode = CurNormal; cursor_mode = CurNormal;
} }
break; break;
} }
/* If the event wasn't handled by the compositor, notify the client with /* If the event wasn't handled by the compositor, return false */
* pointer focus that a button press has occurred */ return false;
wlr_seat_pointer_notify_button(seat, event->time_msec, event->button,
event->state);
} }
void checkidleinhibitor(struct wlr_surface *exclude) { void checkidleinhibitor(struct wlr_surface *exclude) {