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="">`.
## 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%" />
</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.
*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" />*.
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 */
/* 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,
} 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")) {
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;
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();
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 },
[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");
#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"
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;
};
}
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;
}
/* 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 */
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);
}
}