]> Dogcows Code - chaz/openbox/blobdiff - openbox/config.c
make the dock's hiding always have at least 1px on screen
[chaz/openbox] / openbox / config.c
index e0cb1819d7f6068788611ca596bc97dd2e5071e8..c094732ecb30924600d989f83efba4692f747049 100644 (file)
@@ -1,8 +1,8 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 
    config.c for the Openbox window manager
 /* -*- 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
 
    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 "config.h"
 #include "keyboard.h"
 #include "mouse.h"
 #include "config.h"
 #include "keyboard.h"
 #include "mouse.h"
+#include "actions.h"
 #include "prop.h"
 #include "translate.h"
 #include "client.h"
 #include "screen.h"
 #include "parser/parse.h"
 #include "openbox.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;
 guint    config_focus_delay;
 gboolean config_focus_raise;
 gboolean config_focus_last;
 
 gboolean config_focus_new;
 gboolean config_focus_follow;
 guint    config_focus_delay;
 gboolean config_focus_raise;
 gboolean config_focus_last;
+gboolean config_focus_under_mouse;
 
 ObPlacePolicy config_place_policy;
 
 ObPlacePolicy config_place_policy;
+gboolean      config_place_center;
+gboolean      config_place_active;
+
+StrutPartial config_margins;
 
 gchar   *config_theme;
 gboolean config_theme_keepborder;
 
 gchar   *config_theme;
 gboolean config_theme_keepborder;
-gboolean config_theme_hidedisabled;
 
 gchar   *config_title_layout;
 
 gchar   *config_title_layout;
-gboolean config_title_number;
+
+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_desktops_num;
 GSList *config_desktops_names;
-gint    config_screen_firstdesk;
+guint   config_screen_firstdesk;
+guint   config_desktop_popup_time;
 
 
-gboolean config_resize_redraw;
-gboolean config_resize_four_corners;
-gint     config_resize_popup_show;
-gint     config_resize_popup_pos;
+gboolean         config_resize_redraw;
+gboolean         config_resize_four_corners;
+gint             config_resize_popup_show;
+ObResizePopupPos config_resize_popup_pos;
+GravityPoint     config_resize_popup_fixed;
 
 ObStackingLayer config_dock_layer;
 gboolean        config_dock_floating;
 
 ObStackingLayer config_dock_layer;
 gboolean        config_dock_floating;
@@ -69,9 +84,8 @@ guint config_keyboard_reset_state;
 
 gint config_mouse_threshold;
 gint config_mouse_dclicktime;
 
 gint config_mouse_threshold;
 gint config_mouse_dclicktime;
+gint config_mouse_screenedgetime;
 
 
-gboolean config_menu_warppointer;
-gboolean config_menu_xorstyle;
 guint    config_menu_hide_delay;
 gboolean config_menu_middle;
 guint    config_submenu_show_delay;
 guint    config_menu_hide_delay;
 gboolean config_menu_middle;
 guint    config_submenu_show_delay;
@@ -81,10 +95,71 @@ 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;
 
 
 GSList *config_per_app_settings;
 
+ObAppSettings* config_create_app_settings(void)
+{
+    ObAppSettings *settings = g_new0(ObAppSettings, 1);
+    settings->decor = -1;
+    settings->shade = -1;
+    settings->monitor = -1;
+    settings->focus = -1;
+    settings->desktop = 0;
+    settings->layer = -2;
+    settings->iconic = -1;
+    settings->skip_pager = -1;
+    settings->skip_taskbar = -1;
+    settings->fullscreen = -1;
+    settings->max_horz = -1;
+    settings->max_vert = -1;
+    return settings;
+}
+
+#define copy_if(setting, default) \
+  if (src->setting != default) dst->setting = src->setting
+void config_app_settings_copy_non_defaults(const ObAppSettings *src,
+                                           ObAppSettings *dst)
+{
+    g_assert(src != NULL);
+    g_assert(dst != NULL);
+
+    copy_if(decor, -1);
+    copy_if(shade, -1);
+    copy_if(focus, -1);
+    copy_if(desktop, 0);
+    copy_if(layer, -2);
+    copy_if(iconic, -1);
+    copy_if(skip_pager, -1);
+    copy_if(skip_taskbar, -1);
+    copy_if(fullscreen, -1);
+    copy_if(max_horz, -1);
+    copy_if(max_vert, -1);
+
+    if (src->pos_given) {
+        dst->pos_given = TRUE;
+        dst->position = src->position;
+        dst->monitor = src->monitor;
+    }
+}
+
+static void config_parse_gravity_coord(xmlDocPtr doc, xmlNodePtr node,
+                                       GravityCoord *c)
+{
+    gchar *s = parse_string(doc, node);
+    if (!g_ascii_strcasecmp(s, "center"))
+        c->center = TRUE;
+    else {
+        if (s[0] == '-')
+            c->opposite = TRUE;
+        if (s[0] == '-' || s[0] == '+')
+            c->pos = atoi(s+1);
+        else
+            c->pos = atoi(s);
+    }
+    g_free(s);
+}
+
 /*
   <applications>
     <application name="aterm">
 /*
   <applications>
     <application name="aterm">
@@ -95,28 +170,29 @@ GSList *config_per_app_settings;
       <position>
         <x>700</x>
         <y>0</y>
       <position>
         <x>700</x>
         <y>0</y>
+        <monitor>1</monitor>
       </position>
       </position>
-      <head>1</head>
+      .. there is a lot more settings available
     </application>
   </applications>
 */
 
 /* Manages settings for individual applications.
     </application>
   </applications>
 */
 
 /* Manages settings for individual applications.
-   Some notes: head is the screen number in a multi monitor
+   Some notes: monitor is the screen number in a multi monitor
    (Xinerama) setup (starting from 0) or mouse, meaning the
    (Xinerama) setup (starting from 0) or mouse, meaning the
-   head the pointer is on. Default: mouse.
+   monitor the pointer is on. Default: mouse.
    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
    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
-   center the window in the specified axis. Position is relative
-   from head, so <position><x>center</x></position><head>1</head>
-   will center the window on the second head.
+   center the window in the specified axis. Position is within
+   the monitor, so <position><x>center</x></position><monitor>2</monitor>
+   will center the window on the second monitor.
 */
 */
