diff --git a/include/ssd-internal.h b/include/ssd-internal.h index e52ae49d..4b458263 100644 --- a/include/ssd-internal.h +++ b/include/ssd-internal.h @@ -115,11 +115,11 @@ struct ssd_part *add_scene_buffer( struct ssd_part *add_scene_button( struct wl_list *part_list, enum ssd_part_type type, 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 wl_list *part_list, enum ssd_part_type type, 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); /* SSD internal helpers */ diff --git a/include/theme.h b/include/theme.h index e211d0f0..6238b555 100644 --- a/include/theme.h +++ b/include/theme.h @@ -87,6 +87,16 @@ struct theme { struct lab_data_buffer *button_iconify_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_right_active_normal; struct lab_data_buffer *corner_top_left_inactive_normal; diff --git a/src/ssd/ssd_part.c b/src/ssd/ssd_part.c index 4c72d291..2b96aead 100644 --- a/src/ssd/ssd_part.c +++ b/src/ssd/ssd_part.c @@ -82,7 +82,7 @@ struct ssd_part * 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, 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; 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); /* 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; } @@ -141,10 +141,9 @@ get_scale_box(struct wlr_buffer *buffer, double container_width, struct ssd_part * add_scene_button(struct wl_list *part_list, enum ssd_part_type type, 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; - float hover_bg[4] = {0.15f, 0.15f, 0.15f, 0.3f}; struct ssd_part *button_root = add_scene_part(part_list, type); 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), icon_geo.width, icon_geo.height); - /* Hover overlay */ - hover = add_scene_rect(part_list, type, parent, SSD_BUTTON_WIDTH, - rc.theme->title_height, 0, 0, hover_bg)->node; - wlr_scene_node_set_enabled(hover, false); + /* Hover icon */ + struct wlr_box hover_geo = get_scale_box(hover_buffer, + SSD_BUTTON_WIDTH, rc.theme->title_height); + 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); button->type = type; button->view = view; - button->hover = hover; + button->hover = hover_part->node; button->background = bg_rect->node; return button_root; } diff --git a/src/ssd/ssd_titlebar.c b/src/ssd/ssd_titlebar.c index 62ac232c..5e23bc71 100644 --- a/src/ssd/ssd_titlebar.c +++ b/src/ssd/ssd_titlebar.c @@ -36,6 +36,11 @@ ssd_titlebar_create(struct ssd *ssd) struct wlr_buffer *maximize_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); struct ssd_sub_tree *subtree; @@ -51,6 +56,10 @@ ssd_titlebar_create(struct ssd *ssd) iconify_button_unpressed = &theme->button_iconify_active_unpressed->base; close_button_unpressed = &theme->button_close_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 { color = theme->window_inactive_title_bg_color; corner_top_left = &theme->corner_top_left_inactive_normal->base; @@ -60,6 +69,10 @@ ssd_titlebar_create(struct ssd *ssd) maximize_button_unpressed = &theme->button_maximize_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); } wl_list_init(&subtree->parts); @@ -71,16 +84,16 @@ ssd_titlebar_create(struct ssd *ssd) /* 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, 0, view); + 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, + color, iconify_button_unpressed, iconify_button_hover, width - SSD_BUTTON_WIDTH * 3, view); 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); add_scene_button_corner(&subtree->parts, 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); } FOR_EACH_END diff --git a/src/theme.c b/src/theme.c index 8c9c6cad..067b0b95 100644 --- a/src/theme.c +++ b/src/theme.c @@ -107,6 +107,54 @@ load_buttons(struct theme *theme) 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};