]> Dogcows Code - chaz/openbox/blobdiff - openbox/config.c
animate iconify/reestore. yeah.
[chaz/openbox] / openbox / config.c
index dd8d2b830b9314d6f570c20a0b8353117e45cd35..367fb2f9e9b3e335d0ae23ed87beb99fa40fb86a 100644 (file)
@@ -1,8 +1,8 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 
    config.c for the Openbox window manager
-   Copyright (c) 2004        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2006        Mikael Magnusson
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #include "mouse.h"
 #include "prop.h"
 #include "translate.h"
+#include "client.h"
+#include "screen.h"
 #include "parser/parse.h"
 #include "openbox.h"
+#include "gettext.h"
 
 gboolean config_focus_new;
 gboolean config_focus_follow;
@@ -37,11 +40,19 @@ gchar   *config_theme;
 gboolean config_theme_keepborder;
 gboolean config_theme_hidedisabled;
 
-gchar *config_title_layout;
+gchar   *config_title_layout;
+
+gboolean config_animate_iconify;
+
+RrFont *config_font_activewindow;
+RrFont *config_font_inactivewindow;
+RrFont *config_font_menuitem;
+RrFont *config_font_menutitle;
+RrFont *config_font_osd;
 
 gint    config_desktops_num;
 GSList *config_desktops_names;
-gint    config_screen_firstdesk;
+guint   config_screen_firstdesk;
 
 gboolean config_resize_redraw;
 gboolean config_resize_four_corners;
@@ -68,16 +79,15 @@ gint config_mouse_threshold;
 gint config_mouse_dclicktime;
 
 gboolean config_menu_warppointer;
-gboolean config_menu_xorstyle;
 guint    config_menu_hide_delay;
+gboolean config_menu_middle;
 guint    config_submenu_show_delay;
 gboolean config_menu_client_list_icons;
 
 GSList *config_menu_files;
 
-gint config_resist_win;
-gint config_resist_edge;
-
+gint     config_resist_win;
+gint     config_resist_edge;
 gboolean config_resist_layers_below;
 
 GSList *config_per_app_settings;
@@ -102,8 +112,6 @@ GSList *config_per_app_settings;
    Some notes: head is the screen number in a multi monitor
    (Xinerama) setup (starting from 0) or mouse, meaning the
    head the pointer is on. Default: mouse.
-   If decor is false and shade is true, the decor will be
-   set to true (otherwise we will have an invisible window).
    Layer can be three values, above (Always on top), below
    (Always on bottom) and everything else (normal behaviour).
    Positions can be an integer value or center, which will
