X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcommands.c;h=ad7d9770b7193c69c296fccc79650b577a2f925e;hb=b3e69ed12a5c62b74501b9f375ddf742fb9fb44c;hp=e023cd8f8632dc1ad8bf1d3eeb3950b419f07657;hpb=4b95e2c1e070c19a32490b78ec4e97b96dc5ba79;p=i3%2Fi3 diff --git a/src/commands.c b/src/commands.c index e023cd8f..ad7d9770 100644 --- a/src/commands.c +++ b/src/commands.c @@ -644,12 +644,12 @@ void cmd_resize_set(I3_CMD, long cwidth, const char *mode_width, long cheight, c if ((floating_con = con_inside_floating(current->con))) { Con *output = con_get_output(floating_con); if (cwidth == 0) { - cwidth = output->rect.width; + cwidth = floating_con->rect.width; } else if (mode_width && strcmp(mode_width, "ppt") == 0) { cwidth = output->rect.width * ((double)cwidth / 100.0); } if (cheight == 0) { - cheight = output->rect.height; + cheight = floating_con->rect.height; } else if (mode_height && strcmp(mode_height, "ppt") == 0) { cheight = output->rect.height * ((double)cheight / 100.0); } @@ -686,7 +686,7 @@ void cmd_resize_set(I3_CMD, long cwidth, const char *mode_width, long cheight, c } } - if (cheight > 0 && mode_width && strcmp(mode_width, "ppt") == 0) { + if (cheight > 0 && mode_height && strcmp(mode_height, "ppt") == 0) { /* get the appropriate current container (skip stacked/tabbed cons) */ Con *target = current->con; Con *dummy; @@ -1833,19 +1833,20 @@ void cmd_move_scratchpad(I3_CMD) { void cmd_scratchpad_show(I3_CMD) { DLOG("should show scratchpad window\n"); owindow *current; + bool result = false; if (match_is_empty(current_match)) { - scratchpad_show(NULL); + result = scratchpad_show(NULL); } else { TAILQ_FOREACH(current, &owindows, owindows) { DLOG("matching: %p / %s\n", current->con, current->con->name); - scratchpad_show(current->con); + result |= scratchpad_show(current->con); } } cmd_output->needs_tree_render = true; - // XXX: default reply for now, make this a better reply - ysuccess(true); + + ysuccess(result); } /* @@ -1999,6 +2000,7 @@ void cmd_rename_workspace(I3_CMD, const char *old_name, const char *new_name) { /* By re-attaching, the sort order will be correct afterwards. */ Con *previously_focused = focused; + Con *previously_focused_content = focused->type == CT_WORKSPACE ? focused->parent : NULL; Con *parent = workspace->parent; con_detach(workspace); con_attach(workspace, parent, false); @@ -2017,16 +2019,31 @@ void cmd_rename_workspace(I3_CMD, const char *old_name, const char *new_name) { LOG("Could not get output named \"%s\"\n", assignment->output); continue; } + if (!output_triggers_assignment(target_output, assignment)) { + continue; + } workspace_move_to_output(workspace, target_output); - if (previously_focused) - workspace_show(con_get_workspace(previously_focused)); - break; } - /* Restore the previous focus since con_attach messes with the focus. */ - con_activate(previously_focused); + bool can_restore_focus = previously_focused != NULL; + /* NB: If previously_focused is a workspace we can't work directly with it + * since it might have been cleaned up by workspace_show() already, + * depending on the focus order/number of other workspaces on the output. + * Instead, we loop through the available workspaces and only focus + * previously_focused if we still find it. */ + if (previously_focused_content) { + Con *workspace = NULL; + GREP_FIRST(workspace, previously_focused_content, child == previously_focused); + can_restore_focus &= (workspace != NULL); + } + + if (can_restore_focus) { + /* Restore the previous focus since con_attach messes with the focus. */ + workspace_show(con_get_workspace(previously_focused)); + con_focus(previously_focused); + } cmd_output->needs_tree_render = true; ysuccess(true); @@ -2163,21 +2180,22 @@ void cmd_shmlog(I3_CMD, const char *argument) { else if (!strcmp(argument, "off")) shmlog_size = 0; else { + long new_size = 0; + if (!parse_long(argument, &new_size, 0)) { + yerror("Failed to parse %s into a shmlog size.\n", argument); + return; + } /* If shm logging now, restart logging with the new size. */ if (shmlog_size > 0) { shmlog_size = 0; LOG("Restarting shm logging...\n"); init_logging(); } - shmlog_size = atoi(argument); - /* Make a weakly attempt at ensuring the argument is valid. */ - if (shmlog_size <= 0) - shmlog_size = default_shmlog_size; + shmlog_size = (int)new_size; } LOG("%s shm logging\n", shmlog_size > 0 ? "Enabling" : "Disabling"); init_logging(); update_shmlog_atom(); - // XXX: default reply for now, make this a better reply ysuccess(true); }