-static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
-                                   xmlNodePtr node, gpointer d)
+static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc,
+                                   xmlNodePtr node, gpointer data)
 {
     xmlNodePtr app = parse_find_node("application", node->children);
 {
     xmlNodePtr app = parse_find_node("application", node->children);
-    gchar *name, *class;
+    gchar *name = NULL, *class = NULL, *role = NULL;
     gboolean name_set, class_set;
     gboolean x_pos_given;
 
     gboolean name_set, class_set;
     gboolean x_pos_given;
 
@@ -127,130 +203,121 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
         name_set = parse_attr_string("name", app, &name);
         if (class_set || name_set) {
             xmlNodePtr n, c;
         name_set = parse_attr_string("name", app, &name);
         if (class_set || name_set) {
             xmlNodePtr n, c;
-            ObAppSettings *settings = g_new0(ObAppSettings, 1);
-            
+            ObAppSettings *settings = config_create_app_settings();;
+
             if (name_set)
             if (name_set)
-                settings->name = name;
-            else
-                settings->name = NULL;
+                settings->name = g_pattern_spec_new(name);
 
             if (class_set)
 
             if (class_set)
-                settings->class = class;
-            else
-                settings->class = NULL;
+                settings->class = g_pattern_spec_new(class);
 
 
-            if (!parse_attr_string("role", app, &settings->role))
-                settings->role = NULL;
+            if (parse_attr_string("role", app, &role))
+                settings->role = g_pattern_spec_new(role);
 
 
-            settings->decor = -1;
             if ((n = parse_find_node("decor", app->children)))
             if ((n = parse_find_node("decor", app->children)))
-                settings->decor = parse_bool(doc, n);
+                if (!parse_contains("default", doc, n))
+                    settings->decor = parse_bool(doc, n);
 
 
-            settings->shade = -1;
             if ((n = parse_find_node("shade", app->children)))
             if ((n = parse_find_node("shade", app->children)))
-                settings->shade = parse_bool(doc, n);
+                if (!parse_contains("default", doc, n))
+                    settings->shade = parse_bool(doc, n);
 
 
-            settings->position.x = settings->position.y = 0;
-            settings->pos_given = FALSE;
             if ((n = parse_find_node("position", app->children))) {
             if ((n = parse_find_node("position", app->children))) {
-                if ((c = parse_find_node("x", n->children))) {
-                    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);
+                if ((c = parse_find_node("x", n->children)))
+                    if (!parse_contains("default", doc, c)) {
+                        config_parse_gravity_coord(doc, c,
+                                                   &settings->position.x);
                         x_pos_given = TRUE;
                     }
                         x_pos_given = TRUE;
                     }
-                    g_free(s);
-                }
 
 
-                if (x_pos_given && (c = parse_find_node("y", n->children))) {
-                    gchar *s = parse_string(doc, c);
-                    if (!strcmp(s, "center")) {
-                        settings->center_y = TRUE;
-                        settings->pos_given = TRUE;
-                    } else {
-                        settings->position.y = parse_int(doc, c);
+                if (x_pos_given && (c = parse_find_node("y", n->children)))
+                    if (!parse_contains("default", doc, c)) {
+                        config_parse_gravity_coord(doc, c,
+                                                   &settings->position.y);
                         settings->pos_given = TRUE;
                     }
                         settings->pos_given = TRUE;
                     }
-                    g_free(s);
-                }
+
+                if (settings->pos_given &&
+                    (c = parse_find_node("monitor", n->children)))
+                    if (!parse_contains("default", doc, c)) {
+                        gchar *s = parse_string(doc, c);
+                        if (!g_ascii_strcasecmp(s, "mouse"))
+                            settings->monitor = 0;
+                        else
+                            settings->monitor = parse_int(doc, c) + 1;
+                        g_free(s);
+                    }
             }
 
             }
 
-            settings->focus = -1;
             if ((n = parse_find_node("focus", app->children)))
             if ((n = parse_find_node("focus", app->children)))
-                settings->focus = parse_bool(doc, n);
+                if (!parse_contains("default", doc, n))
+                    settings->focus = parse_bool(doc, n);
 
             if ((n = parse_find_node("desktop", app->children))) {
 
             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))) {
-                gchar *s = parse_string(doc, n);
-                if (!strcmp(s, "mouse"))
-                    settings->head = -1;
-                else
-                    settings->head = parse_int(doc, n);
-                g_free(s);
+                if (!parse_contains("default", doc, n)) {
+                    gchar *s = parse_string(doc, n);
+                    if (!g_ascii_strcasecmp(s, "all"))
+                        settings->desktop = DESKTOP_ALL;
+                    else {
+                        gint i = parse_int(doc, n);
+                        if (i > 0)
+                            settings->desktop = i;
+                    }
+                    g_free(s);
+                }
             }
 
             }
 
