From 4ef881bb3e4cf729668c664af92c55b8dcb77ed4 Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Fri, 14 Mar 2025 19:33:28 +0900 Subject: [PATCH] osd: support app icons in window switcher Example configuration: --- docs/labwc-config.5.scd | 2 ++ include/osd.h | 1 + src/osd-field.c | 2 ++ src/osd.c | 30 +++++++++++++++++++++--------- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 0042aa8d..f52f257d 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -303,6 +303,8 @@ this is for compatibility with Openbox. - *trimmed_identifier* Show trimmed identifier. Trimming removes the first two nodes of 'org.' strings. + - *icon* Show application icon + - *desktop_entry_name* Show application name from freedesktop.org desktop entry/file. Falls back to trimmed identifier (trimmed_identifier). diff --git a/include/osd.h b/include/osd.h index 13c67497..d2097538 100644 --- a/include/osd.h +++ b/include/osd.h @@ -12,6 +12,7 @@ enum window_switcher_field_content { LAB_FIELD_TYPE_SHORT, LAB_FIELD_IDENTIFIER, LAB_FIELD_TRIMMED_IDENTIFIER, + LAB_FIELD_ICON, LAB_FIELD_DESKTOP_ENTRY_NAME, LAB_FIELD_TITLE, LAB_FIELD_TITLE_SHORT, diff --git a/src/osd-field.c b/src/osd-field.c index a6b0763a..7465d267 100644 --- a/src/osd-field.c +++ b/src/osd-field.c @@ -319,6 +319,8 @@ osd_field_arg_from_xml_node(struct window_switcher_field *field, field->content = LAB_FIELD_IDENTIFIER; } else if (!strcmp(content, "trimmed_identifier")) { field->content = LAB_FIELD_TRIMMED_IDENTIFIER; + } else if (!strcmp(content, "icon")) { + field->content = LAB_FIELD_ICON; } else if (!strcmp(content, "desktop_entry_name")) { field->content = LAB_FIELD_DESKTOP_ENTRY_NAME; } else if (!strcmp(content, "title")) { diff --git a/src/osd.c b/src/osd.c index 8d5e8950..ef8ec2cb 100644 --- a/src/osd.c +++ b/src/osd.c @@ -6,8 +6,8 @@ #include "common/array.h" #include "common/buf.h" #include "common/font.h" -#include "common/macros.h" #include "common/scaled-font-buffer.h" +#include "common/scaled-icon-buffer.h" #include "common/scaled-rect-buffer.h" #include "common/scene-helpers.h" #include "config/rcxml.h" @@ -350,17 +350,29 @@ create_osd_scene(struct output *output, struct wl_array *views) int field_width = (available_width - (nr_fields + 1) * theme->osd_window_switcher_item_padding_x) * field->width / 100.0; + struct wlr_scene_node *node = NULL; - buf_clear(&buf); - osd_field_get_content(field, &buf, *view); + if (field->content == LAB_FIELD_ICON) { + int icon_size = font_height(&rc.font_osd); + struct scaled_icon_buffer *icon_buffer = + scaled_icon_buffer_create(item_root, + server, icon_size, icon_size); + scaled_icon_buffer_set_app_id(icon_buffer, + view_get_string_prop(*view, "app_id")); + node = &icon_buffer->scene_buffer->node; + } else { + buf_clear(&buf); + osd_field_get_content(field, &buf, *view); - struct scaled_font_buffer *font_buffer = - scaled_font_buffer_create(item_root); - scaled_font_buffer_update(font_buffer, buf.data, field_width, - &rc.font_osd, text_color, bg_color); + struct scaled_font_buffer *font_buffer = + scaled_font_buffer_create(item_root); + scaled_font_buffer_update(font_buffer, buf.data, field_width, + &rc.font_osd, text_color, bg_color); + node = &font_buffer->scene_buffer->node; + } - wlr_scene_node_set_position(&font_buffer->scene_buffer->node, - x, y + theme->osd_window_switcher_item_padding_y + wlr_scene_node_set_position(node, x, + y + theme->osd_window_switcher_item_padding_y + theme->osd_window_switcher_item_active_border_width); x += field_width + theme->osd_window_switcher_item_padding_x; }