match_parse_property(current_match, ctype, cvalue);
}
+static void move_matches_to_workspace(Con *ws) {
+ owindow *current;
+ TAILQ_FOREACH(current, &owindows, owindows) {
+ DLOG("matching: %p / %s\n", current->con, current->con->name);
+ con_move_to_workspace(current->con, ws, true, false, false);
+ }
+}
+
/*
* Implementation of 'move [window|container] [to] workspace
* next|prev|next_on_output|prev_on_output|current'.
*
*/
void cmd_move_con_to_workspace(I3_CMD, const char *which) {
- owindow *current;
-
DLOG("which=%s\n", which);
/* We have nothing to move:
return;
}
- TAILQ_FOREACH(current, &owindows, owindows) {
- DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false, false);
- }
+ move_matches_to_workspace(ws);
cmd_output->needs_tree_render = true;
// XXX: default reply for now, make this a better reply
*
*/
void cmd_move_con_to_workspace_back_and_forth(I3_CMD) {
- owindow *current;
- Con *ws;
-
- ws = workspace_back_and_forth_get();
-
+ Con *ws = workspace_back_and_forth_get();
if (ws == NULL) {
yerror("No workspace was previously active.");
return;
HANDLE_EMPTY_MATCH;
- TAILQ_FOREACH(current, &owindows, owindows) {
- DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false, false);
- }
+ move_matches_to_workspace(ws);
cmd_output->needs_tree_render = true;
// XXX: default reply for now, make this a better reply
}
const bool no_auto_back_and_forth = (_no_auto_back_and_forth != NULL);
- owindow *current;
/* We have nothing to move:
* when criteria was specified but didn't match any window or
HANDLE_EMPTY_MATCH;
- TAILQ_FOREACH(current, &owindows, owindows) {
- DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, ws, true, false, false);
- }
+ move_matches_to_workspace(ws);
cmd_output->needs_tree_render = true;
// XXX: default reply for now, make this a better reply
*/
void cmd_move_con_to_workspace_number(I3_CMD, const char *which, const char *_no_auto_back_and_forth) {
const bool no_auto_back_and_forth = (_no_auto_back_and_forth != NULL);
- owindow *current;
/* We have nothing to move:
* when criteria was specified but didn't match any window or
HANDLE_EMPTY_MATCH;
- TAILQ_FOREACH(current, &owindows, owindows) {
- DLOG("matching: %p / %s\n", current->con, current->con->name);
- con_move_to_workspace(current->con, workspace, true, false, false);
- }
+ move_matches_to_workspace(workspace);
cmd_output->needs_tree_render = true;
// XXX: default reply for now, make this a better reply
owindow *current;
TAILQ_FOREACH(current, &owindows, owindows) {
Con *ws = con_get_workspace(current->con);
+ if (con_is_internal(ws)) {
+ continue;
+ }
+
bool success = workspace_move_to_output(ws, name);
if (!success) {
ELOG("Failed to move workspace to output.\n");
ysuccess(true);
}
+/*
+ * Focus a container and disable any other fullscreen container not permitting the focus.
+ *
+ */
+static void cmd_focus_force_focus(Con *con) {
+ /* Disable fullscreen container in workspace with container to be focused. */
+ Con *ws = con_get_workspace(con);
+ Con *fullscreen_on_ws = (focused && focused->fullscreen_mode == CF_GLOBAL) ? focused : con_get_fullscreen_con(ws, CF_OUTPUT);
+ if (fullscreen_on_ws && fullscreen_on_ws != con && !con_has_parent(con, fullscreen_on_ws)) {
+ con_disable_fullscreen(fullscreen_on_ws);
+ }
+ con_focus(con);
+}
+
/*
* Implementation of 'focus tiling|floating|mode_toggle'.
*
void cmd_focus_window_mode(I3_CMD, const char *window_mode) {
DLOG("window_mode = %s\n", window_mode);
+ bool to_floating = false;
+ if (strcmp(window_mode, "mode_toggle") == 0) {
+ to_floating = !con_inside_floating(focused);
+ } else if (strcmp(window_mode, "floating") == 0) {
+ to_floating = true;
+ } else if (strcmp(window_mode, "tiling") == 0) {
+ to_floating = false;
+ }
+
Con *ws = con_get_workspace(focused);
- if (ws != NULL) {
- if (strcmp(window_mode, "mode_toggle") == 0) {
- if (con_inside_floating(focused))
- window_mode = "tiling";
- else
- window_mode = "floating";
- }
- Con *current;
- TAILQ_FOREACH(current, &(ws->focus_head), focused) {
- if ((strcmp(window_mode, "floating") == 0 && current->type != CT_FLOATING_CON) ||
- (strcmp(window_mode, "tiling") == 0 && current->type == CT_FLOATING_CON))
- continue;
+ Con *current;
+ bool success = false;
+ TAILQ_FOREACH(current, &(ws->focus_head), focused) {
+ if ((to_floating && current->type != CT_FLOATING_CON) ||
+ (!to_floating && current->type == CT_FLOATING_CON))
+ continue;
- con_focus(con_descend_focused(current));
- break;
- }
+ cmd_focus_force_focus(con_descend_focused(current));
+ success = true;
+ break;
}
- cmd_output->needs_tree_render = true;
- // XXX: default reply for now, make this a better reply
- ysuccess(true);
+ if (success) {
+ cmd_output->needs_tree_render = true;
+ ysuccess(true);
+ } else {
+ yerror("Failed to find a %s container in workspace.", to_floating ? "floating" : "tiling");
+ }
}
/*
if (!ws)
continue;
- /* Check the fullscreen focus constraints. */
- if (!con_fullscreen_permits_focusing(current->con)) {
- LOG("Cannot change focus while in fullscreen mode (fullscreen rules).\n");
- ysuccess(false);
- return;
- }
-
/* In case this is a scratchpad window, call scratchpad_show(). */
if (ws == __i3_scratch) {
scratchpad_show(current->con);
* So we focus 'current' to make it the currently focused window of
* the target workspace, then revert focus. */
Con *currently_focused = focused;
- con_focus(current->con);
+ cmd_focus_force_focus(current->con);
con_focus(currently_focused);
/* Now switch to the workspace, then focus */