-            settings->layer = -2;
-            if ((n = parse_find_node("layer", app->children))) {
-                gchar *s = parse_string(doc, n);
-                if (!strcmp(s, "above"))
-                    settings->layer = 1;
-                else if (!strcmp(s, "below"))
-                    settings->layer = -1;
-                else
-                    settings->layer = 0;
-                g_free(s);
-            }
+            if ((n = parse_find_node("layer", app->children)))
+                if (!parse_contains("default", doc, n)) {
+                    gchar *s = parse_string(doc, n);
+                    if (!g_ascii_strcasecmp(s, "above"))
+                        settings->layer = 1;
+                    else if (!g_ascii_strcasecmp(s, "below"))
+                        settings->layer = -1;
+                    else
+                        settings->layer = 0;
+                    g_free(s);
+                }
 
 
-            settings->iconic = -1;
             if ((n = parse_find_node("iconic", app->children)))
             if ((n = parse_find_node("iconic", app->children)))
-                settings->iconic = parse_bool(doc, n);
+                if (!parse_contains("default", doc, n))
+                    settings->iconic = parse_bool(doc, n);
 
 
-            settings->skip_pager = -1;
             if ((n = parse_find_node("skip_pager", app->children)))
             if ((n = parse_find_node("skip_pager", app->children)))
-                settings->skip_pager = parse_bool(doc, n);
+                if (!parse_contains("default", doc, n))
+                    settings->skip_pager = parse_bool(doc, n);
 
 
-            settings->skip_taskbar = -1;
             if ((n = parse_find_node("skip_taskbar", app->children)))
             if ((n = parse_find_node("skip_taskbar", app->children)))
-                settings->skip_taskbar = parse_bool(doc, n);
+                if (!parse_contains("default", doc, n))
+                    settings->skip_taskbar = parse_bool(doc, n);
 
 
-            settings->fullscreen = -1;
             if ((n = parse_find_node("fullscreen", app->children)))
             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);
-            }
+                if (!parse_contains("default", doc, n))
+                    settings->fullscreen = parse_bool(doc, n);
+
+            if ((n = parse_find_node("maximized", app->children)))
+                if (!parse_contains("default", doc, n)) {
+                    gchar *s = parse_string(doc, n);
+                    if (!g_ascii_strcasecmp(s, "horizontal")) {
+                        settings->max_horz = TRUE;
+                        settings->max_vert = FALSE;
+                    } else if (!g_ascii_strcasecmp(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) settings);
 
             config_per_app_settings = g_slist_append(config_per_app_settings,
                                               (gpointer) settings);
+            g_free(name);
+            g_free(class);
+            g_free(role);
+            name = class = role = NULL;
         }
         }
-        
+
         app = parse_find_node("application", app->next);
     }
 }
         app = parse_find_node("application", app->next);
     }
 }
@@ -269,52 +336,65 @@ static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                       GList *keylist)
 {
     gchar *key;
                       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) {
+            ObActionsAct *action;
+
+            action = actions_parse(i, doc, n);
+            if (action)
                 keyboard_bind(keylist, 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,
 }
 
 static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                           gpointer d)
