]> git.lizzy.rs Git - bspwm.git/blobdiff - restore.c
Transfer nodes moved via configure requests
[bspwm.git] / restore.c
index 58607afe2bafcdc988b8df33913d0f35be35ce86..b3b98b2dd9a647257c3db8e7c45faf7b290edc78 100644 (file)
--- a/restore.c
+++ b/restore.c
@@ -117,12 +117,12 @@ bool restore_tree(const char *file_path)
        for (int i = 0; i < num; i++) {
                if (keyeq("focusedMonitorName", t, json)) {
                        free(focusedMonitorName);
-                       focusedMonitorName = copy_string(t+1, json);
                        t++;
+                       focusedMonitorName = copy_string(json + t->start, t->end - t->start);
                } else if (keyeq("primaryMonitorName", t, json)) {
                        free(primaryMonitorName);
-                       primaryMonitorName = copy_string(t+1, json);
                        t++;
+                       primaryMonitorName = copy_string(json + t->start, t->end - t->start);
                } else if (keyeq("clientsCount", t, json)) {
                        t++;
                        sscanf(json + t->start, "%u", &clients_count);
@@ -132,6 +132,9 @@ bool restore_tree(const char *file_path)
                        t++;
                        for (int j = 0; j < s; j++) {
                                monitor_t *m = restore_monitor(&t, json);
+                               if (m->desk == NULL) {
+                                       add_desktop(m, make_desktop(NULL, XCB_NONE));
+                               }
                                add_monitor(m);
                        }
                        continue;
@@ -169,6 +172,9 @@ bool restore_tree(const char *file_path)
                        refresh_presel_feebacks_in(d->root, d, m);
                        restack_presel_feedback(d);
                        for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root)) {
+                               if (n->client == NULL) {
+                                       continue;
+                               }
                                uint32_t values[] = {CLIENT_EVENT_MASK | (focus_follows_pointer ? XCB_EVENT_MASK_ENTER_WINDOW : 0)};
                                xcb_change_window_attributes(dpy, n->id, XCB_CW_EVENT_MASK, values);
                        }
@@ -211,7 +217,7 @@ bool restore_tree(const char *file_path)
 #define RESTORE_ANY(k, p, f) \
        } else if (keyeq(#k, *t, json)) { \
                (*t)++; \
-               char *val = copy_string(*t, json); \
+               char *val = copy_string(json + (*t)->start, (*t)->end - (*t)->start); \
                f(val, p); \
                free(val);
 
@@ -221,7 +227,7 @@ monitor_t *restore_monitor(jsmntok_t **t, char *json)
 {
        int num = (*t)->size;
        (*t)++;
-       monitor_t *m = make_monitor(NULL);
+       monitor_t *m = make_monitor(NULL, UINT32_MAX);
        char *focusedDesktopName = NULL;
 
        for (int i = 0; i < num; i++) {
@@ -229,12 +235,15 @@ monitor_t *restore_monitor(jsmntok_t **t, char *json)
                        (*t)++;
                        snprintf(m->name, (*t)->end - (*t)->start + 1, "%s", json + (*t)->start);
                RESTORE_UINT(id, &m->id)
+               RESTORE_UINT(randrId, &m->randr_id)
                RESTORE_BOOL(wired, &m->wired)
-               RESTORE_INT(topPadding, &m->top_padding)
-               RESTORE_INT(rightPadding, &m->right_padding)
-               RESTORE_INT(bottomPadding, &m->bottom_padding)
-               RESTORE_INT(leftPadding, &m->left_padding)
                RESTORE_UINT(stickyCount, &m->sticky_count)
+               RESTORE_INT(windowGap, &m->window_gap)
+               RESTORE_UINT(borderWidth, &m->border_width)
+               } else if (keyeq("padding", *t, json)) {
+                       (*t)++;
+                       restore_padding(&m->padding, t, json);
+                       continue;
                } else if (keyeq("rectangle", *t, json)) {
                        (*t)++;
                        restore_rectangle(&m->rectangle, t, json);
@@ -243,7 +252,7 @@ monitor_t *restore_monitor(jsmntok_t **t, char *json)
                } else if (keyeq("focusedDesktopName", *t, json)) {
                        free(focusedDesktopName);
                        (*t)++;
-                       focusedDesktopName = copy_string(*t, json);
+                       focusedDesktopName = copy_string(json + (*t)->start, (*t)->end - (*t)->start);
                } else if (keyeq("desktops", *t, json)) {
                        (*t)++;
                        int s = (*t)->size;
@@ -278,30 +287,24 @@ desktop_t *restore_desktop(jsmntok_t **t, char *json)
 {
        int s = (*t)->size;
        (*t)++;
-       desktop_t *d = make_desktop(NULL);
+       desktop_t *d = make_desktop(NULL, UINT32_MAX);
        xcb_window_t focusedNodeId = XCB_NONE;
 
        for (int i = 0; i < s; i++) {
                if (keyeq("name", *t, json)) {
                        (*t)++;
                        snprintf(d->name, (*t)->end - (*t)->start + 1, "%s", json + (*t)->start);
-               } else if (keyeq("layout", *t, json)) {
-                       (*t)++;
-                       char *val = copy_string(*t, json);
-                       layout_t lyt;
-                       if (parse_layout(val, &lyt)) {
-                               d->layout = lyt;
-                       }
-                       free(val);
-               RESTORE_INT(topPadding, &d->top_padding)
-               RESTORE_INT(rightPadding, &d->right_padding)
-               RESTORE_INT(bottomPadding, &d->bottom_padding)
-               RESTORE_INT(leftPadding, &d->left_padding)
+               RESTORE_UINT(id, &d->id)
+               RESTORE_ANY(layout, &d->layout, parse_layout)
                RESTORE_INT(windowGap, &d->window_gap)
                RESTORE_UINT(borderWidth, &d->border_width)
                } else if (keyeq("focusedNodeId", *t, json)) {
                        (*t)++;
                        sscanf(json + (*t)->start, "%u", &focusedNodeId);
+               } else if (keyeq("padding", *t, json)) {
+                       (*t)++;
+                       restore_padding(&d->padding, t, json);
+                       continue;
                } else if (keyeq("root", *t, json)) {
                        (*t)++;
                        d->root = restore_node(t, json);
@@ -338,10 +341,10 @@ node_t *restore_node(jsmntok_t **t, char *json)
                        RESTORE_ANY(splitType, &n->split_type, parse_split_type)
                        RESTORE_DOUBLE(splitRatio, &n->split_ratio)
                        RESTORE_INT(birthRotation, &n->birth_rotation)
-                       RESTORE_ANY(vacant, &n->vacant, parse_bool)
-                       RESTORE_ANY(sticky, &n->sticky, parse_bool)
-                       RESTORE_ANY(private, &n->private, parse_bool)
-                       RESTORE_ANY(locked, &n->locked, parse_bool)
+                       RESTORE_BOOL(vacant, &n->vacant)
+                       RESTORE_BOOL(sticky, &n->sticky)
+                       RESTORE_BOOL(private, &n->private)
+                       RESTORE_BOOL(locked, &n->locked)
                        } else if (keyeq("presel", *t, json)) {
                                (*t)++;
                                n->presel = restore_presel(t, json);
@@ -429,6 +432,7 @@ client_t *restore_client(jsmntok_t **t, char *json)
                        RESTORE_ANY(lastLayer, &c->last_layer, parse_stack_layer)
                        RESTORE_UINT(borderWidth, &c->border_width)
                        RESTORE_BOOL(urgent, &c->urgent)
+                       RESTORE_BOOL(visible, &c->visible)
                        RESTORE_BOOL(icccmFocus, &c->icccm_focus)
                        RESTORE_BOOL(icccmInput, &c->icccm_input)
                        RESTORE_USINT(minWidth, &c->min_width)
@@ -483,6 +487,29 @@ void restore_rectangle(xcb_rectangle_t *r, jsmntok_t **t, char *json)
        }
 }
 
+void restore_padding(padding_t *p, jsmntok_t **t, char *json)
+{
+       int s = (*t)->size;
+       (*t)++;
+
+       for (int i = 0; i < s; i++) {
+               if (keyeq("top", *t, json)) {
+                       (*t)++;
+                       sscanf(json + (*t)->start, "%i", &p->top);
+               } else if (keyeq("right", *t, json)) {
+                       (*t)++;
+                       sscanf(json + (*t)->start, "%i", &p->right);
+               } else if (keyeq("bottom", *t, json)) {
+                       (*t)++;
+                       sscanf(json + (*t)->start, "%i", &p->bottom);
+               } else if (keyeq("left", *t, json)) {
+                       (*t)++;
+                       sscanf(json + (*t)->start, "%i", &p->left);
+               }
+               (*t)++;
+       }
+}
+
 void restore_history(jsmntok_t **t, char *json)
 {
        int s = (*t)->size;
@@ -505,12 +532,12 @@ void restore_coordinates(coordinates_t *loc, jsmntok_t **t, char *json)
        for (int i = 0; i < s; i++) {
                if (keyeq("monitorName", *t, json)) {
                        (*t)++;
-                       char *name = copy_string(*t, json);
+                       char *name = copy_string(json + (*t)->start, (*t)->end - (*t)->start);
                        loc->monitor = find_monitor(name);
                        free(name);
                } else if (keyeq("desktopName", *t, json)) {
                        (*t)++;
-                       char *name = copy_string(*t, json);
+                       char *name = copy_string(json + (*t)->start, (*t)->end - (*t)->start);
                        loc->desktop = find_desktop_in(name, loc->monitor);
                        free(name);
                } else if (keyeq("nodeId", *t, json)) {
@@ -562,16 +589,3 @@ bool keyeq(char *s, jsmntok_t *key, char *json)
        size_t n = key->end - key->start;
        return (strlen(s) == n && strncmp(s, json + key->start, n) == 0);
 }
-
-char *copy_string(jsmntok_t *tok, char *json)
-{
-       size_t len = tok->end - tok->start + 1;
-       char *res = malloc(len * sizeof(char));
-       if (res == NULL) {
-               perror("Copy string: malloc");
-               return NULL;
-       }
-       strncpy(res, json+tok->start, len-1);
-       res[len-1] = '\0';
-       return res;
-}