From 1ec92ec3e2993668ced654b60e1eaf74b73a2164 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Wed, 11 Mar 2026 06:45:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20=5FNET=5FWM=5F?= =?UTF-8?q?STATE=5FSKIP=5FTASKBAR=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 skip_taskbar 字段到 client_t - 在 client_update_window_type 中检测并设置 skip_taskbar 状态 - 状态栏绘制时过滤 skip_taskbar 窗口 --- src/atoms-list.txt | 1 + src/client.c | 1 + src/monitor.c | 7 ++++++- src/types.h | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/atoms-list.txt b/src/atoms-list.txt index 757f5a7..d7a5ea1 100644 --- a/src/atoms-list.txt +++ b/src/atoms-list.txt @@ -27,6 +27,7 @@ _NET_WM_STATE _NET_WM_STATE_FULLSCREEN _NET_WM_STATE_MAXIMIZED_HORZ _NET_WM_STATE_MAXIMIZED_VERT +_NET_WM_STATE_SKIP_TASKBAR _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_DIALOG _NET_SUPPORTED diff --git a/src/client.c b/src/client.c index 88e565f..ff637cb 100644 --- a/src/client.c +++ b/src/client.c @@ -366,6 +366,7 @@ void client_update_window_type(client_t *client) { if (state_reply) { xcb_atom_t state = *(xcb_atom_t *)xcb_get_property_value(state_reply); + client->skip_taskbar = state == _NET_WM_STATE_SKIP_TASKBAR; if (state == _NET_WM_STATE_FULLSCREEN) { client_set_fullscreen(client, true); } diff --git a/src/monitor.c b/src/monitor.c index 2fc2c30..27dd5be 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -350,7 +350,10 @@ static void monitor_draw_tasks(monitor_t *monitor, int16_t right_edge) { if (!task_list) return; uint16_t task_count = 0; - for (task_in_tag_t *task = task_list; task; task = task->next) ++task_count; + for (task_in_tag_t *task = task_list; task; task = task->next) { + if (task->client->skip_taskbar) continue; + ++task_count; + }; if (task_count == 0) return; int16_t x = monitor->layout_symbol_extent.end; @@ -361,6 +364,8 @@ static void monitor_draw_tasks(monitor_t *monitor, int16_t right_edge) { if (task_width < wm.font_size) return; for (task_in_tag_t *task = task_list; task; task = task->next) { + if (task->client->skip_taskbar) continue; + task->bar_extent.start = x; task->bar_extent.end = x + task_width; x += task_width; diff --git a/src/types.h b/src/types.h index 9694d12..6c2aff1 100644 --- a/src/types.h +++ b/src/types.h @@ -38,6 +38,7 @@ struct client_t { bool minimize; bool sticky; bool urgent; + bool skip_taskbar; bool size_freeze; /* 尺寸冻结窗口一定是浮动窗口 */ char *class, *instance; From 123fe77bbbb00af28ffd1a39e6445749fc112834 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Wed, 11 Mar 2026 06:46:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20focus=5Fin?= =?UTF-8?q?=20=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除独立的 focus_in 事件处理器 - 在 enter_notify 中直接调用 wm_set_current_monitor --- src/event.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/event.c b/src/event.c index 77195bb..f148e3b 100644 --- a/src/event.c +++ b/src/event.c @@ -317,12 +317,7 @@ static void enter_notify(xcb_enter_notify_event_t *ev) { if (!client || wm.client_focused == client) return; client_focus(client); -} - -static void focus_in(xcb_focus_in_event_t *ev) { - client_t *client = client_get_by_window(ev->event); - if (!client) return; - wm_set_current_monitor(client->monitor, ev->mode != XCB_NOTIFY_MODE_NORMAL); + wm_set_current_monitor(client->monitor, false); } static void selection_clear(xcb_selection_clear_event_t *ev) { @@ -353,7 +348,6 @@ static void handle_xcb_event(xcb_generic_event_t *event) { EVENT(XCB_UNMAP_NOTIFY, unmap_notify); EVENT(XCB_DESTROY_NOTIFY, destroy_notify); EVENT(XCB_ENTER_NOTIFY, enter_notify); - EVENT(XCB_FOCUS_IN, focus_in); EVENT(XCB_SELECTION_CLEAR, selection_clear); #undef EVENT