+                           gpointer data)
 {
 {
+    xmlNodePtr n;
+    gchar *key;
+
     keyboard_unbind_all();
 
     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);
+        }
 }
 
 /*
 
 }
 
 /*
 
-<context name="Titlebar"> 
+<context name="Titlebar">
   <mousebind button="Left" action="Press">
     <action name="Raise"></action>
   </mousebind>
   <mousebind button="Left" action="Press">
     <action name="Raise"></action>
   </mousebind>
@@ -323,23 +403,23 @@ static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 */
 
 static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 */
 
 static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                        gpointer d)
+                        gpointer data)
 {
     xmlNodePtr n, nbut, nact;
     gchar *buttonstr;
     gchar *contextstr;
 {
     xmlNodePtr n, nbut, nact;
     gchar *buttonstr;
     gchar *contextstr;
-    ObUserAction uact;
     ObMouseAction mact;
     ObMouseAction mact;
-    ObAction *action;
 
     mouse_unbind_all();
 
     node = node->children;
 
     mouse_unbind_all();
 
     node = node->children;
-    
+
     if ((n = parse_find_node("dragThreshold", node)))
         config_mouse_threshold = parse_int(doc, n);
     if ((n = parse_find_node("doubleClickTime", node)))
         config_mouse_dclicktime = parse_int(doc, n);
     if ((n = parse_find_node("dragThreshold", node)))
         config_mouse_threshold = parse_int(doc, n);
     if ((n = parse_find_node("doubleClickTime", node)))
         config_mouse_dclicktime = parse_int(doc, n);
+    if ((n = parse_find_node("screenEdgeWarpTime", node)))
+        config_mouse_screenedgetime = parse_int(doc, n);
 
     n = parse_find_node("context", node);
     while (n) {
 
     n = parse_find_node("context", node);
     while (n) {
@@ -350,25 +430,22 @@ static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             if (!parse_attr_string("button", nbut, &buttonstr))
                 goto next_nbut;
             if (parse_attr_contains("press", nbut, "action")) {
             if (!parse_attr_string("button", nbut, &buttonstr))
                 goto next_nbut;
             if (parse_attr_contains("press", nbut, "action")) {
-                uact = OB_USER_ACTION_MOUSE_PRESS;
                 mact = OB_MOUSE_ACTION_PRESS;
             } else if (parse_attr_contains("release", nbut, "action")) {
                 mact = OB_MOUSE_ACTION_PRESS;
             } else if (parse_attr_contains("release", nbut, "action")) {
-                uact = OB_USER_ACTION_MOUSE_RELEASE;
                 mact = OB_MOUSE_ACTION_RELEASE;
             } else if (parse_attr_contains("click", nbut, "action")) {
                 mact = OB_MOUSE_ACTION_RELEASE;
             } else if (parse_attr_contains("click", nbut, "action")) {
-                uact = OB_USER_ACTION_MOUSE_CLICK;
                 mact = OB_MOUSE_ACTION_CLICK;
             } else if (parse_attr_contains("doubleclick", nbut,"action")) {
                 mact = OB_MOUSE_ACTION_CLICK;
             } else if (parse_attr_contains("doubleclick", nbut,"action")) {
-                uact = OB_USER_ACTION_MOUSE_DOUBLE_CLICK;
                 mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
             } else if (parse_attr_contains("drag", nbut, "action")) {
                 mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
             } else if (parse_attr_contains("drag", nbut, "action")) {
-                uact = OB_USER_ACTION_MOUSE_MOTION;
                 mact = OB_MOUSE_ACTION_MOTION;
             } else
                 goto next_nbut;
             nact = parse_find_node("action", nbut->children);
             while (nact) {
                 mact = OB_MOUSE_ACTION_MOTION;
             } else
                 goto next_nbut;
             nact = parse_find_node("action", nbut->children);
             while (nact) {
-                if ((action = action_parse(i, doc, nact, uact)))
+                ObActionsAct *action;
+
+                if ((action = actions_parse(i, doc, nact)))
                     mouse_bind(buttonstr, contextstr, mact, action);
                 nact = parse_find_node("action", nact->next);
             }
                     mouse_bind(buttonstr, contextstr, mact, action);
                 nact = parse_find_node("action", nact->next);
             }
@@ -383,38 +460,61 @@ static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 }
 
 static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 }
 
 static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                        gpointer d)
+                        gpointer data)
 {
     xmlNodePtr n;
 
     node = node->children;
 {
     xmlNodePtr n;
 
     node = node->children;
-    
+
     if ((n = parse_find_node("focusNew", node)))
         config_focus_new = parse_bool(doc, n);
     if ((n = parse_find_node("followMouse", node)))
         config_focus_follow = parse_bool(doc, n);
     if ((n = parse_find_node("focusDelay", node)))
     if ((n = parse_find_node("focusNew", node)))
         config_focus_new = parse_bool(doc, n);
     if ((n = parse_find_node("followMouse", node)))
         config_focus_follow = parse_bool(doc, n);
     if ((n = parse_find_node("focusDelay", node)))
-        config_focus_delay = parse_int(doc, n) * 1000;
+        config_focus_delay = parse_int(doc, n);
     if ((n = parse_find_node("raiseOnFocus", node)))
         config_focus_raise = parse_bool(doc, n);
     if ((n = parse_find_node("focusLast", node)))
         config_focus_last = parse_bool(doc, n);
     if ((n = parse_find_node("raiseOnFocus", node)))
         config_focus_raise = parse_bool(doc, n);
     if ((n = parse_find_node("focusLast", node)))
         config_focus_last = parse_bool(doc, n);
+    if ((n = parse_find_node("underMouse", node)))
+        config_focus_under_mouse = parse_bool(doc, n);
 }
 
 static void parse_placement(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 }
 
 static void parse_placement(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                            gpointer d)
+                            gpointer data)
 {
     xmlNodePtr n;
 
     node = node->children;
 {
     xmlNodePtr n;
 
     node = node->children;
-    
+
     if ((n = parse_find_node("policy", node)))
         if (parse_contains("UnderMouse", doc, n))
             config_place_policy = OB_PLACE_POLICY_MOUSE;
     if ((n = parse_find_node("policy", node)))
         if (parse_contains("UnderMouse", doc, n))
             config_place_policy = OB_PLACE_POLICY_MOUSE;
+    if ((n = parse_find_node("center", node)))
+        config_place_center = parse_bool(doc, n);
+    if ((n = parse_find_node("active", node)))
+        config_place_active = parse_bool(doc, n);
+}
+
+static void parse_margins(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                          gpointer data)
+{
+    xmlNodePtr n;
+
+    node = node->children;
+
+    if ((n = parse_find_node("top", node)))
+        config_margins.top = MAX(0, parse_int(doc, n));
+    if ((n = parse_find_node("left", node)))
+        config_margins.left = MAX(0, parse_int(doc, n));
+    if ((n = parse_find_node("right", node)))
+        config_margins.right = MAX(0, parse_int(doc, n));
+    if ((n = parse_find_node("bottom", node)))
+        config_margins.bottom = MAX(0, parse_int(doc, n));
 }
 
 static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 }
 
 static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                        gpointer d)
