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);
}
}
}
- 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;
/* 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);
}
workspace_move_to_output(workspace, target_output);
- if (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_activate(previously_focused);
+ }
break;
}
- /* Restore the previous focus since con_attach messes with the focus. */
- con_activate(previously_focused);
-
cmd_output->needs_tree_render = true;
ysuccess(true);
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);
}