]> git.mdlowis.com Git - proto/labwc.git/commitdiff
osd: add thumbnailLabelFormat to windowSwitcher (#3187)
authorelviosak <33790211+elviosak@users.noreply.github.com>
Wed, 5 Nov 2025 09:23:15 +0000 (06:23 -0300)
committerGitHub <noreply@github.com>
Wed, 5 Nov 2025 09:23:15 +0000 (18:23 +0900)
This commit adds `<windowSwitcher thumbnailLabelFormat="%T">` to configure the label text in each item in the thumbnail-style window switcher. Its format follows `<fields><field content="custom" format="">`.

docs/labwc-config.5.scd
include/config/rcxml.h
include/osd.h
src/config/rcxml.c
src/osd/osd-field.c
src/osd/osd-thumbnail.c

index 9a465e9b484a75e15da136899f72c905d54da9e2..6be5f5f6b10f8a12b636278b7817328230d1a2ec 100644 (file)
@@ -339,7 +339,7 @@ this is for compatibility with Openbox.
 ## WINDOW SWITCHER
 
 ```
-<windowSwitcher show="yes" style="classic" preview="yes" outlines="yes" allWorkspaces="no">
+<windowSwitcher show="yes" style="classic" preview="yes" outlines="yes" allWorkspaces="no" thumbnailLabelFormat="%T">
   <fields>
     <field content="icon" width="5%" />
     <field content="desktop_entry_name" width="30%" />
@@ -348,7 +348,7 @@ this is for compatibility with Openbox.
 </windowSwitcher>
 ```
 
-*<windowSwitcher show="" style="" preview="" outlines="" allWorkspaces="" unshade="">*
+*<windowSwitcher show="" style="" preview="" outlines="" allWorkspaces="" unshade="" thumbnailLabelFormat="">*
        *show* [yes|no] Draw the OnScreenDisplay when switching between
        windows. Default is yes.
 
@@ -369,6 +369,10 @@ this is for compatibility with Openbox.
        *unshade* [yes|no] Temporarily unshade windows when switching between
        them and permanently unshade on the final selection. Default is yes.
 
+       *thumbnailLabelFormat* Format to be used for the thumbnail label according to *custom*
+       field below, only applied when using *<windowSwitcher style="thumbnail" />*.
+       Default is "%T".
+
 *<windowSwitcher><fields><field content="" width="%">*
        Define window switcher fields when using *<windowSwitcher style="classic" />*.
 
index 50874571e76da7b635386f358781ba77a6c7c377..c20cd8003c528b60576781b0cf6ec14dfa756a0b 100644 (file)
@@ -183,6 +183,7 @@ struct rcxml {
                enum lab_view_criteria criteria;
                struct wl_list fields;  /* struct window_switcher_field.link */
                enum window_switcher_style style;
+               char *thumbnail_label_format;
        } window_switcher;
 
        struct wl_list window_rules; /* struct window_rule.link */
index a9b4cdffcd332d42749ffbc5652c48bd8e85968a..2ecaa2029774ff3c9047f01cf616b29c9b08a311 100644 (file)
@@ -65,6 +65,9 @@ void osd_on_cursor_release(struct server *server, struct wlr_scene_node *node);
 /* Used by osd.c internally to render window switcher fields */
 void osd_field_get_content(struct window_switcher_field *field,
        struct buf *buf, struct view *view);
+/* Sets view info to buf according to format */
+void osd_field_set_custom(struct buf *buf, struct view *view,
+       const char *format);
 
 /* Used by rcxml.c when parsing the config */
 void osd_field_arg_from_xml_node(struct window_switcher_field *field,
index 6ed1522b5b8ad3e31a788b2d0fe3ede446b15df7..1ea557b3956250b813418169fd88f0463faac118 100644 (file)
@@ -1208,6 +1208,8 @@ entry(xmlNode *node, char *nodename, char *content)
                } else if (!strcasecmp(content, "thumbnail")) {
                        rc.window_switcher.style = WINDOW_SWITCHER_THUMBNAIL;
                }
+       } else if (!strcasecmp(nodename, "thumbnailLabelFormat.windowSwitcher")) {
+               xstrdup_replace(rc.window_switcher.thumbnail_label_format, content);
        } else if (!strcasecmp(nodename, "preview.windowSwitcher")) {
                set_bool(content, &rc.window_switcher.preview);
        } else if (!strcasecmp(nodename, "outlines.windowSwitcher")) {
@@ -1429,6 +1431,7 @@ rcxml_init(void)
 
        rc.window_switcher.show = true;
        rc.window_switcher.style = WINDOW_SWITCHER_CLASSIC;
+       rc.window_switcher.thumbnail_label_format = xstrdup("%T");
        rc.window_switcher.preview = true;
        rc.window_switcher.outlines = true;
        rc.window_switcher.unshade = true;
@@ -1905,6 +1908,7 @@ rcxml_finish(void)
        zfree(rc.fallback_app_icon_name);
        zfree(rc.workspace_config.prefix);
        zfree(rc.tablet.output_name);
+       zfree(rc.window_switcher.thumbnail_label_format);
 
        clear_title_layout();
 
index 01c4e48bcbb2288f0ef25da40dfa1cf5d26797be..c84cce46e801e05feaacb78ff66f28d020eff830 100644 (file)
@@ -189,9 +189,6 @@ field_set_title_short(struct buf *buf, struct view *view, const char *format)
        buf_add(buf, get_title_if_different(view));
 }
 