@@ -115,19 +123,37 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
                                    xmlNodePtr node, gpointer d)
 {
     xmlNodePtr app = parse_find_node("application", node->children);
-    gchar *name;
+    gchar *name, *class;
+    gboolean name_set, class_set;
+    gboolean x_pos_given;
 
     while (app) {
-        gboolean x_pos_given = FALSE;
-        if (parse_attr_string("name", app, &name)) {
+        name_set = class_set = x_pos_given = FALSE;
+
+        class_set = parse_attr_string("class", app, &class);
+        name_set = parse_attr_string("name", app, &name);
+        if (class_set || name_set) {
             xmlNodePtr n, c;
-            ObAppSettings *settings = g_new0(ObAppSetting, 1);
-            settings->name = name;
+            ObAppSettings *settings = g_new0(ObAppSettings, 1);
+            
+            if (name_set)
+                settings->name = name;
+            else
+                settings->name = NULL;
+
+            if (class_set)
+                settings->class = class;
+            else
+                settings->class = NULL;
+
+            if (!parse_attr_string("role", app, &settings->role))
+                settings->role = NULL;
 
-            settings->decor = TRUE;
+            settings->decor = -1;
             if ((n = parse_find_node("decor", app->children)))
                 settings->decor = parse_bool(doc, n);
 
+            settings->shade = -1;
             if ((n = parse_find_node("shade", app->children)))
                 settings->shade = parse_bool(doc, n);
 
@@ -135,52 +161,101 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
             settings->pos_given = FALSE;
             if ((n = parse_find_node("position", app->children))) {
                 if ((c = parse_find_node("x", n->children))) {
-                    if (!strcmp(parse_string(doc, c), "center")) {
+                    gchar *s = parse_string(doc, c);
+                    if (!strcmp(s, "center")) {
                         settings->center_x = TRUE;
                         x_pos_given = TRUE;
                     } else {
                         settings->position.x = parse_int(doc, c);
                         x_pos_given = TRUE;
                     }
+                    g_free(s);
                 }
 
                 if (x_pos_given && (c = parse_find_node("y", n->children))) {
-                    if (!strcmp(parse_string(doc, c), "center")) {
+                    gchar *s = parse_string(doc, c);
+                    if (!strcmp(s, "center")) {
                         settings->center_y = TRUE;
-                        settings->pos_given;
+                        settings->pos_given = TRUE;
                     } else {
                         settings->position.y = parse_int(doc, c);
-                        settings->pos_given;
+                        settings->pos_given = TRUE;
                     }
+                    g_free(s);
                 }
             }
 
+            settings->focus = -1;
             if ((n = parse_find_node("focus", app->children)))
                 settings->focus = parse_bool(doc, n);
 
-            if ((n = parse_find_node("desktop", app->children)))
-                settings->desktop = parse_int(doc, n);
-            else
-                settings->desktop = -1;
+            if ((n = parse_find_node("desktop", app->children))) {
+                gchar *s = parse_string(doc, n);
+                if (!strcmp(s, "all"))
+                    settings->desktop = DESKTOP_ALL;
+                else
+                    settings->desktop = parse_int(doc, n);
+                g_free(s);
+            } else
+                settings->desktop = DESKTOP_ALL - 1; /* lets hope the user
+                                                      * doesn't have 2^32
+                                                      * desktops */
 
             if ((n = parse_find_node("head", app->children))) {
-                if (!strcmp(parse_string(doc, n), "mouse"))
+                gchar *s = parse_string(doc, n);
+                if (!strcmp(s, "mouse"))
                     settings->head = -1;
                 else
                     settings->head = parse_int(doc, n);
+                g_free(s);
             }
 
+            settings->layer = -2;
             if ((n = parse_find_node("layer", app->children))) {
-                if (!strcmp(parse_string(doc, n), "above"))
+                gchar *s = parse_string(doc, n);
+                if (!strcmp(s, "above"))
                     settings->layer = 1;
-                else if (!strcmp(parse_string(doc, n), "below"))
+                else if (!strcmp(s, "below"))
                     settings->layer = -1;
                 else
                     settings->layer = 0;
+                g_free(s);
+            }
+
+            settings->iconic = -1;
+            if ((n = parse_find_node("iconic", app->children)))
+                settings->iconic = parse_bool(doc, n);
+
+            settings->skip_pager = -1;
+            if ((n = parse_find_node("skip_pager", app->children)))
+                settings->skip_pager = parse_bool(doc, n);
+
+            settings->skip_taskbar = -1;
+            if ((n = parse_find_node("skip_taskbar", app->children)))
+                settings->skip_taskbar = parse_bool(doc, n);
+
+            settings->fullscreen = -1;
+            if ((n = parse_find_node("fullscreen", app->children)))
+                settings->fullscreen = parse_bool(doc, n);
+
+            settings->max_horz = -1;
+            settings->max_vert = -1;
+            if ((n = parse_find_node("maximized", app->children))) {
+                gchar *s = parse_string(doc, n);
+                if (!strcmp(s, "horizontal")) {
+                    settings->max_horz = TRUE;
+                    settings->max_vert = FALSE;
+                } else if (!strcmp(s, "vertical")) {
+                    settings->max_horz = FALSE;
+                    settings->max_vert = TRUE;
+                } else
+                    settings->max_horz = settings->max_vert =
+                        parse_bool(doc, n);
+                g_free(s);
             }
 
             config_per_app_settings = g_slist_append(config_per_app_settings,
-                                              (gpointer) setting);
+                                              (gpointer) settings);
         }
         
         app = parse_find_node("application", app->next);
@@ -201,47 +276,60 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                       GList *keylist)
 {
     gchar *key;
-    ObAction *action;
-    xmlNodePtr n, nact;
-    GList *it;
+    xmlNodePtr n;
+    gboolean is_chroot = FALSE;
 
-    if ((n = parse_find_node("chainQuitKey", node))) {
-        key = parse_string(doc, n);
-        translate_key(key, &config_keyboard_reset_state,
-                      &config_keyboard_reset_keycode);
-        g_free(key);
-    }
+    if (!parse_attr_string("key", node, &key))
+        return;
 
-    n = parse_find_node("keybind", node);
-    while (n) {
-        if (parse_attr_string("key", n, &key)) {
-            keylist = g_list_append(keylist, key);
+    parse_attr_bool("chroot", node, &is_chroot);
 
-            parse_key(i, doc, n->children, keylist);
+    keylist = g_list_append(keylist, key);
 
-            it = g_list_last(keylist);
-            g_free(it->data);
-            keylist = g_list_delete_link(keylist, it);
+    if ((n = parse_find_node("keybind", node->children))) {
+        while (n) {
+            parse_key(i, doc, n, keylist);
+            n = parse_find_node("keybind", n->next);
         }
-        n = parse_find_node("keybind", n->next);
     }
-    if (keylist) {
-        nact = parse_find_node("action", node);
-        while (nact) {
-            if ((action = action_parse(i, doc, nact,
-                                       OB_USER_ACTION_KEYBOARD_KEY)))
+    else if ((n = parse_find_node("action", node->children))) {
+        while (n) {
+            ObAction *action;
+            
+            action = action_parse(i, doc, n, OB_USER_ACTION_KEYBOARD_KEY);
+            if (action)
                 keyboard_bind(keylist, action);
-            nact = parse_find_node("action", nact->next);
+            n = parse_find_node("action", n->next);
         }
     }
+
+    if (is_chroot)
+        keyboard_chroot(keylist);
+
+    g_free(key);
+    keylist = g_list_delete_link(keylist, g_list_last(keylist));
 }
 
 static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                            gpointer d)
 {
+    xmlNodePtr n;
+    gchar *key;
+
     keyboard_unbind_all();
 
-    parse_key(i, doc, node->children, NULL);
+    if ((n = parse_find_node("chainQuitKey", node->children))) {
+        key = parse_string(doc, n);
+        translate_key(key, &config_keyboard_reset_state,
+                      &config_keyboard_reset_keycode);
+        g_free(key);
+    }
+
+    if ((n = parse_find_node("keybind", node->children)))
+        while (n) {
+            parse_key(i, doc, n, NULL);
+            n = parse_find_node("keybind", n->next);
+        }
 }
 
 /*
@@ -368,6 +456,59 @@ 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);
+    if ((n = parse_find_node("animateIconify", node)))
+        config_animate_iconify = 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;
+
+        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("MenuHeader", n, "place"))
+            font = &config_font_menutitle;
+        else if (parse_attr_contains("MenuItem", n, "place"))
+            font = &config_font_menuitem;
+        else if (parse_attr_contains("OnScreenDisplay", n, "place"))
+            font = &config_font_osd;
+        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);
+        }
+
+        *font = RrFontOpen(ob_rr_inst, name, size, weight, slant);
+        g_free(name);
+    next_font:
+        n = parse_find_node("font", n->next);
+    }
 }
 
 static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
@@ -385,7 +526,7 @@ static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
     if ((n = parse_find_node("firstdesk", node))) {
         gint d = parse_int(doc, n);
         if (d > 0)
-            config_screen_firstdesk = d;
+            config_screen_firstdesk = (unsigned) d;
     }
     if ((n = parse_find_node("names", node))) {
         GSList *it;
@@ -414,8 +555,6 @@ static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
     
     if ((n = parse_find_node("drawContents", node)))
         config_resize_redraw = parse_bool(doc, n);
-    if ((n = parse_find_node("fourCorner", node)))
-        config_resize_four_corners = parse_bool(doc, n);
     if ((n = parse_find_node("popupShow", node))) {
         config_resize_popup_show = parse_int(doc, n);
         if (parse_contains("Always", doc, n))
@@ -479,11 +618,11 @@ static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             config_dock_nostrut = parse_bool(doc, n);
     }
     if ((n = parse_find_node("stacking", node))) {
-        if (parse_contains("top", doc, n))
+        if (parse_contains("above", doc, n))
             config_dock_layer = OB_STACKING_LAYER_ABOVE;
         else if (parse_contains("normal", doc, n))
             config_dock_layer = OB_STACKING_LAYER_NORMAL;
-        else if (parse_contains("bottom", doc, n))
+        else if (parse_contains("below", doc, n))
             config_dock_layer = OB_STACKING_LAYER_BELOW;
     }
     if ((n = parse_find_node("direction", node))) {
@@ -505,7 +644,7 @@ static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             config_dock_app_move_button = b;
             config_dock_app_move_modifiers = s;
         } else {
-            g_warning("invalid button '%s'", str);
+            g_message(_("Invalid button '%s' specified in config file"), str);
         }
         g_free(str);
     }
@@ -526,10 +665,10 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
         }
         if ((n = parse_find_node("warpPointer", node)))
             config_menu_warppointer = parse_bool(doc, n);
-        if ((n = parse_find_node("xorStyle", node)))
-            config_menu_xorstyle = parse_bool(doc, n);
         if ((n = parse_find_node("hideDelay", node)))
             config_menu_hide_delay = parse_int(doc, n);
+        if ((n = parse_find_node("middle", node)))
+            config_menu_middle = parse_bool(doc, n);
         if ((n = parse_find_node("submenuShowDelay", node)))
             config_submenu_show_delay = parse_int(doc, n);
         if ((n = parse_find_node("desktopMenuIcons", node)))
@@ -646,7 +785,7 @@ static void bind_default_mouse()
             uact = OB_USER_ACTION_MOUSE_DOUBLE_CLICK; break;
         case OB_MOUSE_ACTION_MOTION:
             uact = OB_USER_ACTION_MOUSE_MOTION; break;
-        case OB_NUM_MOUSE_ACTIONS:
+        default:
             g_assert_not_reached();
         }
         mouse_bind(it->button, it->context, it->mact,
@@ -670,10 +809,16 @@ void config_startup(ObParseInst *i)
 
     config_theme = NULL;
 
+    config_animate_iconify = TRUE;
     config_title_layout = g_strdup("NLIMC");
     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;
@@ -725,8 +870,8 @@ void config_startup(ObParseInst *i)
     parse_register(i, "resistance", parse_resistance, NULL);
 
     config_menu_warppointer = TRUE;
-    config_menu_xorstyle = TRUE;
     config_menu_hide_delay = 250;
+    config_menu_middle = FALSE;
     config_submenu_show_delay = 0;
     config_menu_client_list_icons = TRUE;
     config_menu_files = NULL;
@@ -746,6 +891,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);
@@ -754,7 +904,12 @@ void config_shutdown()
         g_free(it->data);
     g_slist_free(config_menu_files);
 
-    for (it = config_per_app_settings; it; it = g_slist_next(it))
+    for (it = config_per_app_settings; it; it = g_slist_next(it)) {
+        ObAppSettings *itd = (ObAppSettings *)it->data;
+        g_free(itd->name);
+        g_free(itd->role);
+        g_free(itd->class);
         g_free(it->data);
+    }
     g_slist_free(config_per_app_settings);
 }
This page took 0.03376 seconds and 4 git commands to generate.