]> git.mdlowis.com Git - proto/labwc.git/commitdiff
theme: allow to set window button size (#1965)
authorConsus <consus@ftml.net>
Sat, 20 Jul 2024 08:33:57 +0000 (11:33 +0300)
committerGitHub <noreply@github.com>
Sat, 20 Jul 2024 08:33:57 +0000 (09:33 +0100)
This commit introduces new option "window.button.width". Despite the name
it currently affects both width and height.

14 files changed:
docs/labwc-theme.5.scd
docs/themerc
include/ssd.h
include/theme.h
include/view.h
src/snap.c
src/ssd/ssd-border.c
src/ssd/ssd-extents.c
src/ssd/ssd-part.c
src/ssd/ssd-titlebar.c
src/ssd/ssd.c
src/theme.c
src/view.c
src/xwayland.c

index 725995232e71636ec3e2e395e190b6d757aa273f..5b90a962dd51f18fba5b625f117c341ce6307b3a 100644 (file)
@@ -114,6 +114,10 @@ labwc-config(5).
        Specifies how window titles are aligned in the titlebar for both
        focused and unfocused windows. Type justification. Default Left.
 
+*window.button.width*
+       Width of a titlebar button, in pixels.
+       Default is 26.
+
 *window.active.button.unpressed.image.color*
        Color of the images in titlebar buttons in their default, unpressed,
        state. This element is for the focused window.
index 7602da9dd0b279c9e29db35836a20d4c93eed4cd..b2dcb2fe7a519bcd07f3fd8c85ffc421dec197e8 100644 (file)
@@ -29,6 +29,9 @@ window.active.label.text.color: #000000
 window.inactive.label.text.color: #000000
 window.label.text.justify: center
 
+# window button width
+window.button.width: 26
+
 # window buttons
 window.active.button.unpressed.image.color: #000000
 window.inactive.button.unpressed.image.color: #000000
index a0c520c6ad9c0e9c1d343421731b0f04cd599d73..19b224505efcb6df4a7c12f533d2d9c9e6e5e38a 100644 (file)
@@ -6,7 +6,6 @@
 #include "common/border.h"
 
 #define SSD_BUTTON_COUNT 4
-#define SSD_BUTTON_WIDTH 26
 #define SSD_EXTENDED_AREA 8
 
 /*
index 50a69f6f066bcf99ab58ecf1ed527febd0ec0c0b..39931840068d144565e37d4b2b65d5ea6ec9f5a0 100644 (file)
@@ -45,6 +45,9 @@ struct theme {
        float window_inactive_label_text_color[4];
        enum lab_justification window_label_text_justify;
 
+       /* button width */
+       int window_button_width;
+
        /* button colors */
        float window_active_button_menu_unpressed_image_color[4];
        float window_active_button_iconify_unpressed_image_color[4];
index 637b00dfd3b716e1cc7a014b41bc0aaa4378c877..9dc70aa8967643c7b33bb3dcd0b3fac0c37181f4 100644 (file)
@@ -10,7 +10,6 @@
 #include <wlr/util/box.h>
 #include <xkbcommon/xkbcommon.h>
 
-#define LAB_MIN_VIEW_WIDTH (SSD_BUTTON_WIDTH * SSD_BUTTON_COUNT)
 #define LAB_MIN_VIEW_HEIGHT 60
 
 /*
index ca5186cf7e083a046e82bf62f0d4c61e17105ec6..5f1dbff8edd9a45e28ebc07571c981dbbeab76cd 100644 (file)
@@ -220,6 +220,7 @@ snap_shrink_to_next_edge(struct view *view,
 
        *geo = view->pending;
        uint32_t resize_edges;
+       int min_view_width = rc.theme->window_button_width * SSD_BUTTON_COUNT;
 
        /*
         * First shrink the view along the relevant edge. The maximum shrink
@@ -228,12 +229,12 @@ snap_shrink_to_next_edge(struct view *view,
         */
        switch (direction) {
        case VIEW_EDGE_RIGHT:
-               geo->width = MAX(geo->width / 2, LAB_MIN_VIEW_WIDTH);
+               geo->width = MAX(geo->width / 2, min_view_width);
                geo->x = view->pending.x + view->pending.width - geo->width;
                resize_edges = WLR_EDGE_LEFT;
                break;
        case VIEW_EDGE_LEFT:
-               geo->width = MAX(geo->width / 2, LAB_MIN_VIEW_WIDTH);
+               geo->width = MAX(geo->width / 2, min_view_width);
                resize_edges = WLR_EDGE_RIGHT;
                break;
        case VIEW_EDGE_DOWN:
index 06ce55c30e36c8ea4e853caaf8d29e67f145d0a2..fb1ac28389dd6bcb7a8fe876a00b3a748f56eee6 100644 (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;
index 4bb5b69dc425b91c68ae3c72af93dd9730c1d280..274b5f506a3132cd96e0f8fa25dfc560288e1a96 100644 (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;
 
index 3933cd1704d61c4679366a898475e1f9cce766d8..5c9036096fe4f70a050bd90e84c6068ff8162ed2 100644 (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);
 
index 32d6131a5c84ced352aa50831b76c42c04622a3a..70d9ca6bf837a714045a671a6e00766d6e41a656 100644 (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) {
index 70b1b0db3a307f2c600e8faedf2caa3db10f763b..6382983da5c8c7412da38f3c12fb757b381e9b17 100644 (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`
index 248a352ab9849fa461879fc6e15bc8ae6906a825..d699773ede6694f06053846f91c6b0ada9224140 100644 (file)
@@ -110,7 +110,7 @@ create_hover_fallback(struct theme *theme, const char *icon_name,
        int icon_width = cairo_image_surface_get_width(icon.surface);
        int icon_height = cairo_image_surface_get_height(icon.surface);
 
-       int width = SSD_BUTTON_WIDTH;
+       int width = theme->window_button_width;
        int height = theme->title_height;
 
        if (width && height) {
@@ -488,6 +488,8 @@ theme_builtin(struct theme *theme, struct server *server)
        parse_hexstr("#000000", theme->window_inactive_label_text_color);
        theme->window_label_text_justify = parse_justification("Center");
 
+       theme->window_button_width = 26;
+
        parse_hexstr("#000000",
                theme->window_active_button_menu_unpressed_image_color);
        parse_hexstr("#000000",
@@ -642,6 +644,15 @@ entry(struct theme *theme, const char *key, const char *value)
                theme->window_label_text_justify = parse_justification(value);
        }
 
+       if (match_glob(key, "window.button.width")) {
+               theme->window_button_width = atoi(value);
+               if (theme->window_button_width < 1) {
+                       wlr_log(WLR_ERROR, "window.button.width cannot "
+                               "be less than 1, clamping it to 1.");
+                       theme->window_button_width = 1;
+               }
+       }
+
        /* universal button */
        if (match_glob(key, "window.active.button.unpressed.image.color")) {
                parse_hexstr(value,
@@ -1065,7 +1076,7 @@ create_corners(struct theme *theme)
        struct wlr_box box = {
                .x = 0,
                .y = 0,
-               .width = SSD_BUTTON_WIDTH + theme->border_width,
+               .width = theme->window_button_width + theme->border_width,
                .height = theme->title_height + theme->border_width,
        };
 
index d06251aa389a6d96d6939f0806379840b14370fb..8dd5e796ccab6e49caff701b028665f7a0c98869 100644 (file)
@@ -611,6 +611,7 @@ view_adjust_size(struct view *view, int *w, int *h)
 {
        assert(view);
        struct view_size_hints hints = view_get_size_hints(view);
+       int min_view_width = rc.theme->window_button_width * SSD_BUTTON_COUNT;
 
        /*
         * "If a base size is not provided, the minimum size is to be
@@ -633,7 +634,7 @@ view_adjust_size(struct view *view, int *w, int *h)
         * This is currently always the case for xdg-shell views.
         */
        if (hints.min_width < 1) {
-               hints.min_width = LAB_MIN_VIEW_WIDTH;
+               hints.min_width = min_view_width;
        }
        if (hints.min_height < 1) {
                hints.min_height = LAB_MIN_VIEW_HEIGHT;
index 9332f31d943fa86a2d2de85f5f742ba4bcadfb8d..87792d0f5b8f40ab82b84722381e63aa0cc15cae 100644 (file)
@@ -621,8 +621,9 @@ check_natural_geometry(struct view *view)
         * un-maximized size when started maximized. Try to detect this
         * and set a fallback size.
         */
+       int min_view_width = rc.theme->window_button_width * SSD_BUTTON_COUNT;
        if (!view_is_floating(view)
-                       && (view->natural_geometry.width < LAB_MIN_VIEW_WIDTH
+                       && (view->natural_geometry.width < min_view_width
                        || view->natural_geometry.height < LAB_MIN_VIEW_HEIGHT)) {
                view_set_fallback_natural_geometry(view);
        }