diff --git a/docs/labwc-theme.5.scd b/docs/labwc-theme.5.scd index 73be8d27..efd07259 100644 --- a/docs/labwc-theme.5.scd +++ b/docs/labwc-theme.5.scd @@ -197,6 +197,16 @@ file within a particular theme. The following xbm buttons are supported: - iconify.xbm - close.xbm - menu.xbm +- max_toggled.xbm + +Additional icons can be defined to be shown when the mouse pointer is hovering +over the button in question: + +- max_hover.xbm +- iconify_hover.xbm +- close_hover.xbm +- menu_hover.xbm +- max_hover_toggled.xbm One advantage of xbm buttons over other formats is that they change color based on the theme. Other formats use the suffices "-active" and "-inactive" to align diff --git a/include/ssd-internal.h b/include/ssd-internal.h index fa019a29..bfc11018 100644 --- a/include/ssd-internal.h +++ b/include/ssd-internal.h @@ -18,10 +18,10 @@ struct ssd_button { struct view *view; enum ssd_part_type type; - struct wlr_scene_node *icon; + struct wlr_scene_node *normal; struct wlr_scene_node *hover; - struct wlr_scene_node *alticon; - struct wlr_scene_node *althover; + struct wlr_scene_node *toggled; + struct wlr_scene_node *toggled_hover; struct wlr_scene_node *background; struct wl_listener destroy; @@ -124,7 +124,7 @@ struct ssd_part *add_scene_button( struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer, int x, struct view *view); void -add_alt_icon(struct wl_list *part_list, enum ssd_part_type type, +add_toggled_icon(struct wl_list *part_list, enum ssd_part_type type, struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer); struct ssd_part *add_scene_button_corner( struct wl_list *part_list, enum ssd_part_type type, diff --git a/src/ssd/ssd_part.c b/src/ssd/ssd_part.c index 6e78c1ef..ea53c104 100644 --- a/src/ssd/ssd_part.c +++ b/src/ssd/ssd_part.c @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only #include -#include "common/scene-helpers.h" #include "common/list.h" #include "common/mem.h" #include "labwc.h" @@ -181,21 +180,21 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type, struct ssd_button *button = ssd_button_descriptor_create(button_root->node); button->type = type; button->view = view; - button->icon = icon_part->node; + button->normal = icon_part->node; button->hover = hover_part->node; button->background = bg_rect->node; - button->alticon = NULL; - button->althover = NULL; + button->toggled = NULL; + button->toggled_hover = NULL; return button_root; } void -add_alt_icon(struct wl_list *part_list, enum ssd_part_type type, +add_toggled_icon(struct wl_list *part_list, enum ssd_part_type type, struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer) { struct ssd_part *part = ssd_get_part(part_list, type); struct ssd_button *button = node_ssd_button_from_node(part->node); - struct wlr_scene_tree *parent = lab_scene_tree_from_node(part->node); + struct wlr_scene_tree *parent = wlr_scene_tree_from_node(part->node); /* Alternate icon */ struct wlr_box icon_geo = get_scale_box(icon_buffer, @@ -221,8 +220,8 @@ add_alt_icon(struct wl_list *part_list, enum ssd_part_type type, wlr_scene_node_set_enabled(althover_part->node, false); - button->alticon = alticon_part->node; - button->althover = althover_part->node; + button->toggled = alticon_part->node; + button->toggled_hover = althover_part->node; } struct ssd_part * diff --git a/src/ssd/ssd_titlebar.c b/src/ssd/ssd_titlebar.c index 04c05eb7..7b2ef2f3 100644 --- a/src/ssd/ssd_titlebar.c +++ b/src/ssd/ssd_titlebar.c @@ -97,7 +97,7 @@ ssd_titlebar_create(struct ssd *ssd) add_scene_button(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, parent, color, maximize_button_unpressed, maximize_button_hover, width - SSD_BUTTON_WIDTH * 2, view); - add_alt_icon(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, + add_toggled_icon(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, restore_button_unpressed, restore_button_hover); add_scene_button_corner(&subtree->parts, LAB_SSD_BUTTON_CLOSE, LAB_SSD_PART_CORNER_TOP_RIGHT, parent, @@ -186,14 +186,14 @@ ssd_titlebar_update(struct ssd *ssd) width - SSD_BUTTON_WIDTH * 2, 0); struct ssd_button *button = node_ssd_button_from_node(part->node); - if (button->alticon) { - wlr_scene_node_set_enabled(button->icon, + if (button->toggled) { + wlr_scene_node_set_enabled(button->normal, !maximized); - wlr_scene_node_set_enabled(button->alticon, + wlr_scene_node_set_enabled(button->toggled, maximized); wlr_scene_node_set_enabled(button->hover, false); - wlr_scene_node_set_enabled(button->althover, + wlr_scene_node_set_enabled(button->toggled_hover, false); } } @@ -407,15 +407,15 @@ disable_old_hover: } if (button) { bool maximized = button->view->maximized; - if (maximized && !button->alticon) { + if (maximized && !button->toggled) { maximized = false; } - wlr_scene_node_set_enabled(maximized ? button->althover : button->hover, true); + wlr_scene_node_set_enabled(maximized ? button->toggled_hover : button->hover, true); hover_state->view = button->view; - hover_state->node = maximized ? button->althover : button->hover; - hover_state->old_node = maximized ? button->alticon : button->icon; - hover_state->maximized = button->alticon ? (int)button->view->maximized : -1; - wlr_scene_node_set_enabled(maximized ? button->alticon : button->icon, false); + hover_state->node = maximized ? button->toggled_hover : button->hover; + hover_state->old_node = maximized ? button->toggled : button->normal; + hover_state->maximized = button->toggled ? (int)button->view->maximized : -1; + wlr_scene_node_set_enabled(maximized ? button->toggled : button->normal, false); } } diff --git a/src/theme.c b/src/theme.c index e80f4ec5..b4c37f0b 100644 --- a/src/theme.c +++ b/src/theme.c @@ -97,7 +97,7 @@ load_buttons(struct theme *theme) }, { "max_toggled", - { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f }, + { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f }, { &theme->button_restore_active_unpressed, theme->window_active_button_max_unpressed_image_color, @@ -157,7 +157,7 @@ load_buttons(struct theme *theme) }, { "max_hover_toggled", - { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f }, + { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f }, { &theme->button_restore_active_hover, theme->window_active_button_max_unpressed_image_color,