mirror of
https://github.com/labwc/labwc.git
synced 2025-11-05 13:29:58 -05:00
Support hover icons in titlebar (#1280)
Allow both max_toggled_hover and max_hover_toggled names for icons
This commit is contained in:
parent
5d2f594626
commit
c79b8ba8a7
8 changed files with 258 additions and 30 deletions
|
|
@ -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,11 +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);
|
||||
button_root->node = &parent->node;
|
||||
|
|
@ -166,19 +164,66 @@ 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->normal = icon_part->node;
|
||||
button->hover = hover_part->node;
|
||||
button->background = bg_rect->node;
|
||||
button->toggled = NULL;
|
||||
button->toggled_hover = NULL;
|
||||
return button_root;
|
||||
}
|
||||
|
||||
void
|
||||
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 = wlr_scene_tree_from_node(part->node);
|
||||
|
||||
/* Alternate icon */
|
||||
struct wlr_box icon_geo = get_scale_box(icon_buffer,
|
||||
SSD_BUTTON_WIDTH, rc.theme->title_height);
|
||||
|
||||
struct ssd_part *alticon_part = add_scene_buffer(part_list, type,
|
||||
parent, icon_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);
|
||||
|
||||
struct wlr_box hover_geo = get_scale_box(hover_buffer,
|
||||
SSD_BUTTON_WIDTH, rc.theme->title_height);
|
||||
struct ssd_part *althover_part = add_scene_buffer(part_list, type,
|
||||
parent, hover_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);
|
||||
|
||||
button->toggled = alticon_part->node;
|
||||
button->toggled_hover = althover_part->node;
|
||||
}
|
||||
|
||||
struct ssd_part *
|
||||
ssd_get_part(struct wl_list *part_list, enum ssd_part_type type)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -34,8 +34,15 @@ ssd_titlebar_create(struct ssd *ssd)
|
|||
struct wlr_buffer *menu_button_unpressed;
|
||||
struct wlr_buffer *iconify_button_unpressed;
|
||||
struct wlr_buffer *maximize_button_unpressed;
|
||||
struct wlr_buffer *restore_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 *restore_button_hover;
|
||||
struct wlr_buffer *close_button_hover;
|
||||
|
||||
ssd->titlebar.tree = wlr_scene_tree_create(ssd->tree);
|
||||
|
||||
struct ssd_sub_tree *subtree;
|
||||
|
|
@ -51,6 +58,12 @@ 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;
|
||||
restore_button_unpressed = &theme->button_restore_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;
|
||||
restore_button_hover = &theme->button_restore_active_hover->base;
|
||||
} else {
|
||||
color = theme->window_inactive_title_bg_color;
|
||||
corner_top_left = &theme->corner_top_left_inactive_normal->base;
|
||||
|
|
@ -59,7 +72,13 @@ ssd_titlebar_create(struct ssd *ssd)
|
|||
iconify_button_unpressed = &theme->button_iconify_inactive_unpressed->base;
|
||||
maximize_button_unpressed =
|
||||
&theme->button_maximize_inactive_unpressed->base;
|
||||
restore_button_unpressed = &theme->button_restore_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;
|
||||
restore_button_hover = &theme->button_restore_inactive_hover->base;
|
||||
wlr_scene_node_set_enabled(&parent->node, false);
|
||||
}
|
||||
wl_list_init(&subtree->parts);
|
||||
|
|
@ -71,16 +90,18 @@ 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_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,
|
||||
corner_top_right, close_button_unpressed,
|
||||
corner_top_right, close_button_unpressed, close_button_hover,
|
||||
width - SSD_BUTTON_WIDTH * 1, view);
|
||||
} FOR_EACH_END
|
||||
|
||||
|
|
@ -159,10 +180,22 @@ ssd_titlebar_update(struct ssd *ssd)
|
|||
width - SSD_BUTTON_WIDTH * 3, 0);
|
||||
}
|
||||
continue;
|
||||
case LAB_SSD_BUTTON_MAXIMIZE:
|
||||
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);
|
||||
struct ssd_button *button =
|
||||
node_ssd_button_from_node(part->node);
|
||||
if (button->toggled) {
|
||||
wlr_scene_node_set_enabled(button->normal,
|
||||
!maximized);
|
||||
wlr_scene_node_set_enabled(button->toggled,
|
||||
maximized);
|
||||
wlr_scene_node_set_enabled(button->hover,
|
||||
false);
|
||||
wlr_scene_node_set_enabled(button->toggled_hover,
|
||||
false);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
case LAB_SSD_PART_CORNER_TOP_RIGHT:
|
||||
|
|
@ -365,13 +398,24 @@ ssd_update_button_hover(struct wlr_scene_node *node,
|
|||
disable_old_hover:
|
||||
if (hover_state->node) {
|
||||
wlr_scene_node_set_enabled(hover_state->node, false);
|
||||
if (hover_state->maximized == (int)hover_state->view->maximized
|
||||
|| hover_state->maximized == -1) {
|
||||
wlr_scene_node_set_enabled(hover_state->old_node, true);
|
||||
}
|
||||
hover_state->view = NULL;
|
||||
hover_state->node = NULL;
|
||||
}
|
||||
if (button) {
|
||||
wlr_scene_node_set_enabled(button->hover, true);
|
||||
bool maximized = button->view->maximized;
|
||||
if (maximized && !button->toggled) {
|
||||
maximized = false;
|
||||
}
|
||||
wlr_scene_node_set_enabled(maximized ? button->toggled_hover : button->hover, true);
|
||||
hover_state->view = button->view;
|
||||
hover_state->node = button->hover;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue