From fed04cbffcad0a49b02940bbcde9956b4250e4fe Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Mon, 8 Jun 2026 00:35:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor(bar):=20=E9=9A=90=E8=97=8F=20workspace?= =?UTF-8?q?s=20=E6=A8=A1=E5=9D=97=E5=86=85=E9=83=A8=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E4=BB=85=E4=BF=9D=E7=95=99=E5=BF=85=E8=A6=81=E7=9A=84=E5=AF=B9?= =?UTF-8?q?=E5=A4=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/zdwm/bar.h | 10 +++++ src/bar/types.h | 15 ++----- src/bar/workspaces.c | 101 +++++++++++++++++++++++++++++++------------ src/bar/workspaces.h | 70 ++++-------------------------- 4 files changed, 97 insertions(+), 99 deletions(-) diff --git a/include/zdwm/bar.h b/include/zdwm/bar.h index de973f8..f59013c 100644 --- a/include/zdwm/bar.h +++ b/include/zdwm/bar.h @@ -21,6 +21,16 @@ typedef struct zdwm_bar_config_t { const char *bg; const char *fg; + + uint32_t tag_cell_padding_x; + uint32_t tag_indicator_width; + const char *tag_bg; + const char *tag_fg; + const char *tag_active_bg; + const char *tag_active_fg; + const char *tag_urgent_bg; + const char *tag_urgent_fg; + const char *layout_bg; const char *layout_fg; const char *binding_mode_bg; diff --git a/src/bar/types.h b/src/bar/types.h index 1073b65..28ebe16 100644 --- a/src/bar/types.h +++ b/src/bar/types.h @@ -26,9 +26,11 @@ struct zdwm_bar_item_t { bar_cell_t *cells; size_t count; bar_x_region_t region; + uint32_t cell_padding; + uint32_t indicator_width; + void *state; - uint8_t cell_padding; - uint8_t indicator_width; + zdwm_bar_item_type_t api; bool dirty; }; @@ -39,12 +41,3 @@ typedef struct bar_side_t { size_t capacity; bar_x_region_t region; } bar_side_t; - -typedef struct bars_t { - size_t count; - int32_t height; - bool show_top; /* 如果为 false 则 bar 显示屏幕底部 */ - bool visible; - - zdwm_bar_config_t config; -} bars_t; diff --git a/src/bar/workspaces.c b/src/bar/workspaces.c index 17b6dd0..4eb902d 100644 --- a/src/bar/workspaces.c +++ b/src/bar/workspaces.c @@ -10,6 +10,31 @@ #include "base/array.h" #include "base/memory.h" +#include "core/listeners.h" + +typedef struct bar_workspace_t { + zdwm_workspace_t info; + size_t window_count; + size_t urgent_window_count; +} bar_workspace_t; + +typedef struct bar_workspace_state_t { + zdwm_output_id_t output_id; + zdwm_workspace_id_t workspace_id; + bar_workspace_t *workspaces; + size_t count; + size_t capacity; + + zdwm_window_t *windows; + size_t window_count; + size_t window_capacity; + + bar_workspace_config_t config; + + bool list_inited; + bool active_inited; + bool dirty; +} bar_workspace_state_t; static size_t state_workspace_get_urgent_window_count( const bar_workspace_state_t *state, @@ -55,18 +80,19 @@ static zdwm_window_t *state_get_window( return nullptr; } -void *bar_workspaces_create_state(zdwm_output_id_t output_id, void *config) { - const bar_workspace_palette_t *palette = config; - assert(palette); +static void * +bar_workspaces_create_state(zdwm_output_id_t output_id, void *config) { + const bar_workspace_config_t *workspace_config = config; + assert(workspace_config); auto state = p_new(bar_workspace_state_t, 1); state->output_id = output_id; - state->palette = *palette; + state->config = *workspace_config; return state; } -void bar_workspaces_update( +static void bar_workspaces_update( zdwm_bar_item_t *item, const zdwm_bar_cell_api_t *cell_api, void *state @@ -78,7 +104,7 @@ void bar_workspaces_update( cell_api->set_cell_count(item, data->count); } - auto palette = &data->palette; + auto config = &data->config; for (size_t i = 0; i < data->count; ++i) { auto workspace = &data->workspaces[i]; auto info = &workspace->info; @@ -92,25 +118,25 @@ void bar_workspaces_update( cell_api->cell_set_text(item, i, info->name); if (info->id == data->workspace_id) { - cell_api->cell_set_bg(item, i, palette->active_bg); - cell_api->cell_set_fg(item, i, palette->active_fg); + cell_api->cell_set_bg(item, i, config->active_bg); + cell_api->cell_set_fg(item, i, config->active_fg); continue; } if (workspace->urgent_window_count > 0) { - cell_api->cell_set_bg(item, i, palette->urgent_bg); - cell_api->cell_set_fg(item, i, palette->urgent_fg); + cell_api->cell_set_bg(item, i, config->urgent_bg); + cell_api->cell_set_fg(item, i, config->urgent_fg); continue; } - cell_api->cell_set_bg(item, i, palette->bg); - cell_api->cell_set_fg(item, i, palette->fg); + cell_api->cell_set_bg(item, i, config->bg); + cell_api->cell_set_fg(item, i, config->fg); } data->dirty = false; } -zdwm_action_t bar_workspace_on_click( +static zdwm_action_t bar_workspace_on_click( zdwm_bar_item_t *item, size_t cell_index, int32_t x, @@ -129,13 +155,21 @@ zdwm_action_t bar_workspace_on_click( }; } -void bar_workspace_destroy_state(void *state) { +static void bar_workspace_destroy_state(void *state) { auto data = (bar_workspace_state_t *)state; p_delete(&data->workspaces); p_clear(data, 1); } -void bar_workspace_list_filter( +zdwm_bar_item_type_t bar_workspace = { + .create_state = bar_workspaces_create_state, + .update = bar_workspaces_update, + .on_click = bar_workspace_on_click, + .destroy_state = bar_workspace_destroy_state, + .update_interval_ms = 0, +}; + +static void bar_workspace_list_filter( const zdwm_workspace_t *list, size_t count, void *user_data @@ -155,7 +189,7 @@ void bar_workspace_list_filter( state->dirty = true; } -void bar_workspace_active_updated( +static void bar_workspace_active_updated( zdwm_output_id_t output_id, zdwm_workspace_id_t workspace_id, void *user_data @@ -170,17 +204,6 @@ void bar_workspace_active_updated( state->dirty = true; } -void bar_workspace_initial_windows( - const zdwm_window_t *list, - size_t count, - void *user_data -) { - for (size_t i = 0; i < count; ++i) { - auto window = &list[i]; - bar_workspace_window_added(window, user_data); - } -} - void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) { auto state = (bar_workspace_state_t *)user_data; @@ -191,6 +214,17 @@ void bar_workspace_window_added(const zdwm_window_t *window, void *user_data) { state->dirty = true; } +static void bar_workspace_initial_windows( + const zdwm_window_t *list, + size_t count, + void *user_data +) { + for (size_t i = 0; i < count; ++i) { + auto window = &list[i]; + bar_workspace_window_added(window, user_data); + } +} + void bar_workspace_window_updated( const zdwm_window_t *window, void *user_data @@ -222,3 +256,16 @@ void bar_workspace_window_removed(zdwm_window_id_t window_id, void *user_data) { state->dirty = true; } } + +void bar_workspace_add_listeners(listeners_t *listeners, void *state) { +#define ADD(ADD_FN, LISTENER) ADD_FN(listeners, LISTENER, state) + + ADD(listeners_add_initial_workspace_listener, bar_workspace_list_filter); + ADD(listeners_add_active_workspace_listener, bar_workspace_active_updated); + 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); + ADD(listeners_add_window_removed_listener, bar_workspace_window_removed); + +#undef ADD +} diff --git a/src/bar/workspaces.h b/src/bar/workspaces.h index 066dd4b..0553796 100644 --- a/src/bar/workspaces.h +++ b/src/bar/workspaces.h @@ -1,73 +1,21 @@ #pragma once -#include -#include +#include #include -#include -#include -typedef struct bar_workspace_palette_t { +#include "core/listeners.h" + +typedef struct bar_workspace_config_t { + uint32_t cell_padding; + uint32_t indicator_width; const char *bg; const char *fg; const char *active_bg; const char *active_fg; const char *urgent_bg; const char *urgent_fg; -} bar_workspace_palette_t; +} bar_workspace_config_t; -typedef struct bar_workspace_t { - zdwm_workspace_t info; - size_t window_count; - size_t urgent_window_count; -} bar_workspace_t; +extern zdwm_bar_item_type_t bar_workspace; -typedef struct bar_workspace_state_t { - zdwm_output_id_t output_id; - zdwm_workspace_id_t workspace_id; - bar_workspace_t *workspaces; - size_t count; - size_t capacity; - - zdwm_window_t *windows; - size_t window_count; - size_t window_capacity; - - bar_workspace_palette_t palette; - - bool list_inited; - bool active_inited; - bool dirty; -} bar_workspace_state_t; - -void *bar_workspaces_create_state(zdwm_output_id_t output_id, void *config); -void bar_workspaces_update( - zdwm_bar_item_t *item, - const zdwm_bar_cell_api_t *cell_api, - void *state -); -zdwm_action_t bar_workspace_on_click( - zdwm_bar_item_t *item, - size_t cell_index, - int32_t x, - void *state -); -void bar_workspace_destroy_state(void *state); - -void bar_workspace_list_filter( - const zdwm_workspace_t *list, - size_t count, - void *user_data -); -void bar_workspace_active_updated( - zdwm_output_id_t output_id, - zdwm_workspace_id_t workspace_id, - void *user_data -); -void bar_workspace_initial_windows( - const zdwm_window_t *list, - size_t count, - void *user_data -); -void bar_workspace_window_added(const zdwm_window_t *window, void *user_data); -void bar_workspace_window_updated(const zdwm_window_t *window, void *user_data); -void bar_workspace_window_removed(zdwm_window_id_t window_id, void *user_data); +void bar_workspace_add_listeners(listeners_t *listeners, void *state);