mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -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