]> Dogcows Code - chaz/openbox/commitdiff
add the rest of the possible states to per app settings, and fix some mem leaks in...
authorMikael Magnusson <mikachu@comhem.se>
Fri, 9 Jun 2006 14:14:17 +0000 (14:14 +0000)
committerMikael Magnusson <mikachu@comhem.se>
Fri, 9 Jun 2006 14:14:17 +0000 (14:14 +0000)
openbox/client.c
openbox/client.h
openbox/config.c

index cfcc7da22c4241e28d31835717509dd907fba3de..a8db51d3eca3cc0a760759f79d53fbc16b3a5be2 100644 (file)
@@ -215,7 +215,10 @@ static ObAppSettings *get_settings(ObClient *client)
         
         if (!strcmp(app->name, client->name)) {
             ob_debug("Window matching: %s\n", app->name);
-            if (!app->role || !strcmp(app->role, client->role))
+            /* Match if no role was specified in the per app setting, or if the string
+             * matches the beginning of the role, since apps like to set the role to
+             * things like browser-window-23c4b2f */
+            if (!app->role || !strncmp(app->role, client->role, strlen(app->role)))
                 return app;
         }
 
@@ -317,16 +320,41 @@ void client_manage(Window window)
     settings = get_settings(self);
 
     if (settings) {
-        if (settings->shade && !settings->decor)
-            settings->decor = TRUE;
-        
-        client_shade(self, settings->shade);
-        client_set_undecorated(self, !settings->decor);
-        
-        if (settings->desktop != -1)
+        /* Don't worry, we won't actually both shade and undecorate the
+         * window when push comes to shove. */
+        if (settings->shade != -1)
+            client_shade(self, settings->shade);
+        if (settings->decor != -1)
+            client_set_undecorated(self, !settings->decor);
+        if (settings->iconic != -1)
+            client_iconify(self, settings->iconic);
+        if (settings->skip_pager != -1)
+            client->skip_pager = !!settings->skip_pager;
+        if (settings->skip_taskbar != -1)
+            client->skip_taskbar = !!settings->skip_taskbar;
+
+        /* 1 && -1 shouldn't be possible by the code in config.c */
+        if (settings->max_vert == 1 && self->max_horz == 1)
+            client_maximize(self, TRUE, 0, TRUE);
+        else if (settings->max_vert == 0 && self->max_horz == 0)
+            client_maximize(self, FALSE, 0, TRUE);
+        else if (settings->max_vert == 1 && self->max_horz == 0) {
+            client_maximize(self, TRUE, 2, TRUE);
+            client_maximize(self, FALSE, 1, TRUE);
+        } else if (settings->max_vert == 0 && self->max_horz == 1) {
+            client_maximize(self, TRUE, 1, TRUE);
+            client_maximize(self, FALSE, 2, TRUE);
+        }
+
+        if (settings->fullscreen != -1)
+            client_fullscreen(self, !!settings->fullscreen, TRUE);
+
+        if (settings->desktop < screen_num_desktops)
             client_set_desktop(self, settings->desktop, FALSE);
 
-        client_set_layer(self, settings->layer);
+        if (settings->layer > -2 && settings->layer < 2)
+            client_set_layer(self, settings->layer);
+
     }
 
     stacking_add(CLIENT_AS_WINDOW(self));
@@ -335,7 +363,7 @@ void client_manage(Window window)
     /* focus the new window? */
     if (ob_state() != OB_STATE_STARTING &&
         (config_focus_new || client_search_focus_parent(self)) ||
-        (settings && settings->focus) &&
+        (settings && settings->focus == TRUE) &&
         /* note the check against Type_Normal/Dialog, not client_normal(self),
            which would also include other types. in this case we want more
            strict rules for focus */
index ab1c830cdc0092ae988328773f50e8cedd04d3a5..a75c6d2b074c0d0b1a94b100aa368ac8b5a8116c 100644 (file)
@@ -274,9 +274,6 @@ struct _ObAppSettings
 {
     gchar *name;
     gchar *role;
-    gboolean decor;
-    gboolean shade;
-    gboolean focus;
 
     Point position;
     gboolean center_x;
@@ -284,9 +281,18 @@ struct _ObAppSettings
     gboolean pos_given;
 
     guint desktop;
-    guint head;
-
-    guint layer;
+    gint shade;
+    gint decor;
+    gint focus;
+    gint head;
+    gint iconic;
+    gint skip_pager;
+    gint skip_taskbar;
+    gint max_horz;
+    gint max_vert;
+    gint fullscreen;
+
+    gint layer;
 };
 
 extern GList *client_list;
index 5b669685f334f4fff8c3f4bd2e2d77e59915cf8a..aa903a2adde55d4db910042e1db5fe24b533b3bf 100644 (file)
@@ -103,8 +103,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
@@ -127,10 +125,11 @@ static void parse_per_app_settings(ObParseInst *i, xmlDocPtr doc,
             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);
 
@@ -138,48 +137,97 @@ 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")) {
+                    str *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")) {
+                    str *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);
                 }
             }
 
+            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))) {
+                str *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"))
+                str *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"))
+                str *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))) {
+                str *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,
This page took 0.037255 seconds and 4 git commands to generate.