-static void field_set_custom(struct buf *buf, struct view *view,
-       const char *format);
-
 static const struct field_converter field_converter[LAB_FIELD_COUNT] = {
        [LAB_FIELD_TYPE]               = { 'B', field_set_type },
        [LAB_FIELD_TYPE_SHORT]         = { 'b', field_set_type_short },
@@ -207,11 +204,11 @@ static const struct field_converter field_converter[LAB_FIELD_COUNT] = {
        [LAB_FIELD_TITLE]              = { 'T', field_set_title },
        [LAB_FIELD_TITLE_SHORT]        = { 't', field_set_title_short },
        /* fmt_char can never be matched so prevents LAB_FIELD_CUSTOM recursion */
-       [LAB_FIELD_CUSTOM]             = { '\0', field_set_custom },
+       [LAB_FIELD_CUSTOM]             = { '\0', osd_field_set_custom },
 };
 
-static void
-field_set_custom(struct buf *buf, struct view *view, const char *format)
+void
+osd_field_set_custom(struct buf *buf, struct view *view, const char *format)
 {
        if (!format) {
                wlr_log(WLR_ERROR, "Missing format for custom window switcher field");
index 76cdf2777814c3667f7013d937affbc0839cd764..cc34a3c25465169a0276558a09540246b197b63d 100644 (file)
@@ -7,6 +7,7 @@
 #include "config/rcxml.h"
 #include "common/array.h"
 #include "common/box.h"
+#include "common/buf.h"
 #include "common/lab-scene-rect.h"
 #include "common/list.h"
 #include "labwc.h"
@@ -20,8 +21,8 @@
 
 struct osd_thumbnail_item {
        struct osd_item base;
-       struct scaled_font_buffer *normal_title;
-       struct scaled_font_buffer *active_title;
+       struct scaled_font_buffer *normal_label;
+       struct scaled_font_buffer *active_label;
        struct lab_scene_rect *active_bg;
 };
 
@@ -89,16 +90,19 @@ render_thumb(struct output *output, struct view *view)
 }
 
 static struct scaled_font_buffer *
-create_title(struct wlr_scene_tree *parent,
+create_label(struct wlr_scene_tree *parent, struct view *view,
                struct window_switcher_thumbnail_theme *switcher_theme,
-               const char *title, const float *title_color,
-               const float *bg_color, int y)
+               const float *text_color, const float *bg_color, int y)
 {
+       struct buf buf = BUF_INIT;
+       osd_field_set_custom(&buf, view,
+               rc.window_switcher.thumbnail_label_format);
        struct scaled_font_buffer *buffer =
                scaled_font_buffer_create(parent);
-       scaled_font_buffer_update(buffer, title,
+       scaled_font_buffer_update(buffer, buf.data,
                switcher_theme->item_width - 2 * switcher_theme->item_padding,
-               &rc.font_osd, title_color, bg_color);
+               &rc.font_osd, text_color, bg_color);
+       buf_reset(&buf);
        wlr_scene_node_set_position(&buffer->scene_buffer->node,
                (switcher_theme->item_width - buffer->width) / 2, y);
        return buffer;
@@ -163,11 +167,11 @@ create_item_scene(struct wlr_scene_tree *parent, struct view *view,
        }
 
        /* title */
-       item->normal_title = create_title(tree, switcher_theme,
-               view->title, theme->osd_label_text_color,
+       item->normal_label = create_label(tree, view,
+               switcher_theme, theme->osd_label_text_color,
                theme->osd_bg_color, title_y);
-       item->active_title = create_title(tree, switcher_theme,
-               view->title, theme->osd_label_text_color,
+       item->active_label = create_label(tree, view,
+               switcher_theme, theme->osd_label_text_color,
                switcher_theme->item_active_bg_color, title_y);
 
        /* icon */
@@ -277,9 +281,9 @@ osd_thumbnail_update(struct output *output)
                bool active = (item->base.view == output->server->osd_state.cycle_view);
                wlr_scene_node_set_enabled(&item->active_bg->tree->node, active);
                wlr_scene_node_set_enabled(
-                       &item->active_title->scene_buffer->node, active);
+                       &item->active_label->scene_buffer->node, active);
                wlr_scene_node_set_enabled(
-                       &item->normal_title->scene_buffer->node, !active);
+                       &item->normal_label->scene_buffer->node, !active);
        }
 }