From 94d3aa669f27ae926ab80ef7b474b92ec6f77521 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Mon, 22 Dec 2025 08:43:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=AA=97=E5=8F=A3=E5=88=9B?= =?UTF-8?q?=E5=BB=BA/=E9=94=80=E6=AF=81=E5=92=8C=E5=88=87=E6=8D=A2=20tag?= =?UTF-8?q?=20=E6=97=B6=E7=9A=84=E7=AA=97=E5=8F=A3=E7=84=A6=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client.c | 8 ++++++++ src/monitor.c | 15 +++++++++++++++ src/monitor.h | 1 + 3 files changed, 24 insertions(+) diff --git a/src/client.c b/src/client.c index add6030..3801f2c 100644 --- a/src/client.c +++ b/src/client.c @@ -191,6 +191,8 @@ void client_manage(xcb_window_t window, monitor_arrange(c->monitor); monitor_draw_bar(c->monitor); + if (c->tags & c->monitor->selected_tag->mask) client_focus(c); + xcb_flush(wm.xcb_conn); } @@ -277,6 +279,7 @@ void client_unmanage(client_t *client) { client_wipe(client); + monitor_deal_focus(m); monitor_arrange(m); monitor_draw_bar(m); xcb_flush(wm.xcb_conn); @@ -295,6 +298,11 @@ void client_apply_task_geometry(client_t *client, task_in_tag_t *task) { } } +void client_focus(client_t *client) { + wm.client_focused = client; + xwindow_focus(client ? client->window : XCB_WINDOW_NONE); +} + bool client_is_visible(client_t *client) { return client->tags & client->monitor->selected_tag->mask; } diff --git a/src/monitor.c b/src/monitor.c index ce52a80..5864489 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -48,6 +48,19 @@ uint32_t monitor_initialize_tag(monitor_t *monitor, const char **tags, return tag_count; } +void monitor_deal_focus(monitor_t *monitor) { + if (!monitor->selected_tag->task_list) return; + + client_t *client = nullptr; + for (client_t *c = wm.client_stack_list; c; c = c->stack_next) { + if (client_get_task_in_tag(c, monitor->selected_tag)) { + client = c; + break; + } + } + client_focus(client); +} + void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask) { if (monitor->selected_tag->mask == tag_mask) return; @@ -60,6 +73,8 @@ void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask) { break; } } + + monitor_deal_focus(monitor); } static void tag_clean(tag_t *tag) { diff --git a/src/monitor.h b/src/monitor.h index 74895da..756725d 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -6,6 +6,7 @@ uint32_t monitor_initialize_tag(monitor_t *monitor, const char **tags, uint32_t tag_index_start_at); +void monitor_deal_focus(monitor_t *monitor); void monitor_select_tag(monitor_t *monitor, uint32_t tag_mask); void monitor_clean(monitor_t *monitor); void monitor_init_bar(monitor_t *monitor);