From 268191fce859b9abee34ab0688f948b736ed928d Mon Sep 17 00:00:00 2001 From: kyak <699631+kyak@users.noreply.github.com> Date: Mon, 11 Dec 2023 12:41:33 +0300 Subject: [PATCH] Add theme option to configure boxes from workspace OSD This allows to configure width and height of "boxes" displayed in the workspace OSD. A setting of `0` disables the boxes. --- docs/labwc-theme.5.scd | 6 ++++++ docs/themerc | 3 +++ include/theme.h | 3 +++ src/theme.c | 15 +++++++++++++++ src/workspaces.c | 38 ++++++++++++++++++++++++-------------- 5 files changed, 51 insertions(+), 14 deletions(-) diff --git a/docs/labwc-theme.5.scd b/docs/labwc-theme.5.scd index b75ea116..18932f1b 100644 --- a/docs/labwc-theme.5.scd +++ b/docs/labwc-theme.5.scd @@ -174,6 +174,12 @@ elements are not listed here, but are supported. Border width of the selection box in the window switcher in pixels. Default is 2. +*osd.workspace-switcher.boxes.width* + Width of boxes in workspace switcher in pixels. Setting to 0 disables boxes. Default is 20. + +*osd.workspace-switcher.boxes.height* + Height of boxes in workspace switcher in pixels. Setting to 0 disables boxes. Default is 20. + *border.color* Set all border colors. This is obsolete, but supported for backward compatibility as some themes still contain it. diff --git a/docs/themerc b/docs/themerc index 1e5d8dd4..67d7d5df 100644 --- a/docs/themerc +++ b/docs/themerc @@ -65,3 +65,6 @@ osd.window-switcher.padding: 4 osd.window-switcher.item.padding.x: 10 osd.window-switcher.item.padding.y: 1 osd.window-switcher.item.active.border.width: 2 + +osd.workspace-switcher.boxes.width: 20 +osd.workspace-switcher.boxes.height: 20 diff --git a/include/theme.h b/include/theme.h index e814f451..5f958d2e 100644 --- a/include/theme.h +++ b/include/theme.h @@ -76,6 +76,9 @@ struct theme { int osd_window_switcher_item_padding_y; int osd_window_switcher_item_active_border_width; + int osd_workspace_switcher_boxes_width; + int osd_workspace_switcher_boxes_height; + /* textures */ struct lab_data_buffer *button_close_active_unpressed; struct lab_data_buffer *button_maximize_active_unpressed; diff --git a/src/theme.c b/src/theme.c index ed5e6a90..624c015f 100644 --- a/src/theme.c +++ b/src/theme.c @@ -326,6 +326,9 @@ theme_builtin(struct theme *theme) theme->osd_window_switcher_item_padding_y = 1; theme->osd_window_switcher_item_active_border_width = 2; + theme->osd_workspace_switcher_boxes_width = 20; + theme->osd_workspace_switcher_boxes_height = 20; + /* inherit settings in post_processing() if not set elsewhere */ theme->osd_bg_color[0] = FLT_MIN; theme->osd_border_width = INT_MIN; @@ -512,6 +515,12 @@ entry(struct theme *theme, const char *key, const char *value) if (match_glob(key, "osd.window-switcher.item.active.border.width")) { theme->osd_window_switcher_item_active_border_width = atoi(value); } + if (match_glob(key, "osd.workspace-switcher.boxes.width")) { + theme->osd_workspace_switcher_boxes_width = atoi(value); + } + if (match_glob(key, "osd.workspace-switcher.boxes.height")) { + theme->osd_workspace_switcher_boxes_height = atoi(value); + } if (match_glob(key, "osd.label.text.color")) { parse_hexstr(value, theme->osd_label_text_color); } @@ -860,6 +869,12 @@ post_processing(struct theme *theme) memcpy(theme->osd_border_color, theme->osd_label_text_color, sizeof(theme->osd_border_color)); } + if (theme->osd_workspace_switcher_boxes_width == 0) { + theme->osd_workspace_switcher_boxes_height = 0; + } + if (theme->osd_workspace_switcher_boxes_height == 0) { + theme->osd_workspace_switcher_boxes_width = 0; + } } void diff --git a/src/workspaces.c b/src/workspaces.c index e7707c5f..2ca5f9f1 100644 --- a/src/workspaces.c +++ b/src/workspaces.c @@ -60,14 +60,16 @@ _osd_update(struct server *server) /* Settings */ uint16_t margin = 10; uint16_t padding = 2; - uint16_t rect_height = 20; - uint16_t rect_width = 20; + uint16_t rect_height = theme->osd_workspace_switcher_boxes_height; + uint16_t rect_width = theme->osd_workspace_switcher_boxes_width; + bool hide_boxes = theme->osd_workspace_switcher_boxes_width == 0 || + theme->osd_workspace_switcher_boxes_height == 0; /* Dimensions */ size_t workspace_count = wl_list_length(&server->workspaces); uint16_t marker_width = workspace_count * (rect_width + padding) - padding; uint16_t width = margin * 2 + (marker_width < 200 ? 200 : marker_width); - uint16_t height = margin * 3 + rect_height + font_height(&rc.font_osd); + uint16_t height = margin * (hide_boxes ? 2 : 3) + rect_height + font_height(&rc.font_osd); cairo_t *cairo; cairo_surface_t *surface; @@ -100,19 +102,23 @@ _osd_update(struct server *server) }; draw_cairo_border(cairo, fbox, theme->osd_border_width); - uint16_t x = (width - marker_width) / 2; - wl_list_for_each(workspace, &server->workspaces, link) { - bool active = workspace == server->workspace_current; - set_cairo_color(cairo, server->theme->osd_label_text_color); - cairo_rectangle(cairo, x, margin, - rect_width - padding, rect_height); - cairo_stroke(cairo); - if (active) { + /* Boxes */ + uint16_t x; + if (!hide_boxes) { + x = (width - marker_width) / 2; + wl_list_for_each(workspace, &server->workspaces, link) { + bool active = workspace == server->workspace_current; + set_cairo_color(cairo, server->theme->osd_label_text_color); cairo_rectangle(cairo, x, margin, rect_width - padding, rect_height); - cairo_fill(cairo); + cairo_stroke(cairo); + if (active) { + cairo_rectangle(cairo, x, margin, + rect_width - padding, rect_height); + cairo_fill(cairo); + } + x += rect_width + padding; } - x += rect_width + padding; } /* Text */ @@ -127,7 +133,11 @@ _osd_update(struct server *server) /* Center workspace indicator on the x axis */ x = font_width(&rc.font_osd, server->workspace_current->name); x = (width - x) / 2; - cairo_move_to(cairo, x, margin * 2 + rect_height); + if (!hide_boxes) { + cairo_move_to(cairo, x, margin * 2 + rect_height); + } else { + cairo_move_to(cairo, x, (height - font_height(&rc.font_osd)) / 2.0); + } //pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc);