mirror of
https://github.com/labwc/labwc.git
synced 2025-11-02 09:01:47 -05:00
Un-global theme variable
This commit is contained in:
parent
9af7bd744f
commit
1b263e1f67
10 changed files with 64 additions and 57 deletions
|
|
@ -117,6 +117,7 @@ struct server {
|
||||||
/* Set when in cycle (alt-tab) mode */
|
/* Set when in cycle (alt-tab) mode */
|
||||||
struct view *cycle_view;
|
struct view *cycle_view;
|
||||||
|
|
||||||
|
struct theme *theme;
|
||||||
struct menu *rootmenu;
|
struct menu *rootmenu;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,6 @@ struct theme {
|
||||||
struct wlr_texture *xbm_iconify_inactive_unpressed;
|
struct wlr_texture *xbm_iconify_inactive_unpressed;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct theme theme;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* parse_hexstr - parse #rrggbb
|
* parse_hexstr - parse #rrggbb
|
||||||
* @hex: hex string to be parsed
|
* @hex: hex string to be parsed
|
||||||
|
|
@ -43,17 +41,20 @@ extern struct theme theme;
|
||||||
void parse_hexstr(const char *hex, float *rgba);
|
void parse_hexstr(const char *hex, float *rgba);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* theme_init - read theme incl. buttons into global theme struct
|
* theme_init - read openbox theme and generate button textures
|
||||||
|
* @theme: global theme struct
|
||||||
|
* @renderer: wlr_renderer for creating button textures
|
||||||
* @theme_name: theme-name in <theme-dir>/<theme-name>/openbox-3/themerc
|
* @theme_name: theme-name in <theme-dir>/<theme-name>/openbox-3/themerc
|
||||||
* Note <theme-dir> is obtained in theme-dir.c
|
* Note <theme-dir> is obtained in theme-dir.c
|
||||||
*/
|
*/
|
||||||
void theme_init(struct wlr_renderer *renderer, const char *theme_name);
|
void theme_init(struct theme *theme, struct wlr_renderer *renderer,
|
||||||
|
const char *theme_name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* theme_builin - apply built-in theme similar to Clearlooks
|
* theme_builin - apply built-in theme similar to Clearlooks
|
||||||
* Note: Only used if no theme can be found. Default values for individual
|
* Note: Only used if no theme can be found. Default values for individual
|
||||||
* theme options are as per openbox spec and are typically black/white.
|
* theme options are as per openbox spec and are typically black/white.
|
||||||
*/
|
*/
|
||||||
void theme_builtin(void);
|
void theme_builtin(struct theme *theme);
|
||||||
|
|
||||||
#endif /* __LABWC_THEME_H */
|
#endif /* __LABWC_THEME_H */
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,6 @@
|
||||||
/**
|
/**
|
||||||
* xbm_load - load theme xbm files into global theme struct
|
* xbm_load - load theme xbm files into global theme struct
|
||||||
*/
|
*/
|
||||||
void xbm_load(struct wlr_renderer *renderer);
|
void xbm_load(struct theme *theme, struct wlr_renderer *renderer);
|
||||||
|
|
||||||
#endif /* __LABWC_XBM_H */
|
#endif /* __LABWC_XBM_H */
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,8 @@ main(int argc, char *argv[])
|
||||||
server_init(&server);
|
server_init(&server);
|
||||||
server_start(&server);
|
server_start(&server);
|
||||||
|
|
||||||
theme_init(server.renderer, rc.theme_name);
|
theme_init(&theme, server.renderer, rc.theme_name);
|
||||||
|
server.theme = &theme;
|
||||||
|
|
||||||
struct menu rootmenu = { 0 };
|
struct menu rootmenu = { 0 };
|
||||||
menu_init_rootmenu(&server, &rootmenu);
|
menu_init_rootmenu(&server, &rootmenu);
|
||||||
|
|
|
||||||
|
|
@ -76,13 +76,14 @@ menuitem_create(struct server *server, struct menu *menu, const char *text)
|
||||||
if (!menuitem) {
|
if (!menuitem) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
struct theme *theme = server->theme;
|
||||||
menuitem->geo_box.width = MENUWIDTH;
|
menuitem->geo_box.width = MENUWIDTH;
|
||||||
menuitem->geo_box.height = MENUHEIGHT;
|
menuitem->geo_box.height = MENUHEIGHT;
|
||||||
menuitem->active_texture = texture_create(server, &menuitem->geo_box,
|
menuitem->active_texture = texture_create(server, &menuitem->geo_box,
|
||||||
text, theme.menu_items_active_bg_color,
|
text, theme->menu_items_active_bg_color,
|
||||||
theme.menu_items_active_text_color);
|
theme->menu_items_active_text_color);
|
||||||
menuitem->inactive_texture = texture_create(server, &menuitem->geo_box,
|
menuitem->inactive_texture = texture_create(server, &menuitem->geo_box,
|
||||||
text, theme.menu_items_bg_color, theme.menu_items_text_color);
|
text, theme->menu_items_bg_color, theme->menu_items_text_color);
|
||||||
wl_list_insert(&menu->menuitems, &menuitem->link);
|
wl_list_insert(&menu->menuitems, &menuitem->link);
|
||||||
return menuitem;
|
return menuitem;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
20
src/output.c
20
src/output.c
|
|
@ -443,8 +443,10 @@ render_deco(struct view *view, struct output *output,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct theme *theme = view->server->theme;
|
||||||
|
|
||||||
/* render border */
|
/* render border */
|
||||||
float *color = theme.window_active_handle_bg_color;
|
float *color = theme->window_active_handle_bg_color;
|
||||||
enum deco_part border[4] = {
|
enum deco_part border[4] = {
|
||||||
LAB_DECO_PART_TOP,
|
LAB_DECO_PART_TOP,
|
||||||
LAB_DECO_PART_RIGHT,
|
LAB_DECO_PART_RIGHT,
|
||||||
|
|
@ -459,9 +461,9 @@ render_deco(struct view *view, struct output *output,
|
||||||
/* render title */
|
/* render title */
|
||||||
struct wlr_seat *seat = view->server->seat.seat;
|
struct wlr_seat *seat = view->server->seat.seat;
|
||||||
if (view->surface == seat->keyboard_state.focused_surface) {
|
if (view->surface == seat->keyboard_state.focused_surface) {
|
||||||
color = theme.window_active_title_bg_color;
|
color = theme->window_active_title_bg_color;
|
||||||
} else {
|
} else {
|
||||||
color = theme.window_inactive_title_bg_color;
|
color = theme->window_inactive_title_bg_color;
|
||||||
}
|
}
|
||||||
struct wlr_box box = deco_box(view, LAB_DECO_PART_TITLE);
|
struct wlr_box box = deco_box(view, LAB_DECO_PART_TITLE);
|
||||||
render_rect(output, output_damage, &box, color);
|
render_rect(output, output_damage, &box, color);
|
||||||
|
|
@ -480,23 +482,23 @@ render_deco(struct view *view, struct output *output,
|
||||||
if (view->surface == seat->keyboard_state.focused_surface) {
|
if (view->surface == seat->keyboard_state.focused_surface) {
|
||||||
box = deco_box(view, LAB_DECO_BUTTON_CLOSE);
|
box = deco_box(view, LAB_DECO_BUTTON_CLOSE);
|
||||||
render_icon(output, output_damage, &box,
|
render_icon(output, output_damage, &box,
|
||||||
theme.xbm_close_active_unpressed);
|
theme->xbm_close_active_unpressed);
|
||||||
box = deco_box(view, LAB_DECO_BUTTON_MAXIMIZE);
|
box = deco_box(view, LAB_DECO_BUTTON_MAXIMIZE);
|
||||||
render_icon(output, output_damage, &box,
|
render_icon(output, output_damage, &box,
|
||||||
theme.xbm_maximize_active_unpressed);
|
theme->xbm_maximize_active_unpressed);
|
||||||
box = deco_box(view, LAB_DECO_BUTTON_ICONIFY);
|
box = deco_box(view, LAB_DECO_BUTTON_ICONIFY);
|
||||||
render_icon(output, output_damage, &box,
|
render_icon(output, output_damage, &box,
|
||||||
theme.xbm_iconify_active_unpressed);
|
theme->xbm_iconify_active_unpressed);
|
||||||
} else {
|
} else {
|
||||||
box = deco_box(view, LAB_DECO_BUTTON_CLOSE);
|
box = deco_box(view, LAB_DECO_BUTTON_CLOSE);
|
||||||
render_icon(output, output_damage, &box,
|
render_icon(output, output_damage, &box,
|
||||||
theme.xbm_close_inactive_unpressed);
|
theme->xbm_close_inactive_unpressed);
|
||||||
box = deco_box(view, LAB_DECO_BUTTON_MAXIMIZE);
|
box = deco_box(view, LAB_DECO_BUTTON_MAXIMIZE);
|
||||||
render_icon(output, output_damage, &box,
|
render_icon(output, output_damage, &box,
|
||||||
theme.xbm_maximize_inactive_unpressed);
|
theme->xbm_maximize_inactive_unpressed);
|
||||||
box = deco_box(view, LAB_DECO_BUTTON_ICONIFY);
|
box = deco_box(view, LAB_DECO_BUTTON_ICONIFY);
|
||||||
render_icon(output, output_damage, &box,
|
render_icon(output, output_damage, &box,
|
||||||
theme.xbm_iconify_inactive_unpressed);
|
theme->xbm_iconify_inactive_unpressed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ reload_config_and_theme(void)
|
||||||
/* TODO: use rc.config_path */
|
/* TODO: use rc.config_path */
|
||||||
rcxml_finish();
|
rcxml_finish();
|
||||||
rcxml_read(NULL);
|
rcxml_read(NULL);
|
||||||
theme_init(g_server->renderer, rc.theme_name);
|
theme_init(g_server->theme, g_server->renderer, rc.theme_name);
|
||||||
menu_reconfigure(g_server, g_server->rootmenu);
|
menu_reconfigure(g_server, g_server->rootmenu);
|
||||||
damage_all_outputs(g_server);
|
damage_all_outputs(g_server);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,15 @@
|
||||||
|
|
||||||
#include "theme/theme.h"
|
#include "theme/theme.h"
|
||||||
|
|
||||||
void theme_builtin(void)
|
void theme_builtin(struct theme *theme)
|
||||||
{
|
{
|
||||||
parse_hexstr("#589bda", theme.window_active_title_bg_color);
|
parse_hexstr("#589bda", theme->window_active_title_bg_color);
|
||||||
parse_hexstr("#3c7cb7", theme.window_active_handle_bg_color);
|
parse_hexstr("#3c7cb7", theme->window_active_handle_bg_color);
|
||||||
parse_hexstr("#efece6", theme.window_inactive_title_bg_color);
|
parse_hexstr("#efece6", theme->window_inactive_title_bg_color);
|
||||||
parse_hexstr("#ffffff", theme.window_active_button_unpressed_image_color);
|
parse_hexstr("#ffffff", theme->window_active_button_unpressed_image_color);
|
||||||
parse_hexstr("#000000", theme.window_inactive_button_unpressed_image_color);
|
parse_hexstr("#000000", theme->window_inactive_button_unpressed_image_color);
|
||||||
parse_hexstr("#fcfbfa", theme.menu_items_bg_color);
|
parse_hexstr("#fcfbfa", theme->menu_items_bg_color);
|
||||||
parse_hexstr("#000000", theme.menu_items_text_color);
|
parse_hexstr("#000000", theme->menu_items_text_color);
|
||||||
parse_hexstr("#4a90d9", theme.menu_items_active_bg_color);
|
parse_hexstr("#4a90d9", theme->menu_items_active_bg_color);
|
||||||
parse_hexstr("#ffffff", theme.menu_items_active_text_color);
|
parse_hexstr("#ffffff", theme->menu_items_active_text_color);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,29 +49,29 @@ match(const gchar *pattern, const gchar *string)
|
||||||
return (bool)g_pattern_match_simple(pattern, string);
|
return (bool)g_pattern_match_simple(pattern, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void entry(const char *key, const char *value)
|
static void entry(struct theme *theme, const char *key, const char *value)
|
||||||
{
|
{
|
||||||
if (!key || !value) {
|
if (!key || !value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (match(key, "window.active.title.bg.color")) {
|
if (match(key, "window.active.title.bg.color")) {
|
||||||
parse_hexstr(value, theme.window_active_title_bg_color);
|
parse_hexstr(value, theme->window_active_title_bg_color);
|
||||||
} else if (match(key, "window.active.handle.bg.color")) {
|
} else if (match(key, "window.active.handle.bg.color")) {
|
||||||
parse_hexstr(value, theme.window_active_handle_bg_color);
|
parse_hexstr(value, theme->window_active_handle_bg_color);
|
||||||
} else if (match(key, "window.inactive.title.bg.color")) {
|
} else if (match(key, "window.inactive.title.bg.color")) {
|
||||||
parse_hexstr(value, theme.window_inactive_title_bg_color);
|
parse_hexstr(value, theme->window_inactive_title_bg_color);
|
||||||
} else if (match(key, "window.active.button.unpressed.image.color")) {
|
} else if (match(key, "window.active.button.unpressed.image.color")) {
|
||||||
parse_hexstr(value, theme.window_active_button_unpressed_image_color);
|
parse_hexstr(value, theme->window_active_button_unpressed_image_color);
|
||||||
} else if (match(key, "window.inactive.button.unpressed.image.color")) {
|
} else if (match(key, "window.inactive.button.unpressed.image.color")) {
|
||||||
parse_hexstr(value, theme.window_inactive_button_unpressed_image_color);
|
parse_hexstr(value, theme->window_inactive_button_unpressed_image_color);
|
||||||
} else if (match(key, "menu.items.bg.color")) {
|
} else if (match(key, "menu.items.bg.color")) {
|
||||||
parse_hexstr(value, theme.menu_items_bg_color);
|
parse_hexstr(value, theme->menu_items_bg_color);
|
||||||
} else if (match(key, "menu.items.text.color")) {
|
} else if (match(key, "menu.items.text.color")) {
|
||||||
parse_hexstr(value, theme.menu_items_text_color);
|
parse_hexstr(value, theme->menu_items_text_color);
|
||||||
} else if (match(key, "menu.items.active.bg.color")) {
|
} else if (match(key, "menu.items.active.bg.color")) {
|
||||||
parse_hexstr(value, theme.menu_items_active_bg_color);
|
parse_hexstr(value, theme->menu_items_active_bg_color);
|
||||||
} else if (match(key, "menu.items.active.text.color")) {
|
} else if (match(key, "menu.items.active.text.color")) {
|
||||||
parse_hexstr(value, theme.menu_items_active_text_color);
|
parse_hexstr(value, theme->menu_items_active_text_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,18 +88,18 @@ parse_config_line(char *line, char **key, char **value)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_line(char *line)
|
process_line(struct theme *theme, char *line)
|
||||||
{
|
{
|
||||||
if (line[0] == '\0' || line[0] == '#') {
|
if (line[0] == '\0' || line[0] == '#') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char *key = NULL, *value = NULL;
|
char *key = NULL, *value = NULL;
|
||||||
parse_config_line(line, &key, &value);
|
parse_config_line(line, &key, &value);
|
||||||
entry(key, value);
|
entry(theme, key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
theme_read(const char *theme_name)
|
theme_read(struct theme *theme, const char *theme_name)
|
||||||
{
|
{
|
||||||
FILE *stream = NULL;
|
FILE *stream = NULL;
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
|
|
@ -113,7 +113,7 @@ theme_read(const char *theme_name)
|
||||||
}
|
}
|
||||||
if (!stream) {
|
if (!stream) {
|
||||||
info("cannot find theme (%s), using built-in", theme_name);
|
info("cannot find theme (%s), using built-in", theme_name);
|
||||||
theme_builtin();
|
theme_builtin(theme);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
info("read themerc (%s)", themerc);
|
info("read themerc (%s)", themerc);
|
||||||
|
|
@ -122,15 +122,16 @@ theme_read(const char *theme_name)
|
||||||
if (p) {
|
if (p) {
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
}
|
}
|
||||||
process_line(line);
|
process_line(theme, line);
|
||||||
}
|
}
|
||||||
free(line);
|
free(line);
|
||||||
fclose(stream);
|
fclose(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
theme_init(struct wlr_renderer *renderer, const char *theme_name)
|
theme_init(struct theme *theme, struct wlr_renderer *renderer,
|
||||||
|
const char *theme_name)
|
||||||
{
|
{
|
||||||
theme_read(theme_name);
|
theme_read(theme, theme_name);
|
||||||
xbm_load(renderer);
|
xbm_load(theme, renderer);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,21 +78,21 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xbm_load(struct wlr_renderer *r)
|
xbm_load(struct theme *theme, struct wlr_renderer *r)
|
||||||
{
|
{
|
||||||
parse_set_color(theme.window_active_button_unpressed_image_color);
|
parse_set_color(theme->window_active_button_unpressed_image_color);
|
||||||
load_button(r, "close.xbm", &theme.xbm_close_active_unpressed,
|
load_button(r, "close.xbm", &theme->xbm_close_active_unpressed,
|
||||||
close_button_normal);
|
close_button_normal);
|
||||||
load_button(r, "max.xbm", &theme.xbm_maximize_active_unpressed,
|
load_button(r, "max.xbm", &theme->xbm_maximize_active_unpressed,
|
||||||
max_button_normal);
|
max_button_normal);
|
||||||
load_button(r, "iconify.xbm", &theme.xbm_iconify_active_unpressed,
|
load_button(r, "iconify.xbm", &theme->xbm_iconify_active_unpressed,
|
||||||
iconify_button_normal);
|
iconify_button_normal);
|
||||||
|
|
||||||
parse_set_color(theme.window_inactive_button_unpressed_image_color);
|
parse_set_color(theme->window_inactive_button_unpressed_image_color);
|
||||||
load_button(r, "close.xbm", &theme.xbm_close_inactive_unpressed,
|
load_button(r, "close.xbm", &theme->xbm_close_inactive_unpressed,
|
||||||
close_button_normal);
|
close_button_normal);
|
||||||
load_button(r, "max.xbm", &theme.xbm_maximize_inactive_unpressed,
|
load_button(r, "max.xbm", &theme->xbm_maximize_inactive_unpressed,
|
||||||
max_button_normal);
|
max_button_normal);
|
||||||
load_button(r, "iconify.xbm", &theme.xbm_iconify_inactive_unpressed,
|
load_button(r, "iconify.xbm", &theme->xbm_iconify_inactive_unpressed,
|
||||||
iconify_button_normal);
|
iconify_button_normal);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue