1 /* * Copyright (c) 2012-2013 Bastien Dejean
4 * Redistribution and use in source and binary forms, with or without modification,
5 * are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation and/or
11 * other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
17 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 void restore_tree(char *file_path)
41 if (file_path == NULL)
44 FILE *snapshot = fopen(file_path, "r");
45 if (snapshot == NULL) {
46 warn("Restore tree: can't open file\n");
59 unsigned int level, last_level = 0;
61 while (fgets(line, sizeof(line), snapshot) != NULL) {
62 unsigned int len = strlen(line);
65 while (level < len && isspace(line[level]))
69 int x, y, left, right, top, bottom;
73 sscanf(line + level, "%s %ux%u%i%i %i,%i,%i,%i %c", name, &w, &h, &x, &y, &top, &right, &bottom, &left, &end);
74 m = find_monitor(name);
77 m->rectangle = (xcb_rectangle_t) {x, y, w, h};
79 m->right_padding = right;
80 m->bottom_padding = bottom;
81 m->left_padding = left;
84 } else if (level == 2) {
89 char layout = 0, end = 0;
92 sscanf(line + level, "%s %u %i %u %c %c", name, &bw, &wg, &tf, &layout, &end);
93 locate_desktop(name, &loc);
101 d->layout = LAYOUT_MONOCLE;
102 else if (layout == 'T')
103 d->layout = LAYOUT_TILED;
108 if (m == NULL || d == NULL)
110 node_t *birth = make_node();
114 } else if (n != NULL) {
115 if (level > last_level) {
116 n->first_child = birth;
120 } while (n != NULL && n->second_child != NULL);
123 n->second_child = birth;
130 if (isupper(line[level])) {
132 sscanf(line + level, "%c %c %lf", &st, &br, &n->split_ratio);
134 n->split_type = TYPE_HORIZONTAL;
136 n->split_type = TYPE_VERTICAL;
138 client_t *c = make_client(XCB_NONE);
140 char floating, transient, fullscreen, urgent, locked, sticky, frame, private, sd, sm, end = 0;
141 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);
142 c->floating = (floating == '-' ? false : true);
143 c->transient = (transient == '-' ? false : true);
144 c->fullscreen = (fullscreen == '-' ? false : true);
145 c->urgent = (urgent == '-' ? false : true);
146 c->locked = (locked == '-' ? false : true);
147 c->sticky = (sticky == '-' ? false : true);
148 c->frame = (frame == '-' ? false : true);
149 c->private = (private == '-' ? false : true);
150 n->split_mode = (sm == '-' ? MODE_AUTOMATIC : MODE_MANUAL);
152 n->split_dir = DIR_UP;
154 n->split_dir = DIR_RIGHT;
156 n->split_dir = DIR_DOWN;
158 n->split_dir = DIR_LEFT;
166 n->birth_rotation = 90;
168 n->birth_rotation = 270;
170 n->birth_rotation = 0;
177 for (monitor_t *m = mon_head; m != NULL; m = m->next)
178 for (desktop_t *d = m->desk_head; d != NULL; d = d->next)
179 for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root)) {
180 uint32_t values[] = {get_event_mask(n->client)};
181 xcb_change_window_attributes(dpy, n->client->window, XCB_CW_EVENT_MASK, values);
182 if (n->client->floating || !is_visible(d, n)) {
184 update_vacant_state(n->parent);
186 if (n->client->private)
187 update_privacy_level(n, true);
189 ewmh_update_current_desktop();
192 void restore_history(char *file_path)
194 if (file_path == NULL)
197 FILE *snapshot = fopen(file_path, "r");
198 if (snapshot == NULL) {
199 warn("Restore history: can't open '%s'.\n", file_path);
203 PUTS("restore history");
210 while (fgets(line, sizeof(line), snapshot) != NULL) {
211 if (sscanf(line, "%s %s %X", mnm, dnm, &win) == 3) {
213 if (win != XCB_NONE && !locate_window(win, &loc)) {
214 warn("Can't locate window 0x%X.\n", win);
217 node_t *n = (win == XCB_NONE ? NULL : loc.node);
218 if (!locate_desktop(dnm, &loc)) {
219 warn("Can't locate desktop '%s'.\n", dnm);
222 desktop_t *d = loc.desktop;
223 if (!locate_monitor(mnm, &loc)) {
224 warn("Can't locate monitor '%s'.\n", mnm);
227 monitor_t *m = loc.monitor;
228 history_add(m, d, n);
230 warn("Can't parse history entry: '%s'\n", line);
237 void restore_stack(char *file_path)
239 if (file_path == NULL)
242 FILE *snapshot = fopen(file_path, "r");
243 if (snapshot == NULL) {
244 warn("Restore stack: can't open '%s'.\n", file_path);
248 PUTS("restore stack");
253 while (fgets(line, sizeof(line), snapshot) != NULL) {
254 if (sscanf(line, "%X", &win) == 1) {
256 if (locate_window(win, &loc))
257 stack_insert_after(stack_tail, loc.node);
259 warn("Can't locate window 0x%X.\n", win);
261 warn("Can't parse stack entry: '%s'\n", line);