rcxml.c: parse font name+size for ActiveWindow

For example:

    <theme>
      <font place="ActiveWindow">
        <name>sans</name>
        <size>8</size>
      </font>
    </theme>
This commit is contained in:
Johan Malm 2020-07-31 11:11:50 +01:00
parent 61843b120b
commit 82dc192217
2 changed files with 52 additions and 2 deletions

View file

@ -31,6 +31,8 @@ struct keybind *keybind_add(const char *keybind);
struct rcxml { struct rcxml {
bool client_side_decorations; bool client_side_decorations;
char *theme_name; char *theme_name;
char *font_name_activewindow;
int font_size_activewindow;
struct wl_list keybinds; struct wl_list keybinds;
}; };

View file

@ -19,6 +19,13 @@ static bool write_to_nodename_buffer = false;
static struct buf *nodename_buffer; static struct buf *nodename_buffer;
static struct keybind *current_keybind; static struct keybind *current_keybind;
enum font_place {
FONT_PLACE_UNKNOWN = 0,
FONT_PLACE_ACTIVEWINDOW,
FONT_PLACE_INACTIVEWINDOW,
/* TODO: Add all places based on Openbox's rc.xml */
};
static void rstrip(char *buf, const char *pattern) static void rstrip(char *buf, const char *pattern)
{ {
char *p = strstr(buf, pattern); char *p = strstr(buf, pattern);
@ -27,7 +34,7 @@ static void rstrip(char *buf, const char *pattern)
*p = '\0'; *p = '\0';
} }
static void fill_keybind(xmlNode *n, char *nodename, char *content) static void fill_keybind(char *nodename, char *content)
{ {
if (!content) if (!content)
return; return;
@ -58,11 +65,42 @@ static bool get_bool(const char *s)
return false; return false;
} }
static void fill_font(char *nodename, char *content, enum font_place place)
{
if (!content)
return;
rstrip(nodename, ".font.theme");
/* TODO: implement for all font places */
if (place != FONT_PLACE_ACTIVEWINDOW)
return;
if (!strcmp(nodename, "name"))
rc.font_name_activewindow = strdup(content);
else if (!strcmp(nodename, "size"))
rc.font_size_activewindow = atoi(content);
}
static enum font_place enum_font_place(const char *place)
{
if (!place)
return FONT_PLACE_UNKNOWN;
if (!strcasecmp(place, "ActiveWindow"))
return FONT_PLACE_ACTIVEWINDOW;
else if (!strcasecmp(place, "InactiveWindow"))
return FONT_PLACE_INACTIVEWINDOW;
return FONT_PLACE_UNKNOWN;
}
static void entry(xmlNode *node, char *nodename, char *content) static void entry(xmlNode *node, char *nodename, char *content)
{ {
/* current <theme><font place=""></theme> */
static enum font_place font_place = FONT_PLACE_UNKNOWN;
if (!nodename) if (!nodename)
return; return;
rstrip(nodename, ".openbox_config"); rstrip(nodename, ".openbox_config");
/* for debugging */
if (write_to_nodename_buffer) { if (write_to_nodename_buffer) {
if (is_attribute) if (is_attribute)
buf_add(nodename_buffer, "@"); buf_add(nodename_buffer, "@");
@ -73,16 +111,25 @@ static void entry(xmlNode *node, char *nodename, char *content)
} }
buf_add(nodename_buffer, "\n"); buf_add(nodename_buffer, "\n");
} }
if (!content) if (!content)
return; return;
if (in_keybind) if (in_keybind)
fill_keybind(node, nodename, content); fill_keybind(nodename, content);
if (is_attribute && !strcmp(nodename, "place.font.theme"))
font_place = enum_font_place(content);
if (!strcmp(nodename, "csd.lab")) if (!strcmp(nodename, "csd.lab"))
rc.client_side_decorations = get_bool(content); rc.client_side_decorations = get_bool(content);
else if (!strcmp(nodename, "layout.keyboard.lab")) else if (!strcmp(nodename, "layout.keyboard.lab"))
setenv("XKB_DEFAULT_LAYOUT", content, 1); setenv("XKB_DEFAULT_LAYOUT", content, 1);
else if (!strcmp(nodename, "name.theme")) else if (!strcmp(nodename, "name.theme"))
rc.theme_name = strdup(content); rc.theme_name = strdup(content);
else if (!strcmp(nodename, "name.font.theme"))
fill_font(nodename, content, font_place);
else if (!strcmp(nodename, "size.font.theme"))
fill_font(nodename, content, font_place);
} }
static char *nodename(xmlNode *node, char *buf, int len) static char *nodename(xmlNode *node, char *buf, int len)
@ -191,6 +238,7 @@ static void post_processing(void)
bind("A-Tab", "NextWindow"); bind("A-Tab", "NextWindow");
bind("A-F3", "Execute"); bind("A-F3", "Execute");
} }
/* TODO: Set all char* variables if NULL */
} }
static void rcxml_path(char *buf, size_t len, const char *filename) static void rcxml_path(char *buf, size_t len, const char *filename)