From 17b2d57717504e2018d3ba23e0deffe55fc6d084 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 4 Mar 2007 07:18:04 +0000 Subject: [PATCH] Fonts are now going to be configured in the rc.xml file. The format is such as ... arial,sans 8 bold italic yes 1 64 Valid place="" are ActiveWindow, InactiveWindow, MenuTitle, and MenuItem. Only valid weight is "bold" Valid slants are "italic" and "oblique" shadowTint is a value between -100 and 100 size is the font size in points. pixelsize could possibly be added in the form of 8px, but it's not right now. the name can contain multiple families and they will all be used to match characters You can omit any fields and get the default for it. You can omit naming a font for a place="" and get the default font for it. This is completely replacing theme-specified fonts, for better or for worse. Font shadowing may go back into the theme at some point, instead of in the rc.xml. --- openbox/config.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++- openbox/config.h | 10 ++++++ openbox/openbox.c | 7 ++++- 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/openbox/config.c b/openbox/config.c index 9cf07a37..66c836ea 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -42,9 +42,14 @@ gboolean config_theme_hidedisabled; gchar *config_title_layout; gboolean config_title_number; +RrFont *config_font_activewindow; +RrFont *config_font_inactivewindow; +RrFont *config_font_menuitem; +RrFont *config_font_menutitle; + gint config_desktops_num; GSList *config_desktops_names; -guint config_screen_firstdesk; +guint config_screen_firstdesk; gboolean config_resize_redraw; gboolean config_resize_four_corners; @@ -438,6 +443,68 @@ static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, config_theme_keepborder = parse_bool(doc, n); if ((n = parse_find_node("hideDisabled", node))) config_theme_hidedisabled = parse_bool(doc, n); + + n = parse_find_node("font", node); + while (n) { + xmlNodePtr fnode; + RrFont **font; + gchar *name = g_strdup(RrDefaultFontFamily); + gint size = RrDefaultFontSize; + RrFontWeight weight = RrDefaultFontWeight; + RrFontSlant slant = RrDefaultFontSlant; + gboolean shadow = RrDefaultFontShadow; + gint offset = RrDefaultFontShadowOffset; + gchar tint = RrDefaultFontShadowTint; + + if (parse_attr_contains("ActiveWindow", n, "place")) + font = &config_font_activewindow; + else if (parse_attr_contains("InactiveWindow", n, "place")) + font = &config_font_inactivewindow; + else if (parse_attr_contains("MenuTitle", n, "place")) + font = &config_font_menutitle; + else if (parse_attr_contains("MenuItem", n, "place")) + font = &config_font_menuitem; + else + goto next_font; + + if ((fnode = parse_find_node("name", n->children))) { + g_free(name); + name = parse_string(doc, fnode); + } + if ((fnode = parse_find_node("size", n->children))) { + int s = parse_int(doc, fnode); + if (s > 0) size = s; + } + if ((fnode = parse_find_node("weight", n->children))) { + gchar *w = parse_string(doc, fnode); + if (!g_ascii_strcasecmp(w, "Bold")) + weight = RR_FONTWEIGHT_BOLD; + g_free(w); + } + if ((fnode = parse_find_node("slant", n->children))) { + gchar *s = parse_string(doc, fnode); + if (!g_ascii_strcasecmp(s, "Italic")) + slant = RR_FONTSLANT_ITALIC; + if (!g_ascii_strcasecmp(s, "Oblique")) + slant = RR_FONTSLANT_OBLIQUE; + g_free(s); + } + if ((fnode = parse_find_node("shadow", n->children))) + shadow = parse_bool(doc, fnode); + if ((fnode = parse_find_node("shadowoffset", n->children))) + offset = parse_int(doc, fnode); + if ((fnode = parse_find_node("shadowtint", n->children))) { + tint = parse_int(doc, fnode); + if (tint > 100) tint = 100; + else if (tint < -100) tint = -100; + } + + *font = RrFontOpen(ob_rr_inst, name, size, weight, slant, + shadow, offset, tint); + g_free(name); + next_font: + n = parse_find_node("font", n->next); + } } static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, @@ -747,6 +814,11 @@ void config_startup(ObParseInst *i) config_theme_keepborder = TRUE; config_theme_hidedisabled = FALSE; + config_font_activewindow = NULL; + config_font_inactivewindow = NULL; + config_font_menuitem = NULL; + config_font_menutitle = NULL; + parse_register(i, "theme", parse_theme, NULL); config_desktops_num = 4; @@ -820,6 +892,11 @@ void config_shutdown() g_free(config_title_layout); + RrFontClose(config_font_activewindow); + RrFontClose(config_font_inactivewindow); + RrFontClose(config_font_menuitem); + RrFontClose(config_font_menutitle); + for (it = config_desktops_names; it; it = g_slist_next(it)) g_free(it->data); g_slist_free(config_desktops_names); diff --git a/openbox/config.h b/openbox/config.h index fc300d6c..96cd782c 100644 --- a/openbox/config.h +++ b/openbox/config.h @@ -23,6 +23,7 @@ #include "misc.h" #include "stacking.h" #include "place.h" +#include "render/render.h" #include @@ -93,6 +94,15 @@ extern gchar *config_title_layout; /*! Append a unique number to windows with same titles */ extern gboolean config_title_number; +/*! The font for the active window's title */ +extern RrFont *config_font_activewindow; +/*! The font for inactive windows' titles */ +extern RrFont *config_font_inactivewindow; +/*! The font for menu titles */ +extern RrFont *config_font_menutitle; +/*! The font for menu items */ +extern RrFont *config_font_menuitem; + /*! The number of desktops */ extern gint config_desktops_num; /*! Desktop to start on, put 5 to start in the center of a 3x3 grid */ diff --git a/openbox/openbox.c b/openbox/openbox.c index 087efd6b..e3309f00 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -244,7 +244,12 @@ gint main(gint argc, gchar **argv) /* load the theme specified in the rc file */ { RrTheme *theme; - if ((theme = RrThemeNew(ob_rr_inst, config_theme))) { + if ((theme = RrThemeNew(ob_rr_inst, config_theme, + config_font_activewindow, + config_font_inactivewindow, + config_font_menutitle, + config_font_menuitem))) + { RrThemeFree(ob_rr_theme); ob_rr_theme = theme; } -- 2.39.2