X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcommands.c;h=95dcb7bb5a2c28064986b1f6f19575a4e05c68ea;hb=294d52e0180ea81bd18606fa604486026855691a;hp=e46a996dcfc9e5313e94505aac0695fe4eba1cc3;hpb=d1e59a204eed49c4ee889b50000458ae6479354c;p=i3%2Fi3 diff --git a/src/commands.c b/src/commands.c index e46a996d..95dcb7bb 100644 --- a/src/commands.c +++ b/src/commands.c @@ -513,7 +513,27 @@ void cmd_move_con_to_workspace_name(I3_CMD, char *name) { LOG("should move window to workspace %s\n", name); /* get the workspace */ - Con *ws = workspace_get(name, NULL); + Con *ws = NULL; + Con *output = NULL; + + /* first look for a workspace with this name */ + TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { + GREP_FIRST(ws, output_get_content(output), !strcasecmp(child->name, name)); + } + + /* if the name is plain digits, we interpret this as a "workspace number" + * command */ + if (!ws && name_is_digits(name)) { + long parsed_num = ws_name_to_number(name); + TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { + GREP_FIRST(ws, output_get_content(output), + child->num == parsed_num); + } + } + + /* if no workspace was found, make a new one */ + if (!ws) + ws = workspace_get(name, NULL); ws = maybe_auto_back_and_forth_workspace(ws); @@ -879,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) { @@ -911,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; } @@ -1006,7 +1041,30 @@ void cmd_workspace_name(I3_CMD, char *name) { DLOG("should switch to workspace %s\n", name); if (maybe_back_and_forth(cmd_output, name)) return; - workspace_show_by_name(name); + + Con *ws = NULL; + Con *output = NULL; + + /* first look for a workspace with this name */ + TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { + GREP_FIRST(ws, output_get_content(output), !strcasecmp(child->name, name)); + } + + /* if the name is only digits, we interpret this as a "workspace number" + * command */ + if (!ws && name_is_digits(name)) { + long parsed_num = ws_name_to_number(name); + TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { + GREP_FIRST(ws, output_get_content(output), + child->num == parsed_num); + } + } + + /* if no workspace was found, make a new one */ + if (!ws) + ws = workspace_get(name, NULL); + + workspace_show(ws); cmd_output->needs_tree_render = true; // XXX: default reply for now, make this a better reply @@ -1688,13 +1746,10 @@ void cmd_reload(I3_CMD) { 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 @@ -1770,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); } /* @@ -1944,6 +2011,9 @@ void cmd_rename_workspace(I3_CMD, char *old_name, char *new_name) { ysuccess(true); ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"rename\"}"); + ewmh_update_desktop_names(); + ewmh_update_desktop_viewport(); + ewmh_update_current_desktop(); } /*