]> Dogcows Code - chaz/openbox/commitdiff
Fonts are now going to be configured in the rc.xml file. The format is such as
authorDana Jansens <danakj@orodu.net>
Sun, 4 Mar 2007 07:18:04 +0000 (07:18 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 4 Mar 2007 07:18:04 +0000 (07:18 +0000)
<theme>
...
  <font place="ActiveWindow">
    <name>arial,sans</name>
    <size>8</size>
    <weight>bold</weight>
    <slant>italic</slant>
    <shadow>yes</shadow>
    <shadowOffset>1</shadowOffset>
    <shadowTint>64</shadowTint>
  </font>
</theme>

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
openbox/config.h
openbox/openbox.c

index 9cf07a37ac12b0b1af9e6146d89280ed30903c41..66c836ea16d0238e0178e47a68bc1c9f7e44442e 100644 (file)
@@ -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);
index fc300d6c6b5d620bf8667f6a410a36ccefc6a8f8..96cd782c90b14d3418ea7541eb32b341a1c5194f 100644 (file)
@@ -23,6 +23,7 @@
 #include "misc.h"
 #include "stacking.h"
 #include "place.h"
+#include "render/render.h"
 
 #include <glib.h>
 
@@ -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 */
index 087efd6be943f672b7e7141925670d46ef7523f0..e3309f005b2b022dfd9c81162b769de37a8a84c1 100644 (file)
@@ -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;
                 }
This page took 0.030264 seconds and 4 git commands to generate.