From 62f6bab6112e9231432db1f859cb08cfd2d5d5e1 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Mon, 8 Jun 2026 01:24:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(bar):=20=E6=96=B0=E5=A2=9E=20text=20?= =?UTF-8?q?=E6=96=87=E5=AD=97=E6=8E=92=E7=89=88=E6=A8=A1=E5=9D=97=E5=B9=B6?= =?UTF-8?q?=E5=B0=86=E5=85=B6=E9=9B=86=E6=88=90=E5=88=B0=20bar=20=E7=94=9F?= =?UTF-8?q?=E5=91=BD=E5=91=A8=E6=9C=9F=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 3 +++ src/bar/bar.c | 7 +++++ src/bar/bar.h | 2 ++ src/bar/text.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/bar/text.h | 9 +++++++ 5 files changed, 90 insertions(+) create mode 100644 src/bar/text.c create mode 100644 src/bar/text.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 51e63dd..94e9d90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ add_executable(${APP_NAME} ${SOURCE_DIR}/bar/bar.c ${SOURCE_DIR}/bar/cell.c + ${SOURCE_DIR}/bar/text.c ${SOURCE_DIR}/bar/workspaces.c ${SOURCE_DIR}/base/color.c @@ -81,6 +82,8 @@ pkg_check_modules(deps REQUIRED cairo cairo-xcb + pango + pangocairo ) target_include_directories(${APP_NAME} SYSTEM diff --git a/src/bar/bar.c b/src/bar/bar.c index baf65b0..2604e2a 100644 --- a/src/bar/bar.c +++ b/src/bar/bar.c @@ -5,6 +5,7 @@ #include #include +#include "bar/text.h" #include "bar/types.h" #include "bar/workspaces.h" #include "base/array.h" @@ -59,6 +60,9 @@ void bar_output_add_workspace( } void bar_init(bar_t *bar) { + auto c = &bar->config; + bar->ctx = text_context_create(c->font_family, c->font_size, c->dpi); + for (size_t i = 0; i < bar->count; ++i) { auto bar_output = &bar->bars[i]; bar_output_add_workspace(bar_output, &bar->config); @@ -73,6 +77,9 @@ static void bar_side_cleanup(bar_side_t *side) { } void bar_cleanup(bar_t *bar) { + text_context_destory(bar->ctx); + bar->ctx = nullptr; + 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) { diff --git a/src/bar/bar.h b/src/bar/bar.h index a456be9..cb13aa9 100644 --- a/src/bar/bar.h +++ b/src/bar/bar.h @@ -5,6 +5,7 @@ #include #include +#include "bar/text.h" #include "bar/types.h" #include "base/color.h" @@ -27,6 +28,7 @@ typedef struct bar_t { zdwm_bar_config_t config; bar_palette_t palette; + text_context_t *ctx; } bar_t; void bar_init(bar_t *bar); diff --git a/src/bar/text.c b/src/bar/text.c new file mode 100644 index 0000000..18c219a --- /dev/null +++ b/src/bar/text.c @@ -0,0 +1,69 @@ +#include "bar/text.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "base/memory.h" + +struct text_context_t { + PangoContext *context; + PangoLayout *layout; + PangoAttrList *attr_list; +}; + +text_context_t * +text_context_create(const char *family, uint32_t size, uint32_t dpi) { + auto fontmap = pango_cairo_font_map_new(); + auto context = pango_font_map_create_context(fontmap); + pango_cairo_context_set_resolution(context, (double)dpi); + + auto desc = pango_font_description_from_string(family); + pango_font_description_set_size(desc, size * PANGO_SCALE); + auto attr = pango_attr_font_desc_new(desc); + + auto attr_list = pango_attr_list_new(); + pango_attr_list_insert(attr_list, attr); + + auto layout = pango_layout_new(context); + pango_layout_set_attributes(layout, attr_list); + pango_layout_set_wrap(layout, PANGO_WRAP_NONE); + pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); + + pango_font_description_free(desc); + g_object_unref(fontmap); + + auto ctx = p_new(text_context_t, 1); + *ctx = (text_context_t){ + .context = context, + .layout = layout, + .attr_list = attr_list, + }; + + return ctx; +} + +void text_context_destory(text_context_t *context) { + if (!context) return; + + if (context->layout) { + g_object_unref(context->layout); + context->layout = nullptr; + } + + if (context->attr_list) { + pango_attr_list_unref(context->attr_list); + context->attr_list = nullptr; + } + + if (context->context) { + g_object_unref(context->context); + context->context = nullptr; + } + + p_delete(&context); +} diff --git a/src/bar/text.h b/src/bar/text.h new file mode 100644 index 0000000..0f74479 --- /dev/null +++ b/src/bar/text.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +typedef struct text_context_t text_context_t; + +text_context_t * +text_context_create(const char *family, uint32_t size, uint32_t dpi); +void text_context_destory(text_context_t *context);