]> git.lizzy.rs Git - bspwm.git/blobdiff - restore.c
Implement private windows
[bspwm.git] / restore.c
index e5b7bbd44beedb44eaf347d8505cd6e00fdfa220..4a91c9cbb3e31b558c11be70457e465109819027 100644 (file)
--- a/restore.c
+++ b/restore.c
@@ -1,11 +1,39 @@
+/* * Copyright (c) 2012-2013 Bastien Dejean
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ *  * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #include <ctype.h>
 #include <string.h>
-#include "types.h"
-#include "tree.h"
-#include "settings.h"
-#include "ewmh.h"
 #include "bspwm.h"
+#include "desktop.h"
+#include "ewmh.h"
+#include "history.h"
+#include "monitor.h"
+#include "window.h"
 #include "query.h"
+#include "settings.h"
+#include "stack.h"
+#include "tree.h"
 #include "restore.h"
 
 void restore_tree(char *file_path)
@@ -51,30 +79,30 @@ void restore_tree(char *file_path)
             m->right_padding = right;
             m->bottom_padding = bottom;
             m->left_padding = left;
-            if (end == '#')
+            if (end != 0)
                 mon = m;
-            else if (end == '~')
-                last_mon = m;
-
         } else if (level == 2) {
             if (m == NULL)
                 continue;
+            int wg;
+            unsigned int tf, bw;
             char layout = 0, end = 0;
             name[0] = '\0';
             loc.desktop = NULL;
-            sscanf(line + level, "%s %c %c", name, &layout, &end);
+            sscanf(line + level, "%s %u %i %u %c %c", name, &bw, &wg, &tf, &layout, &end);
             locate_desktop(name, &loc);
             d = loc.desktop;
             if (d == NULL)
                 continue;
+            d->border_width = bw;
+            d->window_gap = wg;
+            d->tags_field = tf;
             if (layout == 'M')
                 d->layout = LAYOUT_MONOCLE;
             else if (layout == 'T')
                 d->layout = LAYOUT_TILED;
-            if (end == '@')
+            if (end != 0)
                 m->desk = d;
-            else if (end == '~')
-                m->last_desk = d;
 
         } else {
             if (m == NULL || d == NULL)
@@ -109,17 +137,30 @@ void restore_tree(char *file_path)
             } else {
                 client_t *c = make_client(XCB_NONE);
                 num_clients++;
-                char floating, transient, fullscreen, urgent, locked, split_mode, end = 0;
-                sscanf(line + level, "%c %s %X %u %hux%hu%hi%hi %c%c%c%c%c%c %c", &br, c->class_name, &c->window, &c->border_width, &c->floating_rectangle.width, &c->floating_rectangle.height, &c->floating_rectangle.x, &c->floating_rectangle.y, &floating, &transient, &fullscreen, &urgent, &locked, &split_mode, &end);
+                char floating, transient, fullscreen, urgent, locked, sticky, frame, private, sd, sm, end = 0;
+                sscanf(line + level, "%c %s %X %u %u %hux%hu%hi%hi %c %c%c%c%c%c%c%c%c%c %c", &br, c->class_name, &c->window, &c->tags_field, &c->border_width, &c->floating_rectangle.width, &c->floating_rectangle.height, &c->floating_rectangle.x, &c->floating_rectangle.y, &sd, &floating, &transient, &fullscreen, &urgent, &locked, &sticky, &frame, &private, &sm, &end);
                 c->floating = (floating == '-' ? false : true);
                 c->transient = (transient == '-' ? false : true);
                 c->fullscreen = (fullscreen == '-' ? false : true);
                 c->urgent = (urgent == '-' ? false : true);
                 c->locked = (locked == '-' ? false : true);
-                n->split_mode = (split_mode == '-' ? false : true);
+                c->sticky = (sticky == '-' ? false : true);
+                c->frame = (frame == '-' ? false : true);
+                c->private = (private == '-' ? false : true);
+                n->split_mode = (sm == '-' ? MODE_AUTOMATIC : MODE_MANUAL);
+                if (sd == 'U')
+                    n->split_dir = DIR_UP;
+                else if (sd == 'R')
+                    n->split_dir = DIR_RIGHT;
+                else if (sd == 'D')
+                    n->split_dir = DIR_DOWN;
+                else if (sd == 'L')
+                    n->split_dir = DIR_LEFT;
                 n->client = c;
-                if (end == '*')
+                if (end != 0)
                     d->focus = n;
+                if (c->sticky)
+                    m->num_sticky++;
             }
             if (br == 'a')
                 n->birth_rotation = 90;
@@ -136,12 +177,14 @@ void restore_tree(char *file_path)
     for (monitor_t *m = mon_head; m != NULL; m = m->next)
         for (desktop_t *d = m->desk_head; d != NULL; d = d->next)
             for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root)) {
-                uint32_t values[] = {(focus_follows_pointer ? CLIENT_EVENT_MASK_FFP : CLIENT_EVENT_MASK)};
+                uint32_t values[] = {get_event_mask(n->client)};
                 xcb_change_window_attributes(dpy, n->client->window, XCB_CW_EVENT_MASK, values);
-                if (n->client->floating) {
+                if (n->client->floating || !is_visible(d, n)) {
                     n->vacant = true;
                     update_vacant_state(n->parent);
                 }
+                if (n->client->private)
+                    update_privacy_level(n, true);
             }
     ewmh_update_current_desktop();
 }
@@ -153,34 +196,69 @@ void restore_history(char *file_path)
 
     FILE *snapshot = fopen(file_path, "r");
     if (snapshot == NULL) {
-        warn("Restore history: can't open file\n");
+        warn("Restore history: can't open '%s'.\n", file_path);
         return;
     }
 
     PUTS("restore history");
 
     char line[MAXLEN];
-    desktop_t *d = NULL;
-    unsigned int level;
+    char mnm[SMALEN];
+    char dnm[SMALEN];
+    xcb_window_t win;
 
     while (fgets(line, sizeof(line), snapshot) != NULL) {
-        unsigned int i = strlen(line) - 1;
-        while (i > 0 && isspace(line[i]))
-            line[i--] = '\0';
-        level = 0;
-        while (level < strlen(line) && isspace(line[level]))
-            level++;
-        if (level == 0) {
+        if (sscanf(line, "%s %s %X", mnm, dnm, &win) == 3) {
             coordinates_t loc;
-            if (locate_desktop(line + level, &loc))
-                d = loc.desktop;
-        } else if (d != NULL) {
-            xcb_window_t win;
-            if (sscanf(line + level, "%X", &win) == 1) {
-                coordinates_t loc;
-                if (locate_window(win, &loc))
-                    history_add(d->history, loc.node);
+            if (win != XCB_NONE && !locate_window(win, &loc)) {
+                warn("Can't locate window 0x%X.\n", win);
+                continue;
+            }
+            node_t *n = (win == XCB_NONE ? NULL : loc.node);
+            if (!locate_desktop(dnm, &loc)) {
+                warn("Can't locate desktop '%s'.\n", dnm);
+                continue;
             }
+            desktop_t *d = loc.desktop;
+            if (!locate_monitor(mnm, &loc)) {
+                warn("Can't locate monitor '%s'.\n", mnm);
+                continue;
+            }
+            monitor_t *m = loc.monitor;
+            history_add(m, d, n);
+        } else {
+            warn("Can't parse history entry: '%s'\n", line);
+        }
+    }
+
+    fclose(snapshot);
+}
+
+void restore_stack(char *file_path)
+{
+    if (file_path == NULL)
+        return;
+
+    FILE *snapshot = fopen(file_path, "r");
+    if (snapshot == NULL) {
+        warn("Restore stack: can't open '%s'.\n", file_path);
+        return;
+    }
+
+    PUTS("restore stack");
+
+    char line[MAXLEN];
+    xcb_window_t win;
+
+    while (fgets(line, sizeof(line), snapshot) != NULL) {
+        if (sscanf(line, "%X", &win) == 1) {
+            coordinates_t loc;
+            if (locate_window(win, &loc))
+                stack_insert_after(stack_tail, loc.node);
+            else
+                warn("Can't locate window 0x%X.\n", win);
+        } else {
+            warn("Can't parse stack entry: '%s'\n", line);
         }
     }