window.button.{height,width} determine the space allocated for buttons.
Buttons can be smaller than this size and will then just be center aligned
within the allocated space. However, buttons will be clamped at this size
to prevent them from going outside of the allocated space.
struct wlr_scene_tree *parent, struct wlr_buffer *buffer, int x, int y);
struct ssd_part *add_scene_button(struct wl_list *part_list,
enum ssd_part_type type, struct wlr_scene_tree *parent,
- struct lab_data_buffer *buffers[LAB_BS_ALL + 1], int x,
+ struct lab_data_buffer *buffers[LAB_BS_ALL + 1], int x, int y,
struct view *view);
void update_window_icon_buffer(struct wlr_scene_node *button_node,
struct lab_data_buffer *buffer);
enum lab_justification window_label_text_justify;
enum lab_justification menu_title_text_justify;
- /* button width */
+ /* buttons */
int window_button_width;
- /* the space between buttons */
+ int window_button_height;
int window_button_spacing;
+
/* the shape of the hover effect */
enum lab_shape window_button_hover_bg_shape;
struct wlr_box icon_geo = get_scale_box(buffer,
rc.theme->window_button_width,
- rc.theme->title_height);
+ rc.theme->window_button_height);
wlr_scene_buffer_set_buffer(scene_buffer, &buffer->base);
wlr_scene_buffer_set_dest_size(scene_buffer,
add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
struct wlr_scene_tree *parent,
struct lab_data_buffer *buffers[LAB_BS_ALL + 1],
- int x, struct view *view)
+ int x, int y, struct view *view)
{
struct ssd_part *button_root = add_scene_part(part_list, type);
parent = wlr_scene_tree_create(parent);
button_root->node = &parent->node;
- wlr_scene_node_set_position(button_root->node, x, 0);
+ wlr_scene_node_set_position(button_root->node, x, y);
/* Hitbox */
float invisible[4] = { 0, 0, 0, 0 };
add_scene_rect(part_list, type, parent,
- rc.theme->window_button_width, rc.theme->title_height, 0, 0,
+ rc.theme->window_button_width, rc.theme->window_button_height, 0, 0,
invisible);
/* Icons */
}
struct lab_data_buffer *icon_buffer = buffers[state_set];
struct wlr_box icon_geo = get_scale_box(icon_buffer,
- rc.theme->window_button_width, rc.theme->title_height);
+ rc.theme->window_button_width, rc.theme->window_button_height);
struct ssd_part *icon_part = add_scene_buffer(part_list, type,
parent, &icon_buffer->base, icon_geo.x, icon_geo.y);
/* Make sure big icons are scaled down if necessary */
/* Buttons */
struct title_button *b;
int x = theme->padding_width;
+
+ /* Center vertically within titlebar */
+ int y = (theme->title_height - theme->window_button_height) / 2;
+
wl_list_for_each(b, &rc.title_buttons_left, link) {
struct lab_data_buffer **buffers =
theme->window[active].buttons[b->type];
add_scene_button(&subtree->parts, b->type, parent,
- buffers, x, view);
+ buffers, x, y, view);
x += theme->window_button_width + theme->window_button_spacing;
}
struct lab_data_buffer **buffers =
theme->window[active].buttons[b->type];
add_scene_button(&subtree->parts, b->type, parent,
- buffers, x, view);
+ buffers, x, y, view);
}
} FOR_EACH_END
update_visible_buttons(ssd);
+ /* Center buttons vertically within titlebar */
+ int y = (theme->title_height - theme->window_button_height) / 2;
int x;
struct ssd_part *part;
struct ssd_sub_tree *subtree;
x = theme->padding_width;
wl_list_for_each(b, &rc.title_buttons_left, link) {
part = ssd_get_part(&subtree->parts, b->type);
- wlr_scene_node_set_position(part->node, x, 0);
+ wlr_scene_node_set_position(part->node, x, y);
x += theme->window_button_width + theme->window_button_spacing;
}
wl_list_for_each_reverse(b, &rc.title_buttons_right, link) {
part = ssd_get_part(&subtree->parts, b->type);
x -= theme->window_button_width + theme->window_button_spacing;
- wlr_scene_node_set_position(part->node, x, 0);
+ wlr_scene_node_set_position(part->node, x, y);
}
} FOR_EACH_END
int icon_height = cairo_image_surface_get_height(icon.surface);
int width = theme->window_button_width;
- int height = theme->title_height;
+ int height = theme->window_button_height;
/*
* Proportionately increase size of hover_buffer if the non-hover
assert(!*hover_buffer);
int width = theme->window_button_width;
- int height = theme->title_height;
+ int height = theme->window_button_height;
*hover_buffer = copy_icon_buffer(theme, icon_buffer);
cairo_t *cairo = (*hover_buffer)->cairo;
cairo_t *cairo = (*rounded_buffer)->cairo;
int width = theme->window_button_width;
- int height = theme->title_height;
+ int height = theme->window_button_height;
/*
* Round the hover overlay of corner buttons by
zdrop(buffer);
- int size = theme->title_height - 2 * theme->padding_height;
+ int size = theme->window_button_height;
float scale = 1; /* TODO: account for output scale */
/* PNG */
theme->padding_width = 0;
theme->window_button_width = 26;
+ theme->window_button_height = 26;
theme->window_button_spacing = 0;
theme->window_button_hover_bg_shape = LAB_RECTANGLE;
theme->window_button_width = 1;
}
}
+ if (match_glob(key, "window.button.height")) {
+ theme->window_button_height = atoi(value);
+ if (theme->window_button_height < 1) {
+ wlr_log(WLR_ERROR, "window.button.height cannot "
+ "be less than 1, clamping it to 1.");
+ theme->window_button_height = 1;
+ }
+ }
if (match_glob(key, "window.button.spacing")) {
theme->window_button_spacing = get_int_if_positive(
value, "window.button.spacing");