From 3a8c392d9014623949ad3be8601ea84c11e92979 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Mon, 8 Jun 2026 01:21:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(bar):=20=E5=AE=9E=E7=8E=B0=20bar=20?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=92=8C=E6=B8=85=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=B9=B6=E5=B0=86=E5=85=B6=E9=9B=86=E6=88=90=E5=88=B0?= =?UTF-8?q?=20runtime=20=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 1 + src/bar/bar.c | 87 +++++++++++++++++++++++++++++++++++++++++++ src/bar/bar.h | 3 ++ src/runtime/runtime.c | 4 ++ 4 files changed, 95 insertions(+) create mode 100644 src/bar/bar.c diff --git a/CMakeLists.txt b/CMakeLists.txt index f94870a..51e63dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ add_executable(${APP_NAME} ${SOURCE_DIR}/backend/x11/event.c ${SOURCE_DIR}/backend/x11/window.c + ${SOURCE_DIR}/bar/bar.c ${SOURCE_DIR}/bar/cell.c ${SOURCE_DIR}/bar/workspaces.c diff --git a/src/bar/bar.c b/src/bar/bar.c new file mode 100644 index 0000000..baf65b0 --- /dev/null +++ b/src/bar/bar.c @@ -0,0 +1,87 @@ +#include "bar/bar.h" + +#include +#include +#include +#include + +#include "bar/types.h" +#include "bar/workspaces.h" +#include "base/array.h" +#include "base/memory.h" + +static zdwm_bar_item_t *bar_add_item( + bar_output_t *bar_output, + zdwm_bar_side_type_t side_type, + zdwm_bar_item_type_t item_type, + void *config +) { + auto side = &bar_output->sides[side_type]; + auto item = array_push(side->items, side->count, side->capacity); + item->api = item_type; + + auto create_state = item_type.create_state; + if (create_state) item->state = create_state(bar_output->output_id, config); + + return item; +} + +static void bar_item_cleanup(zdwm_bar_item_t *item) { + auto destroy_state = item->api.destroy_state; + if (destroy_state) destroy_state(item->state); + item->state = nullptr; + + p_delete(&item->cells); + p_clear(item, 1); +} + +#define VALUE(value, fallback) ((value) ? (value) : (fallback)) + +void bar_output_add_workspace( + bar_output_t *bar_output, + zdwm_bar_config_t *config +) { + auto side = ZDWM_BAR_SIDE_LEFT; + + bar_workspace_config_t workspace_config = { + .cell_padding = VALUE(config->tag_cell_padding_x, config->padding_x), + .indicator_width = VALUE(config->tag_indicator_width, 4), + .bg = VALUE(config->tag_bg, config->bg), + .fg = VALUE(config->tag_fg, config->fg), + .active_bg = config->tag_active_bg, + .active_fg = config->tag_active_fg, + .urgent_bg = config->tag_urgent_bg, + .urgent_fg = config->tag_urgent_fg, + }; + auto item = bar_add_item(bar_output, side, bar_workspace, &workspace_config); + item->cell_padding = workspace_config.cell_padding; + item->indicator_width = workspace_config.indicator_width; +} + +void bar_init(bar_t *bar) { + for (size_t i = 0; i < bar->count; ++i) { + auto bar_output = &bar->bars[i]; + bar_output_add_workspace(bar_output, &bar->config); + } +} + +static void bar_side_cleanup(bar_side_t *side) { + for (size_t i = 0; i < side->count; ++i) bar_item_cleanup(&side->items[i]); + + p_delete(&side->items); + p_clear(side, 1); +} + +void bar_cleanup(bar_t *bar) { + for (size_t i = 0; i < bar->count; ++i) { + auto bar_output = &bar->bars[i]; + for (size_t j = 0; j < ZDWM_BAR_SIDE_COUNT; ++j) { + auto side = &bar_output->sides[j]; + bar_side_cleanup(side); + } + cairo_destroy(bar_output->cr); + bar_output->cr = nullptr; + } + p_delete(&bar->bars); + bar->count = 0; +} diff --git a/src/bar/bar.h b/src/bar/bar.h index a2d453f..a456be9 100644 --- a/src/bar/bar.h +++ b/src/bar/bar.h @@ -28,3 +28,6 @@ typedef struct bar_t { zdwm_bar_config_t config; bar_palette_t palette; } bar_t; + +void bar_init(bar_t *bar); +void bar_cleanup(bar_t *bar); diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 5634222..9484d0e 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -150,6 +150,8 @@ static void runtime_shutdown(runtime_t *runtime) { runtime->backend = nullptr; if (runtime->config_module_handle) dlclose(runtime->config_module_handle); runtime->config_module_handle = nullptr; + + bar_cleanup(&runtime->bar); } static void runtime_notify_initial_state(runtime_t *runtime) { @@ -225,6 +227,8 @@ static void runtime_init_bar(runtime_t *runtime) { bar_output->window_id = bar_window.window_id; bar_output->output_id = output->id; } + + bar_init(&runtime->bar); } static void runtime_setup(runtime_t *runtime) {