mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -05:00
theme: use non-hover button variants as fallback
Some themes don't have hover variants for button pixmaps. It looks better visually to use the non-hover variants as fallbacks rather than the built-in 6x6 pixmaps.
This commit is contained in:
parent
6a2a52c0ad
commit
d207e97992
5 changed files with 25 additions and 17 deletions
|
|
@ -6,6 +6,7 @@ struct lab_data_buffer;
|
||||||
|
|
||||||
/* button_xbm_load - Convert xbm file to buffer with cairo surface */
|
/* button_xbm_load - Convert xbm file to buffer with cairo surface */
|
||||||
void button_xbm_load(const char *button_name, const char *alt_name,
|
void button_xbm_load(const char *button_name, const char *alt_name,
|
||||||
struct lab_data_buffer **buffer, char *fallback_button, float *rgba);
|
struct lab_data_buffer **buffer, const char *fallback_button,
|
||||||
|
float *rgba);
|
||||||
|
|
||||||
#endif /* LABWC_BUTTON_XBM_H */
|
#endif /* LABWC_BUTTON_XBM_H */
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,7 @@ 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;
|
||||||
|
|
||||||
|
/* hover variants are optional and may be NULL */
|
||||||
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_restore_active_hover;
|
||||||
|
|
|
||||||
|
|
@ -260,7 +260,8 @@ parse_xbm_builtin(const char *button, int size)
|
||||||
|
|
||||||
void
|
void
|
||||||
button_xbm_load(const char *button_name, const char *alt_name,
|
button_xbm_load(const char *button_name, const char *alt_name,
|
||||||
struct lab_data_buffer **buffer, char *fallback_button, float *rgba)
|
struct lab_data_buffer **buffer, const char *fallback_button,
|
||||||
|
float *rgba)
|
||||||
{
|
{
|
||||||
struct pixmap pixmap = {0};
|
struct pixmap pixmap = {0};
|
||||||
if (*buffer) {
|
if (*buffer) {
|
||||||
|
|
@ -270,7 +271,7 @@ button_xbm_load(const char *button_name, const char *alt_name,
|
||||||
|
|
||||||
color = u32(rgba);
|
color = u32(rgba);
|
||||||
|
|
||||||
/* Read file into memory as it's easier to tokenzie that way */
|
/* Read file into memory as it's easier to tokenize that way */
|
||||||
char filename[4096] = { 0 };
|
char filename[4096] = { 0 };
|
||||||
button_filename(button_name, filename, sizeof(filename));
|
button_filename(button_name, filename, sizeof(filename));
|
||||||
char *token_buffer = grab_file(filename);
|
char *token_buffer = grab_file(filename);
|
||||||
|
|
@ -294,11 +295,13 @@ button_xbm_load(const char *button_name, const char *alt_name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!pixmap.data) {
|
if (!pixmap.data && fallback_button) {
|
||||||
pixmap = parse_xbm_builtin(fallback_button, 6);
|
pixmap = parse_xbm_builtin(fallback_button, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create buffer with free_on_destroy being true */
|
/* Create buffer with free_on_destroy being true */
|
||||||
*buffer = buffer_create_wrap(pixmap.data, pixmap.width, pixmap.height,
|
if (pixmap.data) {
|
||||||
pixmap.width * 4, true);
|
*buffer = buffer_create_wrap(pixmap.data, pixmap.width,
|
||||||
|
pixmap.height, pixmap.width * 4, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,7 @@ ssd_titlebar_create(struct ssd *ssd)
|
||||||
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;
|
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;
|
||||||
|
|
@ -75,11 +76,13 @@ ssd_titlebar_create(struct ssd *ssd)
|
||||||
&theme->button_maximize_inactive_unpressed->base;
|
&theme->button_maximize_inactive_unpressed->base;
|
||||||
restore_button_unpressed = &theme->button_restore_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;
|
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);
|
||||||
|
|
|
||||||
22
src/theme.c
22
src/theme.c
|
|
@ -40,7 +40,7 @@
|
||||||
struct button {
|
struct button {
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *alt_name;
|
const char *alt_name;
|
||||||
char fallback_button[6]; /* built-in 6x6 button */
|
const char *fallback_button; /* built-in 6x6 button */
|
||||||
struct {
|
struct {
|
||||||
struct lab_data_buffer **buffer;
|
struct lab_data_buffer **buffer;
|
||||||
float *rgba;
|
float *rgba;
|
||||||
|
|
@ -91,56 +91,56 @@ load_buttons(struct theme *theme)
|
||||||
{
|
{
|
||||||
struct button buttons[] = { {
|
struct button buttons[] = { {
|
||||||
.name = "menu",
|
.name = "menu",
|
||||||
.fallback_button = { 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00 },
|
.fallback_button = (const char[]){ 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00 },
|
||||||
.active.buffer = &theme->button_menu_active_unpressed,
|
.active.buffer = &theme->button_menu_active_unpressed,
|
||||||
.active.rgba = theme->window_active_button_menu_unpressed_image_color,
|
.active.rgba = theme->window_active_button_menu_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_menu_inactive_unpressed,
|
.inactive.buffer = &theme->button_menu_inactive_unpressed,
|
||||||
.inactive.rgba = theme->window_inactive_button_menu_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_menu_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "iconify",
|
.name = "iconify",
|
||||||
.fallback_button = { 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f },
|
.fallback_button = (const char[]){ 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f },
|
||||||
.active.buffer = &theme->button_iconify_active_unpressed,
|
.active.buffer = &theme->button_iconify_active_unpressed,
|
||||||
.active.rgba = theme->window_active_button_iconify_unpressed_image_color,
|
.active.rgba = theme->window_active_button_iconify_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_iconify_inactive_unpressed,
|
.inactive.buffer = &theme->button_iconify_inactive_unpressed,
|
||||||
.inactive.rgba = theme->window_inactive_button_iconify_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_iconify_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "max",
|
.name = "max",
|
||||||
.fallback_button = { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f },
|
.fallback_button = (const char[]){ 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f },
|
||||||
.active.buffer = &theme->button_maximize_active_unpressed,
|
.active.buffer = &theme->button_maximize_active_unpressed,
|
||||||
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_maximize_inactive_unpressed,
|
.inactive.buffer = &theme->button_maximize_inactive_unpressed,
|
||||||
.inactive.rgba = theme->window_inactive_button_max_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_max_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "max_toggled",
|
.name = "max_toggled",
|
||||||
.fallback_button = { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f },
|
.fallback_button = (const char[]){ 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f },
|
||||||
.active.buffer = &theme->button_restore_active_unpressed,
|
.active.buffer = &theme->button_restore_active_unpressed,
|
||||||
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_restore_inactive_unpressed,
|
.inactive.buffer = &theme->button_restore_inactive_unpressed,
|
||||||
.inactive.rgba = theme->window_inactive_button_max_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_max_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "close",
|
.name = "close",
|
||||||
.fallback_button = { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 },
|
.fallback_button = (const char[]){ 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 },
|
||||||
.active.buffer = &theme->button_close_active_unpressed,
|
.active.buffer = &theme->button_close_active_unpressed,
|
||||||
.active.rgba = theme->window_active_button_close_unpressed_image_color,
|
.active.rgba = theme->window_active_button_close_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_close_inactive_unpressed,
|
.inactive.buffer = &theme->button_close_inactive_unpressed,
|
||||||
.inactive.rgba = theme->window_inactive_button_close_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_close_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "menu_hover",
|
.name = "menu_hover",
|
||||||
.fallback_button = { 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00 },
|
/* no fallback (non-hover variant is used instead) */
|
||||||
.active.buffer = &theme->button_menu_active_hover,
|
.active.buffer = &theme->button_menu_active_hover,
|
||||||
.active.rgba = theme->window_active_button_menu_unpressed_image_color,
|
.active.rgba = theme->window_active_button_menu_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_menu_inactive_hover,
|
.inactive.buffer = &theme->button_menu_inactive_hover,
|
||||||
.inactive.rgba = theme->window_inactive_button_menu_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_menu_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "iconify_hover",
|
.name = "iconify_hover",
|
||||||
.fallback_button = { 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f },
|
/* no fallback (non-hover variant is used instead) */
|
||||||
.active.buffer = &theme->button_iconify_active_hover,
|
.active.buffer = &theme->button_iconify_active_hover,
|
||||||
.active.rgba = theme->window_active_button_iconify_unpressed_image_color,
|
.active.rgba = theme->window_active_button_iconify_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_iconify_inactive_hover,
|
.inactive.buffer = &theme->button_iconify_inactive_hover,
|
||||||
.inactive.rgba = theme->window_inactive_button_iconify_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_iconify_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "max_hover",
|
.name = "max_hover",
|
||||||
.fallback_button = { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f },
|
/* no fallback (non-hover variant is used instead) */
|
||||||
.active.buffer = &theme->button_maximize_active_hover,
|
.active.buffer = &theme->button_maximize_active_hover,
|
||||||
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_maximize_inactive_hover,
|
.inactive.buffer = &theme->button_maximize_inactive_hover,
|
||||||
|
|
@ -148,14 +148,14 @@ load_buttons(struct theme *theme)
|
||||||
}, {
|
}, {
|
||||||
.name = "max_toggled_hover",
|
.name = "max_toggled_hover",
|
||||||
.alt_name = "max_hover_toggled",
|
.alt_name = "max_hover_toggled",
|
||||||
.fallback_button = { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f },
|
/* no fallback (non-hover variant is used instead) */
|
||||||
.active.buffer = &theme->button_restore_active_hover,
|
.active.buffer = &theme->button_restore_active_hover,
|
||||||
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
.active.rgba = theme->window_active_button_max_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_restore_inactive_hover,
|
.inactive.buffer = &theme->button_restore_inactive_hover,
|
||||||
.inactive.rgba = theme->window_inactive_button_max_unpressed_image_color,
|
.inactive.rgba = theme->window_inactive_button_max_unpressed_image_color,
|
||||||
}, {
|
}, {
|
||||||
.name = "close_hover",
|
.name = "close_hover",
|
||||||
.fallback_button = { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 },
|
/* no fallback (non-hover variant is used instead) */
|
||||||
.active.buffer = &theme->button_close_active_hover,
|
.active.buffer = &theme->button_close_active_hover,
|
||||||
.active.rgba = theme->window_active_button_close_unpressed_image_color,
|
.active.rgba = theme->window_active_button_close_unpressed_image_color,
|
||||||
.inactive.buffer = &theme->button_close_inactive_hover,
|
.inactive.buffer = &theme->button_close_inactive_hover,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue