theme: allow to set window button size (#1965)

This commit introduces new option "window.button.width". Despite the name
it currently affects both width and height.
This commit is contained in:
Consus 2024-07-20 11:33:57 +03:00 committed by GitHub
parent 46ec513630
commit e4afa10fe4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 59 additions and 33 deletions

View file

@ -48,8 +48,8 @@ ssd_border_create(struct ssd *ssd)
add_scene_rect(&subtree->parts, LAB_SSD_PART_BOTTOM, parent,
full_width, theme->border_width, 0, height, color);
add_scene_rect(&subtree->parts, LAB_SSD_PART_TOP, parent,
width - 2 * SSD_BUTTON_WIDTH, theme->border_width,
theme->border_width + SSD_BUTTON_WIDTH,
width - 2 * theme->window_button_width, theme->border_width,
theme->border_width + theme->window_button_width,
-(ssd->titlebar.height + theme->border_width), color);
} FOR_EACH_END
@ -121,10 +121,10 @@ ssd_border_update(struct ssd *ssd)
: 0;
int top_width = ssd->titlebar.height <= 0 || ssd->state.was_tiled_not_maximized
? full_width
: width - 2 * SSD_BUTTON_WIDTH;
: width - 2 * theme->window_button_width;
int top_x = ssd->titlebar.height <= 0 || ssd->state.was_tiled_not_maximized
? 0
: theme->border_width + SSD_BUTTON_WIDTH;
: theme->border_width + theme->window_button_width;
struct ssd_part *part;
struct wlr_scene_rect *rect;

View file

@ -32,7 +32,8 @@ ssd_extents_create(struct ssd *ssd)
struct theme *theme = view->server->theme;
struct wl_list *part_list = &ssd->extents.parts;
int extended_area = SSD_EXTENDED_AREA;
int corner_size = extended_area + theme->border_width + SSD_BUTTON_WIDTH / 2;
int corner_size = extended_area + theme->border_width +
theme->window_button_width / 2;
ssd->extents.tree = wlr_scene_tree_create(ssd->tree);
struct wlr_scene_tree *parent = ssd->extents.tree;
@ -109,7 +110,8 @@ ssd_extents_update(struct ssd *ssd)
int full_height = height + theme->border_width * 2 + ssd->titlebar.height;
int full_width = width + 2 * theme->border_width;
int extended_area = SSD_EXTENDED_AREA;
int corner_size = extended_area + theme->border_width + SSD_BUTTON_WIDTH / 2;
int corner_size = extended_area + theme->border_width +
theme->window_button_width / 2;
int side_width = full_width + extended_area * 2 - corner_size * 2;
int side_height = full_height + extended_area * 2 - corner_size * 2;

View file

@ -153,12 +153,13 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
/* Background */
struct ssd_part *bg_rect = add_scene_rect(part_list, type, parent,
SSD_BUTTON_WIDTH, rc.theme->title_height, 0, 0, bg_color);
rc.theme->window_button_width, rc.theme->title_height, 0, 0,
bg_color);
/* Icon */
struct wlr_scene_tree *icon_tree = wlr_scene_tree_create(parent);
struct wlr_box icon_geo = get_scale_box(icon_buffer,
SSD_BUTTON_WIDTH, rc.theme->title_height);
rc.theme->window_button_width, rc.theme->title_height);
struct ssd_part *icon_part = add_scene_buffer(part_list, type,
icon_tree, icon_buffer, icon_geo.x, icon_geo.y);
@ -171,7 +172,7 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
struct wlr_scene_tree *hover_tree = wlr_scene_tree_create(parent);
wlr_scene_node_set_enabled(&hover_tree->node, false);
struct wlr_box hover_geo = get_scale_box(hover_buffer,
SSD_BUTTON_WIDTH, rc.theme->title_height);
rc.theme->window_button_width, rc.theme->title_height);
struct ssd_part *hover_part = add_scene_buffer(part_list, type,
hover_tree, hover_buffer, hover_geo.x, hover_geo.y);
@ -200,7 +201,7 @@ add_toggled_icon(struct ssd_button *button, struct wl_list *part_list,
{
/* Alternate icon */
struct wlr_box icon_geo = get_scale_box(icon_buffer,
SSD_BUTTON_WIDTH, rc.theme->title_height);
rc.theme->window_button_width, rc.theme->title_height);
struct ssd_part *alticon_part = add_scene_buffer(part_list, type,
button->icon_tree, icon_buffer, icon_geo.x, icon_geo.y);
@ -212,7 +213,7 @@ add_toggled_icon(struct ssd_button *button, struct wl_list *part_list,
wlr_scene_node_set_enabled(alticon_part->node, false);
struct wlr_box hover_geo = get_scale_box(hover_buffer,
SSD_BUTTON_WIDTH, rc.theme->title_height);
rc.theme->window_button_width, rc.theme->title_height);
struct ssd_part *althover_part = add_scene_buffer(part_list, type,
button->hover_tree, hover_buffer, hover_geo.x, hover_geo.y);

View file

@ -90,21 +90,21 @@ ssd_titlebar_create(struct ssd *ssd)
/* Title */
add_scene_rect(&subtree->parts, LAB_SSD_PART_TITLEBAR, parent,
width - SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT, theme->title_height,
SSD_BUTTON_WIDTH, 0, color);
width - theme->window_button_width * SSD_BUTTON_COUNT,
theme->title_height, theme->window_button_width, 0, color);
/* Buttons */
add_scene_button_corner(&subtree->parts,
LAB_SSD_BUTTON_WINDOW_MENU, LAB_SSD_PART_CORNER_TOP_LEFT, parent,
corner_top_left, menu_button_unpressed, menu_button_hover, 0, view);
add_scene_button(&subtree->parts, LAB_SSD_BUTTON_ICONIFY, parent,
color, iconify_button_unpressed, iconify_button_hover,
width - SSD_BUTTON_WIDTH * 3, view);
width - theme->window_button_width * 3, view);
/* Maximize button has an alternate state when maximized */
struct ssd_part *btn_max_root = add_scene_button(
&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, parent,
color, maximize_button_unpressed, maximize_button_hover,
width - SSD_BUTTON_WIDTH * 2, view);
width - theme->window_button_width * 2, view);
struct ssd_button *btn_max = node_ssd_button_from_node(btn_max_root->node);
add_toggled_icon(btn_max, &subtree->parts, LAB_SSD_BUTTON_MAXIMIZE,
restore_button_unpressed, restore_button_hover);
@ -112,7 +112,7 @@ ssd_titlebar_create(struct ssd *ssd)
add_scene_button_corner(&subtree->parts,
LAB_SSD_BUTTON_CLOSE, LAB_SSD_PART_CORNER_TOP_RIGHT, parent,
corner_top_right, close_button_unpressed, close_button_hover,
width - SSD_BUTTON_WIDTH * 1, view);
width - theme->window_button_width * 1, view);
} FOR_EACH_END
ssd_update_title(ssd);
@ -218,25 +218,25 @@ ssd_titlebar_update(struct ssd *ssd)
case LAB_SSD_PART_TITLEBAR:
wlr_scene_rect_set_size(
wlr_scene_rect_from_node(part->node),
width - SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT,
width - theme->window_button_width * SSD_BUTTON_COUNT,
theme->title_height);
continue;
case LAB_SSD_BUTTON_ICONIFY:
if (is_direct_child(part->node, subtree)) {
wlr_scene_node_set_position(part->node,
width - SSD_BUTTON_WIDTH * 3, 0);
width - theme->window_button_width * 3, 0);
}
continue;
case LAB_SSD_BUTTON_MAXIMIZE:
if (is_direct_child(part->node, subtree)) {
wlr_scene_node_set_position(part->node,
width - SSD_BUTTON_WIDTH * 2, 0);
width - theme->window_button_width * 2, 0);
}
continue;
case LAB_SSD_PART_CORNER_TOP_RIGHT:
if (is_direct_child(part->node, subtree)) {
wlr_scene_node_set_position(part->node,
width - SSD_BUTTON_WIDTH * 1, 0);
width - theme->window_button_width * 1, 0);
}
continue;
default:
@ -288,7 +288,7 @@ ssd_update_title_positions(struct ssd *ssd)
struct view *view = ssd->view;
struct theme *theme = view->server->theme;
int width = view->current.width;
int title_bg_width = width - SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT;
int title_bg_width = width - theme->window_button_width * SSD_BUTTON_COUNT;
int x, y;
int buffer_height, buffer_width;
@ -304,7 +304,7 @@ ssd_update_title_positions(struct ssd *ssd)
buffer_width = part->buffer ? part->buffer->width : 0;
buffer_height = part->buffer ? part->buffer->height : 0;
x = SSD_BUTTON_WIDTH;
x = theme->window_button_width;
y = (theme->title_height - buffer_height) / 2;
if (title_bg_width <= 0) {
@ -314,7 +314,7 @@ ssd_update_title_positions(struct ssd *ssd)
wlr_scene_node_set_enabled(part->node, true);
if (theme->window_label_text_justify == LAB_JUSTIFY_CENTER) {
if (buffer_width + SSD_BUTTON_WIDTH * 2 <= title_bg_width) {
if (buffer_width + theme->window_button_width * 2 <= title_bg_width) {
/* Center based on the full width */
x = (width - buffer_width) / 2;
} else {
@ -358,7 +358,7 @@ ssd_update_title(struct ssd *ssd)
struct ssd_sub_tree *subtree;
struct ssd_state_title_width *dstate;
int title_bg_width = view->current.width
- SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT;
- theme->window_button_width * SSD_BUTTON_COUNT;
FOR_EACH_STATE(ssd, subtree) {
if (subtree == &ssd->titlebar.active) {

View file

@ -233,10 +233,11 @@ ssd_update_geometry(struct ssd *ssd)
struct wlr_box cached = ssd->state.geometry;
struct wlr_box current = ssd->view->current;
int min_view_width = rc.theme->window_button_width * SSD_BUTTON_COUNT;
int eff_width = current.width;
int eff_height = view_effective_height(ssd->view, /* use_pending */ false);
if (eff_width > 0 && eff_width < LAB_MIN_VIEW_WIDTH) {
if (eff_width > 0 && eff_width < min_view_width) {
/*
* Prevent negative values in calculations like
* `width - SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT`