From 1e3a5716198263e1f9fb0e32d82de13de51e3935 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Wed, 22 Apr 2026 19:50:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor(backend/X11):=20=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=89=B9=E9=87=8F=20effect=20=E4=B8=AD=E7=9A=84=20focus=20?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一批 effect 中可能包含多个 FOCUS_WINDOW,但最终只有一个窗口能获得焦点, 延迟到循环结束后只执行最后一次 focus 调用 --- src/backend/x11/backend.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/x11/backend.c b/src/backend/x11/backend.c index 1f3a0fc..063625d 100644 --- a/src/backend/x11/backend.c +++ b/src/backend/x11/backend.c @@ -453,6 +453,9 @@ bool backend_apply_effect( window_configure_t *cfgs = p_new(window_configure_t, effect_count); size_t cfg_count = 0; + bool focus_window_changed = false; + xcb_window_t focus_window = XCB_WINDOW_NONE; + for (size_t i = 0; i < effect_count; ++i) { const effect_t *e = &effects[i]; switch (e->type) { @@ -463,7 +466,8 @@ bool backend_apply_effect( xcb_unmap_window(conn, e->as.unmap.window); break; case ZDWM_EFFECT_FOCUS_WINDOW: - backend_focus_window(backend, e->as.focus.window); + focus_window = e->as.focus.window; + focus_window_changed = true; break; case ZDWM_EFFECT_MOVE_WINDOW: { window_configure_t *cfg = @@ -514,6 +518,8 @@ bool backend_apply_effect( } p_delete(&cfgs); + if (focus_window_changed) backend_focus_window(backend, focus_window); + xcb_flush(conn); return true; }