First version of hover icons

This commit is contained in:
Simon Long 2023-12-01 12:49:03 +00:00
parent 590ec0c77d
commit 3faca6ef18
5 changed files with 93 additions and 15 deletions

View file

@ -115,11 +115,11 @@ 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, int x, struct view *view); struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_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,
struct wlr_buffer *corner_buffer, struct wlr_buffer *icon_buffer, struct wlr_buffer *corner_buffer, struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer,
int x, struct view *view); int x, struct view *view);
/* SSD internal helpers */ /* SSD internal helpers */

View file

@ -87,6 +87,16 @@ struct theme {
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_maximize_active_hover;
struct lab_data_buffer *button_iconify_active_hover;
struct lab_data_buffer *button_menu_active_hover;
struct lab_data_buffer *button_close_inactive_hover;
struct lab_data_buffer *button_maximize_inactive_hover;
struct lab_data_buffer *button_iconify_inactive_hover;
struct lab_data_buffer *button_menu_inactive_hover;
struct lab_data_buffer *corner_top_left_active_normal; struct lab_data_buffer *corner_top_left_active_normal;
struct lab_data_buffer *corner_top_right_active_normal; struct lab_data_buffer *corner_top_right_active_normal;
struct lab_data_buffer *corner_top_left_inactive_normal; struct lab_data_buffer *corner_top_left_inactive_normal;

View file

@ -82,7 +82,7 @@ struct ssd_part *
add_scene_button_corner(struct wl_list *part_list, enum ssd_part_type type, add_scene_button_corner(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,
struct wlr_buffer *corner_buffer, struct wlr_buffer *icon_buffer, struct wlr_buffer *corner_buffer, struct wlr_buffer *icon_buffer,
int x, struct view *view) struct wlr_buffer *hover_buffer, int x, struct view *view)
{ {
int offset_x; int offset_x;
float invisible[4] = { 0, 0, 0, 0 }; float invisible[4] = { 0, 0, 0, 0 };
@ -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, 0, view); add_scene_button(part_list, type, parent, invisible, icon_buffer, hover_buffer, 0, view);
return button_root; return button_root;
} }
@ -141,10 +141,9 @@ 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, int x, struct view *view) struct wlr_buffer *icon_buffer, struct wlr_buffer *hover_buffer, int x, struct view *view)
{ {
struct wlr_scene_node *hover; struct wlr_scene_node *hover;
float hover_bg[4] = {0.15f, 0.15f, 0.15f, 0.3f};
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);
@ -166,15 +165,23 @@ add_scene_button(struct wl_list *part_list, enum ssd_part_type type,
wlr_scene_buffer_from_node(icon_part->node), wlr_scene_buffer_from_node(icon_part->node),
icon_geo.width, icon_geo.height); icon_geo.width, icon_geo.height);
/* Hover overlay */ /* Hover icon */
hover = add_scene_rect(part_list, type, parent, SSD_BUTTON_WIDTH, struct wlr_box hover_geo = get_scale_box(hover_buffer,
rc.theme->title_height, 0, 0, hover_bg)->node; SSD_BUTTON_WIDTH, rc.theme->title_height);
wlr_scene_node_set_enabled(hover, false); struct ssd_part *hover_part = add_scene_buffer(part_list, type,
parent, hover_buffer, hover_geo.x, hover_geo.y);
/* Make sure big icons are scaled down if necessary */
wlr_scene_buffer_set_dest_size(
wlr_scene_buffer_from_node(hover_part->node),
hover_geo.width, hover_geo.height);
wlr_scene_node_set_enabled(hover_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->hover = hover; button->hover = hover_part->node;
button->background = bg_rect->node; button->background = bg_rect->node;
return button_root; return button_root;
} }

View file

@ -36,6 +36,11 @@ ssd_titlebar_create(struct ssd *ssd)
struct wlr_buffer *maximize_button_unpressed; struct wlr_buffer *maximize_button_unpressed;
struct wlr_buffer *close_button_unpressed; struct wlr_buffer *close_button_unpressed;
struct wlr_buffer *menu_button_hover;
struct wlr_buffer *iconify_button_hover;
struct wlr_buffer *maximize_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);
struct ssd_sub_tree *subtree; struct ssd_sub_tree *subtree;
@ -51,6 +56,10 @@ 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;
menu_button_hover = &theme->button_menu_active_hover->base;
iconify_button_hover = &theme->button_iconify_active_hover->base;
close_button_hover = &theme->button_close_active_hover->base;
maximize_button_hover = &theme->button_maximize_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;
@ -60,6 +69,10 @@ ssd_titlebar_create(struct ssd *ssd)
maximize_button_unpressed = maximize_button_unpressed =
&theme->button_maximize_inactive_unpressed->base; &theme->button_maximize_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;
iconify_button_hover = &theme->button_iconify_inactive_hover->base;
close_button_hover = &theme->button_close_inactive_hover->base;
maximize_button_hover = &theme->button_maximize_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);
@ -71,16 +84,16 @@ ssd_titlebar_create(struct ssd *ssd)
/* Buttons */ /* Buttons */
add_scene_button_corner(&subtree->parts, add_scene_button_corner(&subtree->parts,
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, 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, color, iconify_button_unpressed, iconify_button_hover,
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, color, maximize_button_unpressed, maximize_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,
corner_top_right, close_button_unpressed, corner_top_right, close_button_unpressed, close_button_hover,
width - SSD_BUTTON_WIDTH * 1, view); width - SSD_BUTTON_WIDTH * 1, view);
} FOR_EACH_END } FOR_EACH_END

View file

@ -107,6 +107,54 @@ load_buttons(struct theme *theme)
theme->window_inactive_button_close_unpressed_image_color, theme->window_inactive_button_close_unpressed_image_color,
}, },
}, },
{
"menu_hover",
{ 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00 },
{
&theme->button_menu_active_hover,
theme->window_active_button_menu_unpressed_image_color,
},
{
&theme->button_menu_inactive_hover,
theme->window_inactive_button_menu_unpressed_image_color,
},
},
{
"iconify_hover",
{ 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f },
{
&theme->button_iconify_active_hover,
theme->window_active_button_iconify_unpressed_image_color,
},
{
&theme->button_iconify_inactive_hover,
theme->window_inactive_button_iconify_unpressed_image_color,
},
},
{
"max_hover",
{ 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f },
{
&theme->button_maximize_active_hover,
theme->window_active_button_max_unpressed_image_color,
},
{
&theme->button_maximize_inactive_hover,
theme->window_inactive_button_max_unpressed_image_color,
},
},
{
"close_hover",
{ 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 },
{
&theme->button_close_active_hover,
theme->window_active_button_close_unpressed_image_color,
},
{
&theme->button_close_inactive_hover,
theme->window_inactive_button_close_unpressed_image_color,
},
},
}; };
char filename[4096] = {0}; char filename[4096] = {0};