Merge branch 'backport' into work
[mikachu/openbox.git] / openbox / config.c
index 109b215..790b03b 100644 (file)
@@ -22,6 +22,7 @@
 #include "mouse.h"
 #include "actions.h"
 #include "translate.h"
+#include "hooks.h"
 #include "client.h"
 #include "screen.h"
 #include "openbox.h"
@@ -43,6 +44,7 @@ StrutPartial config_margins;
 
 gchar   *config_theme;
 gboolean config_theme_keepborder;
+guint    config_theme_window_list_icon_size;
 
 gchar   *config_title_layout;
 
@@ -342,6 +344,47 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d)
     }
 }
 
+static void parse_hook(xmlNodePtr node, gpointer d)
+{
+    gchar *name;
+    ObHook hook;
+    xmlNodePtr n;
+
+
+    if (!obt_parse_attr_string(node, "name", &name)) {
+        g_message(_("Hook in config file is missing a name"));
+        return;
+    }
+
+    hook = hooks_hook_from_name(name);
+    if (!hook)
+        g_message(_("Unknown hook \"%s\" in config file"), name);
+    else {
+        if ((n = obt_parse_find_node(node->children, "action")))
+            while (n) {
+                ObActionsAct *action;
+
+                action = actions_parse(n);
+                if (action)
+                    hooks_add(hook, action);
+                n = obt_parse_find_node(n->next, "action");
+            }
+    }
+
+    g_free(name);
+}
+
+static void parse_hooks(xmlNodePtr node, gpointer d)
+{
+    xmlNodePtr n;
+
+    if ((n = obt_parse_find_node(node->children, "hook")))
+        while (n) {
+            parse_hook(n, NULL);
+            n = obt_parse_find_node(n->next, "hook");
+        }
+}
+
 /*
 
 <keybind key="C-x">
@@ -560,6 +603,13 @@ static void parse_theme(xmlNodePtr node, gpointer d)
         config_theme_keepborder = obt_parse_node_bool(n);
     if ((n = obt_parse_find_node(node, "animateIconify")))
         config_animate_iconify = obt_parse_node_bool(n);
+    if ((n = obt_parse_find_node(node, "windowListIconSize"))) {
+        config_theme_window_list_icon_size = obt_parse_node_int(n);
+        if (config_theme_window_list_icon_size < 16)
+            config_theme_window_list_icon_size = 16;
+        else if (config_theme_window_list_icon_size > 96)
+            config_theme_window_list_icon_size = 96;
+    }
 
     n = obt_parse_find_node(node, "font");
     while (n) {
@@ -773,25 +823,25 @@ static void parse_dock(xmlNodePtr node, gpointer d)
 static void parse_menu(xmlNodePtr node, gpointer d)
 {
     xmlNodePtr n;
-    for (node = node->children; node; node = node->next) {
-        if (!xmlStrcasecmp(node->name, (const xmlChar*) "file")) {
-            gchar *c;
+    node = node->children;
 
-            c = obt_parse_node_string(node);
+    if ((n = obt_parse_find_node(node, "hideDelay")))
+        config_menu_hide_delay = obt_parse_node_int(n);
+    if ((n = obt_parse_find_node(node, "middle")))
+        config_menu_middle = obt_parse_node_bool(n);
+    if ((n = obt_parse_find_node(node, "submenuShowDelay")))
+        config_submenu_show_delay = obt_parse_node_int(n);
+    if ((n = obt_parse_find_node(node, "applicationIcons")))
+        config_menu_client_list_icons = obt_parse_node_bool(n);
+    if ((n = obt_parse_find_node(node, "manageDesktops")))
+        config_menu_manage_desktops = obt_parse_node_bool(n);
+
+    while ((node = obt_parse_find_node(node, "file"))) {
+            gchar *c = obt_parse_node_string(node);
             config_menu_files = g_slist_append(config_menu_files,
                                                obt_paths_expand_tilde(c));
             g_free(c);
-        }
-        if ((n = obt_parse_find_node(node, "hideDelay")))
-            config_menu_hide_delay = obt_parse_node_int(n);
-        if ((n = obt_parse_find_node(node, "middle")))
-            config_menu_middle = obt_parse_node_bool(n);
-        if ((n = obt_parse_find_node(node, "submenuShowDelay")))
-            config_submenu_show_delay = obt_parse_node_int(n);
-        if ((n = obt_parse_find_node(node, "applicationIcons")))
-            config_menu_client_list_icons = obt_parse_node_bool(n);
-        if ((n = obt_parse_find_node(node, "manageDesktops")))
-            config_menu_manage_desktops = obt_parse_node_bool(n);
+            node = node->next;
     }
 }
 
@@ -920,6 +970,7 @@ void config_startup(ObtParseInst *i)
     config_animate_iconify = TRUE;
     config_title_layout = g_strdup("NLIMC");
     config_theme_keepborder = TRUE;
+    config_theme_window_list_icon_size = 36;
 
     config_font_activewindow = NULL;
     config_font_inactivewindow = NULL;
@@ -987,6 +1038,8 @@ void config_startup(ObtParseInst *i)
 
     obt_parse_register(i, "menu", parse_menu, NULL);
 
+    obt_parse_register(i, "hooks", parse_hooks, NULL);
+
     config_per_app_settings = NULL;
 
     obt_parse_register(i, "applications", parse_per_app_settings, NULL);