]> Dogcows Code - chaz/openbox/blobdiff - openbox/config.c
hopefully fix keyboard move and resize refusing to go outside the screen
[chaz/openbox] / openbox / config.c
index d7cfc9708af173fe730a79936fd6520c90a1f562..d986ac1b3111b57a82d90ca0ce924f653a5c3550 100644 (file)
@@ -22,7 +22,8 @@
 #include "mouse.h"
 #include "prop.h"
 #include "translate.h"
-#include "per_app_settings.h"
+#include "client.h"
+#include "screen.h"
 #include "parser/parse.h"
 #include "openbox.h"
 
@@ -71,14 +72,14 @@ 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;
@@ -103,8 +104,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
@@ -116,67 +115,138 @@ 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) {
-        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;
-            ObAppSetting *setting = g_new0(ObAppSetting, 1);
-            setting->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;
 
-            setting->decor = TRUE;
+            settings->decor = -1;
             if ((n = parse_find_node("decor", app->children)))
-                setting->decor = parse_bool(doc, n);
+                settings->decor = parse_bool(doc, n);
 
+            settings->shade = -1;
             if ((n = parse_find_node("shade", app->children)))
-                setting->shade = parse_bool(doc, n);
+                settings->shade = parse_bool(doc, n);
 
-            setting->position.x = setting->position.y = -1;
+            settings->position.x = settings->position.y = 0;
+            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")) {
-                        setting->center_x = TRUE;
+                    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;
                     }
-                    else
-                        setting->position.x = parse_int(doc, c);
+                    g_free(s);
                 }
 
-                if ((c = parse_find_node("y", n->children))) {
-                    if (!strcmp(parse_string(doc, c), "center")) {
-                        setting->center_y = TRUE;
+                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;
                     }
-                    else
-                        setting->position.y = parse_int(doc, c);
+                    g_free(s);
                 }
             }
 
+            settings->focus = -1;
             if ((n = parse_find_node("focus", app->children)))
-                setting->focus = parse_bool(doc, n);
+                settings->focus = parse_bool(doc, n);
 
-            if ((n = parse_find_node("desktop", app->children)))
-                setting->desktop = parse_int(doc, n);
-            else
-                setting->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"))
-                    setting->head = -1;
+                gchar *s = parse_string(doc, n);
+                if (!strcmp(s, "mouse"))
+                    settings->head = -1;
                 else
-                    setting->head = parse_int(doc, n);
+                    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"))
-                    setting->layer = 1;
-                else if (!strcmp(parse_string(doc, n), "below"))
-                    setting->layer = -1;
+                gchar *s = parse_string(doc, n);
+                if (!strcmp(s, "above"))
+                    settings->layer = 1;
+                else if (!strcmp(s, "below"))
+                    settings->layer = -1;
                 else
-                    setting->layer = 0;
+                    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);
@@ -526,6 +596,8 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr 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)))
@@ -723,6 +795,7 @@ void config_startup(ObParseInst *i)
     config_menu_warppointer = TRUE;
     config_menu_xorstyle = TRUE;
     config_menu_hide_delay = 250;
+    config_menu_middle = TRUE;
     config_submenu_show_delay = 0;
     config_menu_client_list_icons = TRUE;
     config_menu_files = NULL;
@@ -750,7 +823,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.028292 seconds and 4 git commands to generate.