]> git.mdlowis.com Git - proto/labwc.git/commitdiff
font: remove arrow character from font buffer
authortokyo4j <hrak1529@gmail.com>
Tue, 3 Dec 2024 07:09:40 +0000 (16:09 +0900)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 14 Dec 2024 20:09:53 +0000 (20:09 +0000)
Arrow signs are specific to submenu items, so they would be more natural
to be handled in menu.c rather than accepting "arrow" in
font_buffer_create().

Also I allowed non-positive numbers for max_width in font_buffer_create(),
in which case the natural font width is used as the buffer width.

include/common/font.h
include/common/scaled-font-buffer.h
src/common/font.c
src/common/scaled-font-buffer.c
src/menu/menu.c
src/ssd/resize-indicator.c
src/ssd/ssd-titlebar.c

index 7684f7e244f553fa780d85d61ed68f58ed5f8e4d..ea7342297ff3d46b9026dfa39a8980c4b64c0e47 100644 (file)
@@ -44,11 +44,10 @@ int font_width(struct font *font, const char *string);
  * @font: font description
  * @color: foreground color in rgba format
  * @bg_color: background color in rgba format
- * @arrow: arrow (utf8) character to show or NULL for none
  */
 void font_buffer_create(struct lab_data_buffer **buffer, int max_width,
        const char *text, struct font *font, const float *color,
-       const float *bg_color, const char *arrow, double scale);
+       const float *bg_color, double scale);
 
 /**
  * font_finish - free some font related resources
index 029a90359b817d7e7c0bf458d0e25c879b223bed..e3de0248b325658790a1114e09c8dca8913dc030 100644 (file)
@@ -18,7 +18,6 @@ struct scaled_font_buffer {
        int max_width;
        float color[4];
        float bg_color[4];
-       char *arrow;
        struct font font;
        struct scaled_scene_buffer *scaled_buffer;
 };
@@ -48,7 +47,7 @@ struct scaled_font_buffer *scaled_font_buffer_create(struct wlr_scene_tree *pare
  */
 void scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
        int max_width, struct font *font, const float *color,
-       const float *bg_color, const char *arrow);
+       const float *bg_color);
 
 /**
  * Update the max width of an existing auto scaling font buffer
index f93e3e882e01de274b98ba7202b23154b163a047..4c406c420dbbbbfe0dd17b550eac7b2284b8d598 100644 (file)
@@ -82,34 +82,19 @@ font_width(struct font *font, const char *string)
 void
 font_buffer_create(struct lab_data_buffer **buffer, int max_width,
        const char *text, struct font *font, const float *color,
-       const float *bg_color, const char *arrow, double scale)
+       const float *bg_color, double scale)
 {
-       /* Allow a minimum of one pixel each for text and arrow */
-       if (max_width < 2) {
-               max_width = 2;
-       }
-
        if (string_null_or_empty(text)) {
                return;
        }
 
        PangoRectangle text_extents = font_extents(font, text);
