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;
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);
}
/*
/* 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);
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);
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);
}