Add restore icon and clearing of base icon when hovering

This commit is contained in:
Simon Long 2023-12-01 17:04:25 +00:00
parent 3faca6ef18
commit 1abe0fb0b9
5 changed files with 89 additions and 9 deletions

View file

@ -5,6 +5,7 @@
#include <wlr/util/box.h> #include <wlr/util/box.h>
#include "common/macros.h" #include "common/macros.h"
#include "ssd.h" #include "ssd.h"
#include "view.h"
#define FOR_EACH(tmp, ...) \ #define FOR_EACH(tmp, ...) \
{ \ { \
@ -17,7 +18,10 @@
struct ssd_button { struct ssd_button {
struct view *view; struct view *view;
enum ssd_part_type type; enum ssd_part_type type;
struct wlr_scene_node *icon;
struct wlr_scene_node *hover; struct wlr_scene_node *hover;
struct wlr_scene_node *alticon;
struct wlr_scene_node *althover;
struct wlr_scene_node *background; struct wlr_scene_node *background;
struct wl_listener destroy; struct wl_listener destroy;
@ -96,6 +100,8 @@ struct ssd_part {
struct ssd_hover_state { struct ssd_hover_state {
struct view *view; struct view *view;
struct wlr_scene_node *node; struct wlr_scene_node *node;
struct wlr_scene_node *old_node;
enum view_axis maximized;
}; };
struct wlr_buffer; struct wlr_buffer;
@ -115,7 +121,9 @@ struct ssd_part *add_scene_buffer(
struct ssd_part *add_scene_button( struct ssd_part *add_scene_button(
struct wl_list *part_list, enum ssd_part_type type, struct wl_list *part_list, enum ssd_part_type type,
struct wlr_scene_tree *parent, float *bg_color, struct wlr_scene_tree *parent, float *bg_color,
struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer, int x, struct view *view); struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer,
struct wlr_buffer *alticon_buffer, struct wlr_buffer *althover_buffer,
int x, struct view *view);
struct ssd_part *add_scene_button_corner( struct ssd_part *add_scene_button_corner(
struct wl_list *part_list, enum ssd_part_type type, struct wl_list *part_list, enum ssd_part_type type,
enum ssd_part_type corner_type, struct wlr_scene_tree *parent, enum ssd_part_type corner_type, struct wlr_scene_tree *parent,

View file

@ -79,21 +79,25 @@ struct theme {
/* textures */ /* textures */
struct lab_data_buffer *button_close_active_unpressed; struct lab_data_buffer *button_close_active_unpressed;
struct lab_data_buffer *button_maximize_active_unpressed; struct lab_data_buffer *button_maximize_active_unpressed;
struct lab_data_buffer *button_restore_active_unpressed;
struct lab_data_buffer *button_iconify_active_unpressed; struct lab_data_buffer *button_iconify_active_unpressed;
struct lab_data_buffer *button_menu_active_unpressed; struct lab_data_buffer *button_menu_active_unpressed;
struct lab_data_buffer *button_close_inactive_unpressed; struct lab_data_buffer *button_close_inactive_unpressed;
struct lab_data_buffer *button_maximize_inactive_unpressed; struct lab_data_buffer *button_maximize_inactive_unpressed;
struct lab_data_buffer *button_restore_inactive_unpressed;
struct lab_data_buffer *button_iconify_inactive_unpressed; struct lab_data_buffer *button_iconify_inactive_unpressed;
struct lab_data_buffer *button_menu_inactive_unpressed; struct lab_data_buffer *button_menu_inactive_unpressed;
struct lab_data_buffer *button_close_active_hover; struct lab_data_buffer *button_close_active_hover;
struct lab_data_buffer *button_maximize_active_hover; struct lab_data_buffer *button_maximize_active_hover;
struct lab_data_buffer *button_restore_active_hover;
struct lab_data_buffer *button_iconify_active_hover; struct lab_data_buffer *button_iconify_active_hover;
struct lab_data_buffer *button_menu_active_hover; struct lab_data_buffer *button_menu_active_hover;
struct lab_data_buffer *button_close_inactive_hover; struct lab_data_buffer *button_close_inactive_hover;
struct lab_data_buffer *button_maximize_inactive_hover; struct lab_data_buffer *button_maximize_inactive_hover;
struct lab_data_buffer *button_restore_inactive_hover;
struct lab_data_buffer *button_iconify_inactive_hover; struct lab_data_buffer *button_iconify_inactive_hover;
struct lab_data_buffer *button_menu_inactive_hover; struct lab_data_buffer *button_menu_inactive_hover;

View file

@ -108,7 +108,7 @@ add_scene_button_corner(struct wl_list *part_list, enum ssd_part_type type,
-offset_x, -rc.theme->border_width); -offset_x, -rc.theme->border_width);
/* Finally just put a usual theme button on top, using an invisible hitbox */ /* Finally just put a usual theme button on top, using an invisible hitbox */
add_scene_button(part_list, type, parent, invisible, icon_buffer, hover_buffer, 0, view); add_scene_button(part_list, type, parent, invisible, icon_buffer, hover_buffer, NULL, NULL, 0, view);
return button_root; return button_root;
} }
@ -141,10 +141,10 @@ get_scale_box(struct wlr_buffer *buffer, double container_width,
struct ssd_part * struct ssd_part *
add_scene_button(struct wl_list *part_list, enum ssd_part_type type, add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
struct wlr_scene_tree *parent, float *bg_color, struct wlr_scene_tree *parent, float *bg_color,
struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer, int x, struct view *view) struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer,
struct wlr_buffer *alticon_buffer, struct wlr_buffer *althover_buffer,
int x, struct view *view)
{ {
struct wlr_scene_node *hover;
struct ssd_part *button_root = add_scene_part(part_list, type); struct ssd_part *button_root = add_scene_part(part_list, type);
parent = wlr_scene_tree_create(parent); parent = wlr_scene_tree_create(parent);
button_root->node = &parent->node; button_root->node = &parent->node;
@ -178,9 +178,34 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
wlr_scene_node_set_enabled(hover_part->node, false); wlr_scene_node_set_enabled(hover_part->node, false);
/* Alternate icon */
struct ssd_part *alticon_part, *althover_part;
if (alticon_buffer)
{
alticon_part = add_scene_buffer(part_list, type,
parent, alticon_buffer, icon_geo.x, icon_geo.y);
wlr_scene_buffer_set_dest_size(
wlr_scene_buffer_from_node(alticon_part->node),
icon_geo.width, icon_geo.height);
wlr_scene_node_set_enabled(alticon_part->node, false);
althover_part = add_scene_buffer(part_list, type,
parent, althover_buffer, hover_geo.x, hover_geo.y);
wlr_scene_buffer_set_dest_size(
wlr_scene_buffer_from_node(althover_part->node),
hover_geo.width, hover_geo.height);
wlr_scene_node_set_enabled(althover_part->node, false);
}
struct ssd_button *button = ssd_button_descriptor_create(button_root->node); struct ssd_button *button = ssd_button_descriptor_create(button_root->node);
button->type = type; button->type = type;
button->view = view; button->view = view;
button->icon = icon_part->node;
button->alticon = alticon_buffer ? alticon_part->node : NULL;
button->althover = alticon_buffer ? althover_part->node : NULL;
button->hover = hover_part->node; button->hover = hover_part->node;
button->background = bg_rect->node; button->background = bg_rect->node;
return button_root; return button_root;

View file

@ -34,11 +34,13 @@ ssd_titlebar_create(struct ssd *ssd)
struct wlr_buffer *menu_button_unpressed; struct wlr_buffer *menu_button_unpressed;
struct wlr_buffer *iconify_button_unpressed; struct wlr_buffer *iconify_button_unpressed;
struct wlr_buffer *maximize_button_unpressed; struct wlr_buffer *maximize_button_unpressed;
struct wlr_buffer *restore_button_unpressed;
struct wlr_buffer *close_button_unpressed; struct wlr_buffer *close_button_unpressed;
struct wlr_buffer *menu_button_hover; struct wlr_buffer *menu_button_hover;
struct wlr_buffer *iconify_button_hover; struct wlr_buffer *iconify_button_hover;
struct wlr_buffer *maximize_button_hover; struct wlr_buffer *maximize_button_hover;
struct wlr_buffer *restore_button_hover;
struct wlr_buffer *close_button_hover; struct wlr_buffer *close_button_hover;
ssd->titlebar.tree = wlr_scene_tree_create(ssd->tree); ssd->titlebar.tree = wlr_scene_tree_create(ssd->tree);
@ -56,10 +58,12 @@ ssd_titlebar_create(struct ssd *ssd)
iconify_button_unpressed = &theme->button_iconify_active_unpressed->base; iconify_button_unpressed = &theme->button_iconify_active_unpressed->base;
close_button_unpressed = &theme->button_close_active_unpressed->base; close_button_unpressed = &theme->button_close_active_unpressed->base;
maximize_button_unpressed = &theme->button_maximize_active_unpressed->base; maximize_button_unpressed = &theme->button_maximize_active_unpressed->base;
restore_button_unpressed = &theme->button_restore_active_unpressed->base;
menu_button_hover = &theme->button_menu_active_hover->base; menu_button_hover = &theme->button_menu_active_hover->base;
iconify_button_hover = &theme->button_iconify_active_hover->base; iconify_button_hover = &theme->button_iconify_active_hover->base;
close_button_hover = &theme->button_close_active_hover->base; close_button_hover = &theme->button_close_active_hover->base;
maximize_button_hover = &theme->button_maximize_active_hover->base; maximize_button_hover = &theme->button_maximize_active_hover->base;
restore_button_hover = &theme->button_restore_active_hover->base;
} else { } else {
color = theme->window_inactive_title_bg_color; color = theme->window_inactive_title_bg_color;
corner_top_left = &theme->corner_top_left_inactive_normal->base; corner_top_left = &theme->corner_top_left_inactive_normal->base;
@ -68,11 +72,13 @@ ssd_titlebar_create(struct ssd *ssd)
iconify_button_unpressed = &theme->button_iconify_inactive_unpressed->base; iconify_button_unpressed = &theme->button_iconify_inactive_unpressed->base;
maximize_button_unpressed = maximize_button_unpressed =
&theme->button_maximize_inactive_unpressed->base; &theme->button_maximize_inactive_unpressed->base;
restore_button_unpressed = &theme->button_restore_inactive_unpressed->base;
close_button_unpressed = &theme->button_close_inactive_unpressed->base; close_button_unpressed = &theme->button_close_inactive_unpressed->base;
menu_button_hover = &theme->button_menu_inactive_hover->base; menu_button_hover = &theme->button_menu_inactive_hover->base;
iconify_button_hover = &theme->button_iconify_inactive_hover->base; iconify_button_hover = &theme->button_iconify_inactive_hover->base;
close_button_hover = &theme->button_close_inactive_hover->base; close_button_hover = &theme->button_close_inactive_hover->base;
maximize_button_hover = &theme->button_maximize_inactive_hover->base; maximize_button_hover = &theme->button_maximize_inactive_hover->base;
restore_button_hover = &theme->button_restore_inactive_hover->base;
wlr_scene_node_set_enabled(&parent->node, false); wlr_scene_node_set_enabled(&parent->node, false);
} }
wl_list_init(&subtree->parts); wl_list_init(&subtree->parts);
@ -86,10 +92,11 @@ ssd_titlebar_create(struct ssd *ssd)
LAB_SSD_BUTTON_WINDOW_MENU, LAB_SSD_PART_CORNER_TOP_LEFT, parent, LAB_SSD_BUTTON_WINDOW_MENU, LAB_SSD_PART_CORNER_TOP_LEFT, parent,
corner_top_left, menu_button_unpressed, menu_button_hover, 0, view); corner_top_left, menu_button_unpressed, menu_button_hover, 0, view);
add_scene_button(&subtree->parts, LAB_SSD_BUTTON_ICONIFY, parent, add_scene_button(&subtree->parts, LAB_SSD_BUTTON_ICONIFY, parent,
color, iconify_button_unpressed, iconify_button_hover, color, iconify_button_unpressed, iconify_button_hover, NULL, NULL,
width - SSD_BUTTON_WIDTH * 3, view); width - SSD_BUTTON_WIDTH * 3, view);
add_scene_button(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, parent, add_scene_button(&subtree->parts, LAB_SSD_BUTTON_MAXIMIZE, parent,
color, maximize_button_unpressed, maximize_button_hover, color, maximize_button_unpressed, maximize_button_hover,
restore_button_unpressed, restore_button_hover,
width - SSD_BUTTON_WIDTH * 2, view); width - SSD_BUTTON_WIDTH * 2, view);
add_scene_button_corner(&subtree->parts, add_scene_button_corner(&subtree->parts,
LAB_SSD_BUTTON_CLOSE, LAB_SSD_PART_CORNER_TOP_RIGHT, parent, LAB_SSD_BUTTON_CLOSE, LAB_SSD_PART_CORNER_TOP_RIGHT, parent,
@ -172,10 +179,15 @@ ssd_titlebar_update(struct ssd *ssd)
width - SSD_BUTTON_WIDTH * 3, 0); width - SSD_BUTTON_WIDTH * 3, 0);
} }
continue; continue;
case LAB_SSD_BUTTON_MAXIMIZE: case LAB_SSD_BUTTON_MAXIMIZE:
if (is_direct_child(part->node, subtree)) { if (is_direct_child(part->node, subtree)) {
wlr_scene_node_set_position(part->node, wlr_scene_node_set_position(part->node,
width - SSD_BUTTON_WIDTH * 2, 0); width - SSD_BUTTON_WIDTH * 2, 0);
struct ssd_button *button = node_ssd_button_from_node(part->node);
wlr_scene_node_set_enabled (button->icon, !maximized);
wlr_scene_node_set_enabled (button->alticon, maximized);
wlr_scene_node_set_enabled (button->hover, false);
wlr_scene_node_set_enabled (button->althover, false);
} }
continue; continue;
case LAB_SSD_PART_CORNER_TOP_RIGHT: case LAB_SSD_PART_CORNER_TOP_RIGHT:
@ -378,13 +390,20 @@ ssd_update_button_hover(struct wlr_scene_node *node,
disable_old_hover: disable_old_hover:
if (hover_state->node) { if (hover_state->node) {
wlr_scene_node_set_enabled(hover_state->node, false); wlr_scene_node_set_enabled(hover_state->node, false);
if (hover_state->maximized == hover_state->view->maximized)
wlr_scene_node_set_enabled (hover_state->old_node, true);
hover_state->view = NULL; hover_state->view = NULL;
hover_state->node = NULL; hover_state->node = NULL;
} }
if (button) { if (button) {
wlr_scene_node_set_enabled(button->hover, true); bool maximized = button->view->maximized;
if (maximized && !button->alticon) maximized = false;
wlr_scene_node_set_enabled (maximized ? button->althover : button->hover, true);
hover_state->view = button->view; hover_state->view = button->view;
hover_state->node = button->hover; hover_state->node = maximized ? button->althover : button->hover;
hover_state->old_node = maximized ? button->alticon : button->icon;
hover_state->maximized = button->view->maximized;
wlr_scene_node_set_enabled (maximized ? button->alticon : button->icon, false);
} }
} }

View file

@ -95,6 +95,18 @@ load_buttons(struct theme *theme)
theme->window_inactive_button_max_unpressed_image_color, theme->window_inactive_button_max_unpressed_image_color,
}, },
}, },
{
"max_toggled",
{ 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f },
{
&theme->button_restore_active_unpressed,
theme->window_active_button_max_unpressed_image_color,
},
{
&theme->button_restore_inactive_unpressed,
theme->window_inactive_button_max_unpressed_image_color,
},
},
{ {
"close", "close",
{ 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 }, { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 },
@ -143,6 +155,18 @@ load_buttons(struct theme *theme)
theme->window_inactive_button_max_unpressed_image_color, theme->window_inactive_button_max_unpressed_image_color,
}, },
}, },
{
"max_hover_toggled",
{ 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f },
{
&theme->button_restore_active_hover,
theme->window_active_button_max_unpressed_image_color,
},
{
&theme->button_restore_inactive_hover,
theme->window_inactive_button_max_unpressed_image_color,
},
},
{ {
"close_hover", "close_hover",
{ 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 }, { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 },