X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcommands.c;h=95dcb7bb5a2c28064986b1f6f19575a4e05c68ea;hb=bf1d0c9335cb2bf893b9b08daf8fd69f52b5bce2;hp=7803c984c209b55794721f8048d18853ea8ca50c;hpb=01a2c5a3f16be97f1afe9cb40d802c4f8deed86c;p=i3%2Fi3 diff --git a/src/commands.c b/src/commands.c index 7803c984..95dcb7bb 100644 --- a/src/commands.c +++ b/src/commands.c @@ -899,15 +899,27 @@ void cmd_nop(I3_CMD, char *comment) { */ void cmd_append_layout(I3_CMD, char *path) { LOG("Appending layout \"%s\"\n", path); + + json_content_t content = json_determine_content(path); + LOG("JSON content = %d\n", content); + if (content == JSON_CONTENT_UNKNOWN) { + ELOG("Could not determine the contents of \"%s\", not loading.\n", path); + ysuccess(false); + return; + } + Con *parent = focused; - /* We need to append the layout to a split container, since a leaf - * container must not have any children (by definition). - * Note that we explicitly check for workspaces, since they are okay for - * this purpose, but con_accepts_window() returns false for workspaces. */ - while (parent->type != CT_WORKSPACE && !con_accepts_window(parent)) - parent = parent->parent; - DLOG("Appending to parent=%p instead of focused=%p\n", - parent, focused); + if (content == JSON_CONTENT_WORKSPACE) { + parent = output_get_content(con_get_output(parent)); + } else { + /* We need to append the layout to a split container, since a leaf + * container must not have any children (by definition). + * Note that we explicitly check for workspaces, since they are okay for + * this purpose, but con_accepts_window() returns false for workspaces. */ + while (parent->type != CT_WORKSPACE && !con_accepts_window(parent)) + parent = parent->parent; + } + DLOG("Appending to parent=%p instead of focused=%p\n", parent, focused); char *errormsg = NULL; tree_append_json(parent, path, &errormsg); if (errormsg != NULL) { @@ -931,6 +943,9 @@ void cmd_append_layout(I3_CMD, char *path) { restore_open_placeholder_windows(parent); + if (content == JSON_CONTENT_WORKSPACE) + ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"restored\"}"); + cmd_output->needs_tree_render = true; } @@ -1810,34 +1825,46 @@ void cmd_focus_output(I3_CMD, char *name) { void cmd_move_window_to_position(I3_CMD, char *method, char *cx, char *cy) { int x = atoi(cx); int y = atoi(cy); + bool has_error = false; - if (!con_is_floating(focused)) { - ELOG("Cannot change position. The window/container is not floating\n"); - yerror("Cannot change position. The window/container is not floating."); - return; - } + owindow *current; + HANDLE_EMPTY_MATCH; - if (strcmp(method, "absolute") == 0) { - focused->parent->rect.x = x; - focused->parent->rect.y = y; + TAILQ_FOREACH(current, &owindows, owindows) { + if (!con_is_floating(current->con)) { + ELOG("Cannot change position. The window/container is not floating\n"); - DLOG("moving to absolute position %d %d\n", x, y); - floating_maybe_reassign_ws(focused->parent); - cmd_output->needs_tree_render = true; - } + if (!has_error) { + yerror("Cannot change position of a window/container because it is not floating."); + has_error = true; + } - if (strcmp(method, "position") == 0) { - Rect newrect = focused->parent->rect; + continue; + } - DLOG("moving to position %d %d\n", x, y); - newrect.x = x; - newrect.y = y; + if (strcmp(method, "absolute") == 0) { + current->con->parent->rect.x = x; + current->con->parent->rect.y = y; - floating_reposition(focused->parent, newrect); + DLOG("moving to absolute position %d %d\n", x, y); + floating_maybe_reassign_ws(current->con->parent); + cmd_output->needs_tree_render = true; + } + + if (strcmp(method, "position") == 0) { + Rect newrect = current->con->parent->rect; + + DLOG("moving to position %d %d\n", x, y); + newrect.x = x; + newrect.y = y; + + floating_reposition(current->con->parent, newrect); + } } // XXX: default reply for now, make this a better reply - ysuccess(true); + if (!has_error) + ysuccess(true); } /*