feat(bar): 在 workspace 列表末尾显示当前 workspace 布局符号

This commit is contained in:
2026-06-15 19:50:42 +08:00
parent d0127f66e4
commit 41f82d7039
4 changed files with 30 additions and 3 deletions

View File

@@ -65,6 +65,8 @@ void bar_output_add_workspace(
.active_fg = config->tag_active_fg, .active_fg = config->tag_active_fg,
.urgent_bg = config->tag_urgent_bg, .urgent_bg = config->tag_urgent_bg,
.urgent_fg = config->tag_urgent_fg, .urgent_fg = config->tag_urgent_fg,
.layout_bg = config->layout_bg,
.layout_fg = config->layout_fg,
}; };
auto item = bar_add_item( auto item = bar_add_item(
bar_output->output_id, bar_output->output_id,

View File

@@ -14,6 +14,7 @@
typedef struct bar_workspace_t { typedef struct bar_workspace_t {
zdwm_workspace_t info; zdwm_workspace_t info;
zdwm_layout_notify_t layout;
size_t window_count; size_t window_count;
size_t urgent_window_count; size_t urgent_window_count;
} bar_workspace_t; } bar_workspace_t;
@@ -101,9 +102,9 @@ static void bar_workspaces_update(
auto data = (bar_workspace_state_t *)state; auto data = (bar_workspace_state_t *)state;
if (!data->list_inited || !data->active_inited || !data->dirty) return; if (!data->list_inited || !data->active_inited || !data->dirty) return;
if (data->count != cell_api->get_cell_count(item)) { /* 当前 workspace 的 layout 指示器放在最后 */
cell_api->set_cell_count(item, data->count); cell_api->set_cell_count(item, data->count + 1);
} auto layout_index = data->count;
auto config = &data->config; auto config = &data->config;
for (size_t i = 0; i < data->count; ++i) { for (size_t i = 0; i < data->count; ++i) {
@@ -121,6 +122,11 @@ static void bar_workspaces_update(
if (info->id == data->workspace_id) { if (info->id == data->workspace_id) {
cell_api->cell_set_bg(item, i, config->active_bg); cell_api->cell_set_bg(item, i, config->active_bg);
cell_api->cell_set_fg(item, i, config->active_fg); 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; continue;
} }
@@ -213,6 +219,20 @@ static void bar_workspace_active_updated(
state->dirty = true; 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) { void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) {
auto state = (bar_workspace_state_t *)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_initial_workspace_listener, bar_workspace_list_filter);
ADD(listeners_add_active_workspace_listener, bar_workspace_active_updated); 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_initial_window_listener, bar_workspace_initial_windows);
ADD(listeners_add_window_added_listener, bar_workspace_window_added); ADD(listeners_add_window_added_listener, bar_workspace_window_added);
ADD(listeners_add_window_updated_listener, bar_workspace_window_updated); ADD(listeners_add_window_updated_listener, bar_workspace_window_updated);

View File

@@ -14,6 +14,8 @@ typedef struct bar_workspace_config_t {
const char *active_fg; const char *active_fg;
const char *urgent_bg; const char *urgent_bg;
const char *urgent_fg; const char *urgent_fg;
const char *layout_bg;
const char *layout_fg;
} bar_workspace_config_t; } bar_workspace_config_t;
extern zdwm_bar_item_type_t bar_workspace; extern zdwm_bar_item_type_t bar_workspace;

View File

@@ -187,6 +187,8 @@ bool config_defaults_build(
.tag_active_fg = "#eeeeee", .tag_active_fg = "#eeeeee",
.tag_urgent_bg = "#222222", .tag_urgent_bg = "#222222",
.tag_urgent_fg = "#ff0000", .tag_urgent_fg = "#ff0000",
.layout_bg = "#222222",
.layout_fg = "#bbbbbb",
}; };
api->set_bar_config(builder, bar_config); api->set_bar_config(builder, bar_config);