From eb5e855b6949c47b007f62562d75eac0a5a6c60f Mon Sep 17 00:00:00 2001 From: Droc Date: Tue, 26 Mar 2024 05:12:19 -0500 Subject: [PATCH] osd: support percent values for window switcher width Add ability to set width with percentage of monitor instead of just pixels. With this the OSD sizes itself properly on both my 4k and 2k monitors. example: 50% or 75% instead of 600, max 100% --- docs/labwc-theme.5.scd | 2 ++ docs/themerc | 3 +++ include/theme.h | 1 + src/osd.c | 8 ++++++-- src/theme.c | 12 +++++++++++- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/labwc-theme.5.scd b/docs/labwc-theme.5.scd index dabfa6a6..614934d7 100644 --- a/docs/labwc-theme.5.scd +++ b/docs/labwc-theme.5.scd @@ -164,6 +164,8 @@ elements are not listed here, but are supported. *osd.window-switcher.width* Width of window switcher in pixels. Default is 600. + Width can also be percent of the width of the monitor. + % is mandatory as last character in this case, max 100% *osd.window-switcher.padding* Padding of window switcher in pixels. This is the space between the diff --git a/docs/themerc b/docs/themerc index 67d7d5df..aa1e322c 100644 --- a/docs/themerc +++ b/docs/themerc @@ -60,7 +60,10 @@ osd.border.color: #000000 osd.border.width: 1 osd.label.text.color: #000000 +# width can be set as percent (of screen width) +# example 50% or 75% instead of 600, max 100% osd.window-switcher.width: 600 + osd.window-switcher.padding: 4 osd.window-switcher.item.padding.x: 10 osd.window-switcher.item.padding.y: 1 diff --git a/include/theme.h b/include/theme.h index b4c0e738..5b584d59 100644 --- a/include/theme.h +++ b/include/theme.h @@ -75,6 +75,7 @@ struct theme { int osd_window_switcher_item_padding_x; int osd_window_switcher_item_padding_y; int osd_window_switcher_item_active_border_width; + bool osd_window_switcher_width_is_percent; int osd_workspace_switcher_boxes_width; int osd_workspace_switcher_boxes_height; diff --git a/src/osd.c b/src/osd.c index d6d6be56..b41b1bf1 100644 --- a/src/osd.c +++ b/src/osd.c @@ -321,7 +321,7 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h, if (show_workspace) { /* Center workspace indicator on the x axis */ int x = font_width(&rc.font_osd, workspace_name); - x = (theme->osd_window_switcher_width - x) / 2; + x = (w - x) / 2; cairo_move_to(cairo, x, y + theme->osd_window_switcher_item_active_border_width); PangoWeight weight = pango_font_description_get_weight(desc); pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); @@ -432,7 +432,7 @@ render_osd(struct server *server, cairo_t *cairo, int w, int h, struct wlr_fbox fbox = { .x = theme->osd_border_width + theme->osd_window_switcher_padding, .y = y, - .width = theme->osd_window_switcher_width + .width = w - 2 * theme->osd_border_width - 2 * theme->osd_window_switcher_padding, .height = theme->osd_window_switcher_item_height, @@ -460,6 +460,10 @@ display_osd(struct output *output, struct wl_array *views) float scale = output->wlr_output->scale; int w = theme->osd_window_switcher_width; + if (theme->osd_window_switcher_width_is_percent) { + w = output->wlr_output->width / output->wlr_output->scale + * theme->osd_window_switcher_width / 100; + } int h = wl_array_len(views) * rc.theme->osd_window_switcher_item_height + 2 * rc.theme->osd_border_width + 2 * rc.theme->osd_window_switcher_padding; diff --git a/src/theme.c b/src/theme.c index 983d7bc4..d5b0d3b5 100644 --- a/src/theme.c +++ b/src/theme.c @@ -494,6 +494,7 @@ theme_builtin(struct theme *theme) parse_hexstr("#888888", theme->menu_separator_color); theme->osd_window_switcher_width = 600; + theme->osd_window_switcher_width_is_percent = false; theme->osd_window_switcher_padding = 4; theme->osd_window_switcher_item_padding_x = 10; theme->osd_window_switcher_item_padding_y = 1; @@ -674,7 +675,12 @@ entry(struct theme *theme, const char *key, const char *value) parse_hexstr(value, theme->osd_border_color); } if (match_glob(key, "osd.window-switcher.width")) { - theme->osd_window_switcher_width = atoi(value); + if (strrchr(value, '%')) { + theme->osd_window_switcher_width_is_percent = true; + } else { + theme->osd_window_switcher_width_is_percent = false; + } + theme->osd_window_switcher_width = MAX(atoi(value), 0); } if (match_glob(key, "osd.window-switcher.padding")) { theme->osd_window_switcher_padding = atoi(value); @@ -1011,6 +1017,10 @@ post_processing(struct theme *theme) if (theme->osd_workspace_switcher_boxes_height == 0) { theme->osd_workspace_switcher_boxes_width = 0; } + if (theme->osd_window_switcher_width_is_percent) { + theme->osd_window_switcher_width = + MIN(theme->osd_window_switcher_width, 100); + } } void