]> Dogcows Code - chaz/openbox/blobdiff - openbox/config.c
make the client list menu update properly and not crash
[chaz/openbox] / openbox / config.c
index 367fb2f9e9b3e335d0ae23ed87beb99fa40fb86a..480308be603b3277486e1487aff185374176fb56 100644 (file)
@@ -38,7 +38,6 @@ ObPlacePolicy config_place_policy;
 
 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;
 
@@ -78,7 +77,6 @@ guint config_keyboard_reset_state;
 gint config_mouse_threshold;
 gint config_mouse_dclicktime;
 
 gint config_mouse_threshold;
 gint config_mouse_dclicktime;
 
-gboolean config_menu_warppointer;
 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;
@@ -88,10 +86,57 @@ 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()
+{
+    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->center_x = src->center_x;
+        dst->center_y = src->center_y;
+        dst->position.x = src->position.x;
+        dst->position.y = src->position.y;
+        dst->monitor = src->monitor;
+    }
+}
+
 /*
   <applications>
     <application name="aterm">
 /*
   <applications>
     <application name="aterm">
@@ -102,28 +147,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)
 {
     xmlNodePtr app = parse_find_node("application", node->children);
 */
 static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
                                    xmlNodePtr node, gpointer d)
 {
     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;
 
@@ -134,125 +180,124 @@ 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);
-                        x_pos_given = TRUE;
+                if ((c = parse_find_node("x", n->children)))
+                    if (!parse_contains("default", doc, c)) {
+                        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);
                     }
                     }
-                    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);
-                        settings->pos_given = TRUE;
+                if (x_pos_given && (c = parse_find_node("y", n->children)))
+                    if (!parse_contains("default", doc, c)) {
+                        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);
+                            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 (!strcmp(s, "mouse"))
+                            settings->monitor = 0;
+                        else
+                            settings->monitor = parse_int(doc, c) + 1;
+                        g_free(s);
                     }
                     }
-                    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 (!strcmp(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 (!strcmp(s, "above"))
+                        settings->layer = 1;
+                    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)))
             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 (!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) settings);
 
             config_per_app_settings = g_slist_append(config_per_app_settings,
                                               (gpointer) settings);
@@ -260,6 +305,10 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
         
         app = parse_find_node("application", app->next);
     }
         
         app = parse_find_node("application", app->next);
     }
+
+    g_free(name);
+    g_free(class);
+    g_free(role);
 }
 
 /*
 }
 
 /*
@@ -449,13 +498,18 @@ 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("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);
 
     if ((n = parse_find_node("animateIconify", node)))
         config_animate_iconify = parse_bool(doc, n);
 
@@ -663,15 +717,13 @@ 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("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);
     }
 }
@@ -686,8 +738,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
@@ -732,7 +782,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" },
@@ -746,7 +796,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" },
@@ -812,7 +861,6 @@ void config_startup(ObParseInst *i)
     config_animate_iconify = TRUE;
     config_title_layout = g_strdup("NLIMC");
     config_theme_keepborder = TRUE;
     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_activewindow = NULL;
     config_font_inactivewindow = NULL;
@@ -865,11 +913,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_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;
@@ -906,9 +952,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.037731 seconds and 4 git commands to generate.