+                        gpointer data)
 {
     xmlNodePtr n;
 
 {
     xmlNodePtr n;
 
@@ -429,24 +529,80 @@ static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
         g_free(c);
     }
     if ((n = parse_find_node("titleLayout", node))) {
         g_free(c);
     }
     if ((n = parse_find_node("titleLayout", node))) {
+        gchar *c, *d;
+
         g_free(config_title_layout);
         config_title_layout = parse_string(doc, n);
         g_free(config_title_layout);
         config_title_layout = parse_string(doc, n);
+
+        /* replace duplicates with spaces */
+        for (c = config_title_layout; *c != '\0'; ++c)
+            for (d = c+1; *d != '\0'; ++d)
+                if (*c == *d) *d = ' ';
     }
     }
-    if ((n = parse_find_node("titleNumber", node)))
-        config_title_number = parse_bool(doc, n);
     if ((n = parse_find_node("keepBorder", node)))
         config_theme_keepborder = parse_bool(doc, n);
     if ((n = parse_find_node("keepBorder", 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,
 }
 
 static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                           gpointer d)
+                           gpointer data)
 {
     xmlNodePtr n;
 
     node = node->children;
 {
     xmlNodePtr n;
 
     node = node->children;
-    
+
     if ((n = parse_find_node("number", node))) {
         gint d = parse_int(doc, n);
         if (d > 0)
     if ((n = parse_find_node("number", node))) {
         gint d = parse_int(doc, n);
         if (d > 0)
@@ -455,7 +611,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)
     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;
     }
     if ((n = parse_find_node("names", node))) {
         GSList *it;
@@ -473,19 +629,19 @@ static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             nname = parse_find_node("name", nname->next);
         }
     }
             nname = parse_find_node("name", nname->next);
         }
     }
+    if ((n = parse_find_node("popupTime", node)))
+        config_desktop_popup_time = parse_int(doc, n);
 }
 
 static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 }
 
 static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                         gpointer d)
