return;
}
- /* 1: Ensure the window is floating. From now on, we deal with the
- * CT_FLOATING_CON. We use automatic == false because the user made the
- * choice that this window should be a scratchpad (and floating). */
- floating_enable(con, false);
- con = con->parent;
+ /* 1: Ensure the window or any parent is floating. From now on, we deal
+ * with the CT_FLOATING_CON. We use automatic == false because the user
+ * made the choice that this window should be a scratchpad (and floating).
+ */
+ Con *maybe_floating_con = con_inside_floating(con);
+ if (maybe_floating_con == NULL) {
+ floating_enable(con, false);
+ con = con->parent;
+ } else {
+ con = maybe_floating_con;
+ }
/* 2: Send the window to the __i3_scratch workspace, mainting its
* coordinates and not warping the pointer. */
/* 4: Fix focus. Normally, when moving a window to a different output, the
* destination output gets focused. In this case, we don’t want that. */
- con_focus(focus_next);
+ if (con_get_workspace(focus_next) == con_get_workspace(focused))
+ con_focus(focus_next);
}
/*
Con *__i3_scratch = workspace_get("__i3_scratch", NULL);
Con *floating;
+ /* If the current con or any of its parents are in fullscreen mode, we
+ * first need to disable it before showing the scratchpad con. */
+ Con *fs = focused;
+ while (fs && fs->fullscreen_mode == CF_NONE)
+ fs = fs->parent;
+
+ if (fs->type != CT_WORKSPACE) {
+ con_toggle_fullscreen(focused, CF_OUTPUT);
+ }
+
+ /* If this was 'scratchpad show' without criteria, we check if there is a
+ * visible scratchpad window on another workspace. In this case we move it
+ * to the current workspace. */
+ Con *walk_con;
+ Con *focused_ws = con_get_workspace(focused);
+ TAILQ_FOREACH(walk_con, &all_cons, all_cons) {
+ Con *walk_ws = con_get_workspace(walk_con);
+ if (walk_ws &&
+ !con_is_internal(walk_ws) && focused_ws != walk_ws &&
+ (floating = con_inside_floating(walk_con)) &&
+ floating->scratchpad_state != SCRATCHPAD_NONE) {
+ DLOG("Found a visible scratchpad window on another workspace,\n");
+ DLOG("moving it to this workspace: con = %p\n", walk_con);
+ con_move_to_workspace(walk_con, focused_ws, true, false);
+ return;
+ }
+ }
+
/* If this was 'scratchpad show' without criteria, we check if the
* currently focused window is a scratchpad window and should be hidden
* again. */