From 41f82d703997caec091d3da5803869fbc1f44147 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Mon, 15 Jun 2026 19:50:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(bar):=20=E5=9C=A8=20workspace=20=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=9C=AB=E5=B0=BE=E6=98=BE=E7=A4=BA=E5=BD=93=E5=89=8D?= =?UTF-8?q?=20workspace=20=E5=B8=83=E5=B1=80=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bar/bar.c | 2 ++ src/bar/workspaces.c | 27 ++++++++++++++++++++++++--- src/bar/workspaces.h | 2 ++ src/config/defaults.c | 2 ++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/bar/bar.c b/src/bar/bar.c index 5875249..18f2a56 100644 --- a/src/bar/bar.c +++ b/src/bar/bar.c @@ -65,6 +65,8 @@ void bar_output_add_workspace( .active_fg = config->tag_active_fg, .urgent_bg = config->tag_urgent_bg, .urgent_fg = config->tag_urgent_fg, + .layout_bg = config->layout_bg, + .layout_fg = config->layout_fg, }; auto item = bar_add_item( bar_output->output_id, diff --git a/src/bar/workspaces.c b/src/bar/workspaces.c index 989930b..db88d1c 100644 --- a/src/bar/workspaces.c +++ b/src/bar/workspaces.c @@ -14,6 +14,7 @@ typedef struct bar_workspace_t { zdwm_workspace_t info; + zdwm_layout_notify_t layout; size_t window_count; size_t urgent_window_count; } bar_workspace_t; @@ -101,9 +102,9 @@ static void bar_workspaces_update( auto data = (bar_workspace_state_t *)state; if (!data->list_inited || !data->active_inited || !data->dirty) return; - if (data->count != cell_api->get_cell_count(item)) { - cell_api->set_cell_count(item, data->count); - } + /* 当前 workspace 的 layout 指示器放在最后 */ + cell_api->set_cell_count(item, data->count + 1); + auto layout_index = data->count; auto config = &data->config; for (size_t i = 0; i < data->count; ++i) { @@ -121,6 +122,11 @@ static void bar_workspaces_update( if (info->id == data->workspace_id) { cell_api->cell_set_bg(item, i, config->active_bg); cell_api->cell_set_fg(item, i, config->active_fg); + + cell_api->cell_set_bg(item, layout_index, config->layout_bg); + cell_api->cell_set_fg(item, layout_index, config->layout_fg); + cell_api->cell_set_text(item, layout_index, workspace->layout.symbol); + continue; } @@ -213,6 +219,20 @@ static void bar_workspace_active_updated( state->dirty = true; } +static void +bar_workspace_layout_notify(zdwm_layout_notify_t layout, void *user_data) { + auto state = (bar_workspace_state_t *)user_data; + + for (size_t i = 0; i < state->count; ++i) { + auto workspace = &state->workspaces[i]; + if (workspace->info.id == layout.workspace) { + workspace->layout = layout; + state->dirty = true; + return; + } + } +} + void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) { auto state = (bar_workspace_state_t *)user_data; @@ -271,6 +291,7 @@ void bar_workspace_add_listeners(listeners_t *listeners, void *state) { ADD(listeners_add_initial_workspace_listener, bar_workspace_list_filter); ADD(listeners_add_active_workspace_listener, bar_workspace_active_updated); + ADD(listeners_add_layout_notify, bar_workspace_layout_notify); ADD(listeners_add_initial_window_listener, bar_workspace_initial_windows); ADD(listeners_add_window_added_listener, bar_workspace_window_added); ADD(listeners_add_window_updated_listener, bar_workspace_window_updated); diff --git a/src/bar/workspaces.h b/src/bar/workspaces.h index 0553796..d8957ee 100644 --- a/src/bar/workspaces.h +++ b/src/bar/workspaces.h @@ -14,6 +14,8 @@ typedef struct bar_workspace_config_t { const char *active_fg; const char *urgent_bg; const char *urgent_fg; + const char *layout_bg; + const char *layout_fg; } bar_workspace_config_t; extern zdwm_bar_item_type_t bar_workspace; diff --git a/src/config/defaults.c b/src/config/defaults.c index 08dd524..2e35436 100644 --- a/src/config/defaults.c +++ b/src/config/defaults.c @@ -187,6 +187,8 @@ bool config_defaults_build( .tag_active_fg = "#eeeeee", .tag_urgent_bg = "#222222", .tag_urgent_fg = "#ff0000", + .layout_bg = "#222222", + .layout_fg = "#bbbbbb", }; api->set_bar_config(builder, bar_config);