+                         gpointer data)
 {
     xmlNodePtr n;
 
     node = node->children;
 {
     xmlNodePtr n;
 
     node = node->children;
-    
+
     if ((n = parse_find_node("drawContents", node)))
         config_resize_redraw = parse_bool(doc, n);
     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))
     if ((n = parse_find_node("popupShow", node))) {
         config_resize_popup_show = parse_int(doc, n);
         if (parse_contains("Always", doc, n))
@@ -496,16 +652,29 @@ static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             config_resize_popup_show = 1;
     }
     if ((n = parse_find_node("popupPosition", node))) {
             config_resize_popup_show = 1;
     }
     if ((n = parse_find_node("popupPosition", node))) {
-        config_resize_popup_pos = parse_int(doc, n);
         if (parse_contains("Top", doc, n))
         if (parse_contains("Top", doc, n))
-            config_resize_popup_pos = 1;
+            config_resize_popup_pos = OB_RESIZE_POS_TOP;
         else if (parse_contains("Center", doc, n))
         else if (parse_contains("Center", doc, n))
-            config_resize_popup_pos = 0;
+            config_resize_popup_pos = OB_RESIZE_POS_CENTER;
+        else if (parse_contains("Fixed", doc, n)) {
+            config_resize_popup_pos = OB_RESIZE_POS_FIXED;
+
+            if ((n = parse_find_node("popupFixedPosition", node))) {
+                xmlNodePtr n2;
+
+                if ((n2 = parse_find_node("x", n->children)))
+                    config_parse_gravity_coord(doc, n2,
+                                               &config_resize_popup_fixed.x);
+                if ((n2 = parse_find_node("y", n->children)))
+                    config_parse_gravity_coord(doc, n2,
+                                               &config_resize_popup_fixed.y);
+            }
+        }
     }
 }
 
 static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
     }
 }
 
 static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                       gpointer d)
+                       gpointer data)
 {
     xmlNodePtr n;
 
 {
     xmlNodePtr n;
 
@@ -549,11 +718,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))) {
             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;
             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))) {
             config_dock_layer = OB_STACKING_LAYER_BELOW;
     }
     if ((n = parse_find_node("direction", node))) {
@@ -565,9 +734,9 @@ static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
     if ((n = parse_find_node("autoHide", node)))
         config_dock_hide = parse_bool(doc, n);
     if ((n = parse_find_node("hideDelay", node)))
     if ((n = parse_find_node("autoHide", node)))
         config_dock_hide = parse_bool(doc, n);
     if ((n = parse_find_node("hideDelay", node)))
-        config_dock_hide_delay = parse_int(doc, n) * 1000;
+        config_dock_hide_delay = parse_int(doc, n);
     if ((n = parse_find_node("showDelay", node)))
     if ((n = parse_find_node("showDelay", node)))
-        config_dock_show_delay = parse_int(doc, n) * 1000;
+        config_dock_show_delay = parse_int(doc, n);
     if ((n = parse_find_node("moveButton", node))) {
         gchar *str = parse_string(doc, n);
         guint b, s;
     if ((n = parse_find_node("moveButton", node))) {
         gchar *str = parse_string(doc, n);
         guint b, s;
@@ -575,14 +744,14 @@ static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             config_dock_app_move_button = b;
             config_dock_app_move_modifiers = s;
         } else {
             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);
     }
 }
 
 static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
         }
         g_free(str);
     }
 }
 
 static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
-                       gpointer d)
+                       gpointer data)
 {
     xmlNodePtr n;
     for (node = node->children; node; node = node->next) {
 {
     xmlNodePtr n;
     for (node = node->children; node; node = node->next) {
@@ -594,23 +763,19 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
                                                parse_expand_tilde(c));
             g_free(c);
         }
                                                parse_expand_tilde(c));
             g_free(c);
         }
-        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("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)))
+        if ((n = parse_find_node("applicationIcons", node)))
             config_menu_client_list_icons = parse_bool(doc, n);
     }
 }
             config_menu_client_list_icons = parse_bool(doc, n);
     }
 }
-   
-static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, 
-                             gpointer d)
+
+static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                             gpointer data)
 {
     xmlNodePtr n;
 
 {
     xmlNodePtr n;
 
@@ -619,8 +784,6 @@ static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
         config_resist_win = parse_int(doc, n);
     if ((n = parse_find_node("screen_edge_strength", node)))
         config_resist_edge = parse_int(doc, n);
         config_resist_win = parse_int(doc, n);
     if ((n = parse_find_node("screen_edge_strength", node)))
         config_resist_edge = parse_int(doc, n);
-    if ((n = parse_find_node("edges_hit_layers_below", node)))
-        config_resist_layers_below = parse_bool(doc, n);
 }
 
 typedef struct
 }
 
 typedef struct
@@ -629,7 +792,7 @@ typedef struct
     const gchar *actname;
 } ObDefKeyBind;
 
     const gchar *actname;
 } ObDefKeyBind;
 
