From 4428eb056d4eb6e63db07e90ef7774e102e729b5 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 3 Mar 2026 07:18:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=20wm=5Fset=5Fcurrent?= =?UTF-8?q?=5Fmonitor=20=E5=87=BD=E6=95=B0=E5=AE=9E=E7=8E=B0=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=85=89=E6=A0=87=E4=B9=B1=E8=B7=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 wm_set_current_monitor 改为支持 restore_cursor 参数,按场景决定是 否恢复光标位置 - 仅在指针位于当前显示器时更新 cursor_position 缓存,减少错误覆盖 --- src/action.c | 2 +- src/client.c | 4 ++-- src/event.c | 4 ++-- src/wm.c | 15 ++++++++------- src/wm.h | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/action.c b/src/action.c index aa9e231..3eedeed 100644 --- a/src/action.c +++ b/src/action.c @@ -65,7 +65,7 @@ void raise_or_run(const user_action_arg_t *arg) { if (client && client == wm.client_focused) return; if (client) { - wm_set_current_monitor(client->monitor); + wm_set_current_monitor(client->monitor, true); monitor_select_tag(client->monitor, client->tags); client_stack_raise(client); client_focus(client); diff --git a/src/client.c b/src/client.c index 6f9506c..16d9a07 100644 --- a/src/client.c +++ b/src/client.c @@ -295,7 +295,7 @@ void client_send_to_monitor(client_t *client, monitor_t *monitor) { client->tags = monitor->selected_tag->mask; client_add_to_tag(client, monitor->selected_tag); - wm_set_current_monitor(monitor); + wm_set_current_monitor(monitor, true); monitor_arrange(m); monitor_arrange(monitor); monitor_draw_bar(m); @@ -607,7 +607,7 @@ void client_apply_rules(client_t *client, const rule_t rules[], client->tags = t->mask; if (r->switch_to_tag) { - wm_set_current_monitor(m); + wm_set_current_monitor(m, true); m->selected_tag = t; logger("++ switch to tag: %u\n", t->index); diff --git a/src/event.c b/src/event.c index 04eb834..04f8d01 100644 --- a/src/event.c +++ b/src/event.c @@ -34,7 +34,7 @@ static void button_press(xcb_button_press_event_t *ev) { if (!monitor) return; - wm_set_current_monitor(monitor); + wm_set_current_monitor(monitor, false); if (ev->event_x >= monitor->tag_extent.start && ev->event_x <= monitor->tag_extent.end) { click_area = click_tag; @@ -188,7 +188,7 @@ static void client_message(xcb_client_message_event_t *ev) { switch (ev->data.data32[0]) { case 2: /* 来自 pager */ - wm_set_current_monitor(c->monitor); + wm_set_current_monitor(c->monitor, true); monitor_select_tag(c->monitor, t->mask); client_focus(c); break; diff --git a/src/wm.c b/src/wm.c index 3818aae..ec4e55c 100644 --- a/src/wm.c +++ b/src/wm.c @@ -517,18 +517,18 @@ void wm_restack_clients(void) { xcb_flush(wm.xcb_conn); } -void wm_set_current_monitor(monitor_t *monitor) { +void wm_set_current_monitor(monitor_t *monitor, bool restore_cursor) { if (!monitor || wm.current_monitor == monitor) return; point_t point = xcursor_query_pointer_position(); monitor_t *point_monitor = wm_get_monitor_by_point(point); - point_monitor->cursor_position = point; - point_monitor->position_inited = true; + if (point_monitor == wm.current_monitor) { + point_monitor->cursor_position = point; + point_monitor->position_inited = true; + } wm.current_monitor = monitor; - if (point_monitor != monitor) { - monitor_restore_cursor_point(monitor); - } + if (restore_cursor) monitor_restore_cursor_point(monitor); } static inline int intersect(area_t area, monitor_t *m) { @@ -538,7 +538,8 @@ static inline int intersect(area_t area, monitor_t *m) { MAX(area.y, m->geometry.y)); } -monitor_t *__attribute__((returns_nonnull)) wm_get_monitor_by_area(area_t area) { +monitor_t *__attribute__((returns_nonnull)) wm_get_monitor_by_area( + area_t area) { if (wm.current_monitor == nullptr) { fatal("wm_get_monitor_by_area: current monitor is nullptr"); } diff --git a/src/wm.h b/src/wm.h index 3c3e73a..114df34 100644 --- a/src/wm.h +++ b/src/wm.h @@ -57,7 +57,7 @@ extern wm_t wm; void wm_restart(void); void wm_quit(void); void wm_restack_clients(void); -void wm_set_current_monitor(monitor_t *monitor); +void wm_set_current_monitor(monitor_t *monitor, bool restore_cursor); monitor_t *__attribute__((returns_nonnull)) wm_get_monitor_by_area(area_t area); monitor_t *__attribute__((returns_nonnull)) wm_get_monitor_by_point( point_t point);