*/
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) {
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;
}
void cmd_restart(I3_CMD) {
LOG("restarting i3\n");
ipc_shutdown();
+ unlink(config.ipc_socket_path);
/* We need to call this manually since atexit handlers don’t get called
* when exec()ing */
purge_zerobyte_logfile();
- /* The unlink call is intentionally after the purge_zerobyte_logfile() so
- * that the latter does not remove the directory yet. We need to store the
- * restart layout state in there. */
- unlink(config.ipc_socket_path);
i3_restart(false);
// XXX: default reply for now, make this a better reply
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);
}
/*