Theme option to configure boxes from workspace OSD

This allows to configure width and height of "boxes" displayed in the
workspace OSD.
This commit is contained in:
kyak 2023-12-08 18:09:27 +03:00
parent 111b955b53
commit 38cfea7e09
5 changed files with 44 additions and 13 deletions

View file

@ -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.

View file

@ -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

View file

@ -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;

View file

@ -362,6 +362,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;
@ -548,6 +551,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);
}

View file

@ -60,8 +60,10 @@ _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);
@ -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);