-       PangoRectangle arrow_extents = font_extents(font, arrow);
-
-       if (arrow) {
-               if (arrow_extents.width >= max_width - 1) {
-                       /* It would be weird to get here, but just in case */
-                       arrow_extents.width = max_width - 1;
-                       text_extents.width = 1;
-               } else {
-                       text_extents.width = max_width - arrow_extents.width;
-               }
-       } else if (text_extents.width > max_width) {
+
+       if (max_width > 0 && text_extents.width > max_width) {
                text_extents.width = max_width;
        }
 
-       *buffer = buffer_create_cairo(text_extents.width + arrow_extents.width,
-                       text_extents.height, scale);
+       *buffer = buffer_create_cairo(text_extents.width, text_extents.height, scale);
        if (!*buffer) {
                wlr_log(WLR_ERROR, "Failed to create font buffer");
                return;
@@ -161,13 +146,6 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width,
        pango_cairo_update_layout(cairo, layout);
        pango_cairo_show_layout(cairo, layout);
 
-       if (arrow) {
-               cairo_move_to(cairo, text_extents.width, 0);
-               pango_layout_set_width(layout, arrow_extents.width * PANGO_SCALE);
-               pango_layout_set_text(layout, arrow, -1);
-               pango_cairo_show_layout(cairo, layout);
-       }
-
        g_object_unref(layout);
 
        cairo_surface_flush(surf);
index 4153ffd241d65f63028ab3ad48ced79ce23beaf1..78849b722f110e52948816c572d551e068ca0595 100644 (file)
@@ -23,7 +23,7 @@ _create_buffer(struct scaled_scene_buffer *scaled_buffer, double scale)
 
        /* Buffer gets free'd automatically along the backing wlr_buffer */
        font_buffer_create(&buffer, self->max_width, self->text,
-               &self->font, self->color, self->bg_color, self->arrow, scale);
+               &self->font, self->color, self->bg_color, scale);
 
        if (!buffer) {
                wlr_log(WLR_ERROR, "font_buffer_create() failed");
@@ -40,7 +40,6 @@ _destroy(struct scaled_scene_buffer *scaled_buffer)
 
        zfree(self->text);
        zfree(self->font.name);
-       zfree(self->arrow);
        free(self);
 }
 
@@ -63,8 +62,7 @@ _equal(struct scaled_scene_buffer *scaled_buffer_a,
                && a->font.slant == b->font.slant
                && a->font.weight == b->font.weight
                && !memcmp(a->color, b->color, sizeof(a->color))
-               && !memcmp(a->bg_color, b->bg_color, sizeof(a->bg_color))
-               && str_equal(a->arrow, b->arrow);
+               && !memcmp(a->bg_color, b->bg_color, sizeof(a->bg_color));
 }
 
 static const struct scaled_scene_buffer_impl impl = {
@@ -95,7 +93,7 @@ scaled_font_buffer_create(struct wlr_scene_tree *parent)
 void
 scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
                int max_width, struct font *font, const float *color,
-               const float *bg_color, const char *arrow)
+               const float *bg_color)
 {
        assert(self);
        assert(text);
@@ -105,7 +103,6 @@ scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
        /* Clean up old internal state */
        zfree(self->text);
        zfree(self->font.name);
-       zfree(self->arrow);
 
        /* Update internal state */
        self->text = xstrdup(text);
@@ -118,7 +115,6 @@ scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
        self->font.weight = font->weight;
        memcpy(self->color, color, sizeof(self->color));
        memcpy(self->bg_color, bg_color, sizeof(self->bg_color));
-       self->arrow = arrow ? xstrdup(arrow) : NULL;
 
        /* Invalidate cache and force a new render */
        scaled_scene_buffer_invalidate_cache(self->scaled_buffer);
index d4194221717f4ac28226a7488d1ad1db856cd078..5f8dbd09f4f7abb9377cd870a607c234c9a3181b 100644 (file)
@@ -168,18 +168,32 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
 
        int arrow_width = item->arrow ?
                font_width(&rc.font_menuitem, item->arrow) : 0;
-       int text_width = bg_width - 2 * theme->menu_items_padding_x - arrow_width;
+       int label_max_width = bg_width - 2 * theme->menu_items_padding_x - arrow_width;
 
        /* Create label */
        struct scaled_font_buffer *label_buffer = scaled_font_buffer_create(tree);
        assert(label_buffer);
-       scaled_font_buffer_update(label_buffer, item->text, text_width,
-               &rc.font_menuitem, text_color, bg_color, item->arrow);
+       scaled_font_buffer_update(label_buffer, item->text, label_max_width,
+               &rc.font_menuitem, text_color, bg_color);
        /* Vertically center and left-align label */
        int x = theme->menu_items_padding_x;
        int y = (theme->menu_item_height - label_buffer->height) / 2;
        wlr_scene_node_set_position(&label_buffer->scene_buffer->node, x, y);
 
+       if (!item->arrow) {
+               return tree;
+       }
+
+       /* Create arrow for submenu items */
+       struct scaled_font_buffer *arrow_buffer = scaled_font_buffer_create(tree);
+       assert(arrow_buffer);
+       scaled_font_buffer_update(arrow_buffer, item->arrow, -1,
+               &rc.font_menuitem, text_color, bg_color);
+       /* Vertically center and right-align arrow */
+       x += label_max_width;
+       y = (theme->menu_item_height - label_buffer->height) / 2;
+       wlr_scene_node_set_position(&arrow_buffer->scene_buffer->node, x, y);
+
        return tree;
 }
 
@@ -298,7 +312,7 @@ title_create_scene(struct menuitem *menuitem, int *item_y)
        assert(title_font_buffer);
        scaled_font_buffer_update(title_font_buffer, menuitem->text,
                bg_width - 2 * theme->menu_items_padding_x,
-               &rc.font_menuheader, text_color, bg_color, /* arrow */ NULL);
+               &rc.font_menuheader, text_color, bg_color);
 
        int title_x = 0;
        switch (theme->menu_title_text_justify) {
index e372ba014b3b63e9a74953dbf996267520b8016c..e478a57888597119e57176ceb0c1c79f81cd1269 100644 (file)
@@ -205,8 +205,7 @@ resize_indicator_update(struct view *view)
        wlr_scene_node_set_position(&indicator->tree->node, x, y);
 
        scaled_font_buffer_update(indicator->text, text, width, &rc.font_osd,
-               rc.theme->osd_label_text_color, rc.theme->osd_bg_color,
-               NULL /* const char *arrow */);
+               rc.theme->osd_label_text_color, rc.theme->osd_bg_color);
 }
 
 void
index 47ab4ef1a6e1a22dd30c6da5c135191740a31bd4..eae988154d7cdb86d236ae73b98096ca60c37ac7 100644 (file)
@@ -504,7 +504,7 @@ ssd_update_title(struct ssd *ssd)
                if (part->buffer) {
                        scaled_font_buffer_update(part->buffer, title,
                                title_bg_width, font,
-                               text_color, bg_color, NULL);
+                               text_color, bg_color);
                }
 
                /* And finally update the cache */