-static void bind_default_keyboard()
+static void bind_default_keyboard(void)
 {
     ObDefKeyBind *it;
     ObDefKeyBind binds[] = {
 {
     ObDefKeyBind *it;
     ObDefKeyBind binds[] = {
@@ -638,11 +801,9 @@ static void bind_default_keyboard()
         { "A-F4", "Close" },
         { NULL, NULL }
     };
         { "A-F4", "Close" },
         { NULL, NULL }
     };
-
     for (it = binds; it->key; ++it) {
         GList *l = g_list_append(NULL, g_strdup(it->key));
     for (it = binds; it->key; ++it) {
         GList *l = g_list_append(NULL, g_strdup(it->key));
-        keyboard_bind(l, action_from_string(it->actname,
-                                            OB_USER_ACTION_KEYBOARD_KEY));
+        keyboard_bind(l, actions_parse_string(it->actname));
     }
 }
 
     }
 }
 
@@ -654,7 +815,7 @@ typedef struct
     const gchar *actname;
 } ObDefMouseBind;
 
     const gchar *actname;
 } ObDefMouseBind;
 
-static void bind_default_mouse()
+static void bind_default_mouse(void)
 {
     ObDefMouseBind *it;
     ObDefMouseBind binds[] = {
 {
     ObDefMouseBind *it;
     ObDefMouseBind binds[] = {
@@ -665,7 +826,7 @@ static void bind_default_mouse()
         { "Middle", "Desktop", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Right", "Desktop", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "Titlebar", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Middle", "Desktop", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Right", "Desktop", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "Titlebar", OB_MOUSE_ACTION_PRESS, "Focus" },
-        { "Left", "Handle", OB_MOUSE_ACTION_PRESS, "Focus" },
+        { "Left", "Bottom", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "TLCorner", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_PRESS, "Focus" },
         { "Left", "TLCorner", OB_MOUSE_ACTION_PRESS, "Focus" },
@@ -679,7 +840,6 @@ static void bind_default_mouse()
         { "Left", "Client", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Titlebar", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Middle", "Titlebar", OB_MOUSE_ACTION_CLICK, "Lower" },
         { "Left", "Client", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Titlebar", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Middle", "Titlebar", OB_MOUSE_ACTION_CLICK, "Lower" },
-        { "Left", "Handle", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "TLCorner", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "TLCorner", OB_MOUSE_ACTION_CLICK, "Raise" },
@@ -691,7 +851,7 @@ static void bind_default_mouse()
         { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Close", OB_MOUSE_ACTION_CLICK, "Close" },
         { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "Raise" },
         { "Left", "Close", OB_MOUSE_ACTION_CLICK, "Close" },
-        { "Left", "Maximize", OB_MOUSE_ACTION_CLICK, "ToggleMaximizeFull" },
+        { "Left", "Maximize", OB_MOUSE_ACTION_CLICK, "ToggleMaximize" },
         { "Left", "Iconify", OB_MOUSE_ACTION_CLICK, "Iconify" },
         { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "ToggleOmnipresent" },
         { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "ToggleShade" },
         { "Left", "Iconify", OB_MOUSE_ACTION_CLICK, "Iconify" },
         { "Left", "AllDesktops", OB_MOUSE_ACTION_CLICK, "ToggleOmnipresent" },
         { "Left", "Shade", OB_MOUSE_ACTION_CLICK, "ToggleShade" },
@@ -699,31 +859,19 @@ static void bind_default_mouse()
         { "Left", "TRCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "TRCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "BLCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "BRCorner", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Top", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Bottom", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Left", OB_MOUSE_ACTION_MOTION, "Resize" },
+        { "Left", "Right", OB_MOUSE_ACTION_MOTION, "Resize" },
         { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION, "Move" },
         { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION, "Move" },
         { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION, "Resize" },
         { NULL, NULL, 0, NULL }
     };
 
         { "Left", "Titlebar", OB_MOUSE_ACTION_MOTION, "Move" },
         { "A-Left", "Frame", OB_MOUSE_ACTION_MOTION, "Move" },
         { "A-Middle", "Frame", OB_MOUSE_ACTION_MOTION, "Resize" },
         { NULL, NULL, 0, NULL }
     };
 
-    for (it = binds; it->button; ++it) {
-        ObUserAction uact;
-        switch (it->mact) {
-        case OB_MOUSE_ACTION_PRESS:
-            uact = OB_USER_ACTION_MOUSE_PRESS; break;
-        case OB_MOUSE_ACTION_RELEASE:
-            uact = OB_USER_ACTION_MOUSE_RELEASE; break;
-        case OB_MOUSE_ACTION_CLICK:
-            uact = OB_USER_ACTION_MOUSE_CLICK; break;
-        case OB_MOUSE_ACTION_DOUBLE_CLICK:
-            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:
-            g_assert_not_reached();
-        }
+    for (it = binds; it->button; ++it)
         mouse_bind(it->button, it->context, it->mact,
         mouse_bind(it->button, it->context, it->mact,
-                   action_from_string(it->actname, uact));
-    }
+                   actions_parse_string(it->actname));
 }
 
 void config_startup(ObParseInst *i)
 }
 
 void config_startup(ObParseInst *i)
@@ -732,33 +880,47 @@ void config_startup(ObParseInst *i)
     config_focus_follow = FALSE;
     config_focus_delay = 0;
     config_focus_raise = FALSE;
     config_focus_follow = FALSE;
     config_focus_delay = 0;
     config_focus_raise = FALSE;
-    config_focus_last = FALSE;
+    config_focus_last = TRUE;
+    config_focus_under_mouse = FALSE;
 
     parse_register(i, "focus", parse_focus, NULL);
 
     config_place_policy = OB_PLACE_POLICY_SMART;
 
     parse_register(i, "focus", parse_focus, NULL);
 
     config_place_policy = OB_PLACE_POLICY_SMART;
+    config_place_center = TRUE;
+    config_place_active = FALSE;
 
     parse_register(i, "placement", parse_placement, NULL);
 
 
     parse_register(i, "placement", parse_placement, NULL);
 
+    STRUT_PARTIAL_SET(config_margins, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+    parse_register(i, "margins", parse_margins, NULL);
+
     config_theme = NULL;
 
     config_theme = NULL;
 
+    config_animate_iconify = TRUE;
     config_title_layout = g_strdup("NLIMC");
     config_title_layout = g_strdup("NLIMC");
-    config_title_number = TRUE;
     config_theme_keepborder = TRUE;
     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;
     config_screen_firstdesk = 1;
     config_desktops_names = NULL;
 
     parse_register(i, "theme", parse_theme, NULL);
 
     config_desktops_num = 4;
     config_screen_firstdesk = 1;
     config_desktops_names = NULL;
+    config_desktop_popup_time = 875;
 
     parse_register(i, "desktops", parse_desktops, NULL);
 
     config_resize_redraw = TRUE;
     config_resize_four_corners = FALSE;
     config_resize_popup_show = 1; /* nonpixel increments */
 
     parse_register(i, "desktops", parse_desktops, NULL);
 
     config_resize_redraw = TRUE;
     config_resize_four_corners = FALSE;
     config_resize_popup_show = 1; /* nonpixel increments */
-    config_resize_popup_pos = 0;  /* center of client */
+    config_resize_popup_pos = OB_RESIZE_POS_CENTER;
+    GRAVITY_COORD_SET(config_resize_popup_fixed.x, 0, FALSE, FALSE);
+    GRAVITY_COORD_SET(config_resize_popup_fixed.y, 0, FALSE, FALSE);
 
     parse_register(i, "resize", parse_resize, NULL);
 
 
     parse_register(i, "resize", parse_resize, NULL);
 
@@ -784,8 +946,9 @@ void config_startup(ObParseInst *i)
 
     parse_register(i, "keyboard", parse_keyboard, NULL);
 
 
     parse_register(i, "keyboard", parse_keyboard, NULL);
 
-    config_mouse_threshold = 3;
+    config_mouse_threshold = 8;
     config_mouse_dclicktime = 200;
     config_mouse_dclicktime = 200;
+    config_mouse_screenedgetime = 400;
 
     bind_default_mouse();
 
 
     bind_default_mouse();
 
@@ -793,12 +956,9 @@ void config_startup(ObParseInst *i)
 
     config_resist_win = 10;
     config_resist_edge = 20;
 
     config_resist_win = 10;
     config_resist_edge = 20;
-    config_resist_layers_below = FALSE;
 
     parse_register(i, "resistance", parse_resistance, NULL);
 
 
     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_hide_delay = 250;
     config_menu_middle = FALSE;
     config_submenu_show_delay = 0;
@@ -812,7 +972,7 @@ void config_startup(ObParseInst *i)
     parse_register(i, "applications", parse_per_app_settings, NULL);
 }
 
     parse_register(i, "applications", parse_per_app_settings, NULL);
 }
 
-void config_shutdown()
+void config_shutdown(void)
 {
     GSList *it;
 
 {
     GSList *it;
 
@@ -820,6 +980,11 @@ void config_shutdown()
 
     g_free(config_title_layout);
 
 
     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);
     for (it = config_desktops_names; it; it = g_slist_next(it))
         g_free(it->data);
     g_slist_free(config_desktops_names);
@@ -830,9 +995,9 @@ void config_shutdown()
 
     for (it = config_per_app_settings; it; it = g_slist_next(it)) {
         ObAppSettings *itd = (ObAppSettings *)it->data;
 
     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);
+        if (itd->name)  g_pattern_spec_free(itd->name);
+        if (itd->role)  g_pattern_spec_free(itd->role);
+        if (itd->class) g_pattern_spec_free(itd->class);
         g_free(it->data);
     }
     g_slist_free(config_per_app_settings);
         g_free(it->data);
     }
     g_slist_free(config_per_app_settings);
This page took 0.049725 seconds and 4 git commands to generate.