X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=restore.c;h=4a91c9cbb3e31b558c11be70457e465109819027;hb=73342774541bd1ac0bb930107092c9eac00e41c2;hp=e5b7bbd44beedb44eaf347d8505cd6e00fdfa220;hpb=8a1010b04f07849d065b04c300add9963c3f2f83;p=bspwm.git diff --git a/restore.c b/restore.c index e5b7bbd..4a91c9c 100644 --- 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 #include -#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); } }