fixes #776
this implements both the "move container to workspace back_and_forth" command and movements to the same workspace when auto_back_and_forth is set. it includes documentation and test suite additions by michael. it also simplifies the workspace_show_by_name function (making use of workspace_get accepting NULL pointers).
This commit is contained in:
committed by
Michael Stapelberg
parent
a01bac13fe
commit
e15e37f922
@ -99,6 +99,29 @@ static bool maybe_back_and_forth(struct CommandResult *cmd_output, char *name) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the passed workspace unless it is the current one and auto back and
|
||||
* forth is enabled, in which case the back_and_forth workspace is returned.
|
||||
*/
|
||||
static Con *maybe_auto_back_and_forth_workspace(Con *workspace) {
|
||||
Con *current, *baf;
|
||||
|
||||
if (!config.workspace_auto_back_and_forth)
|
||||
return workspace;
|
||||
|
||||
current = con_get_workspace(focused);
|
||||
|
||||
if (current == workspace) {
|
||||
baf = workspace_back_and_forth_get();
|
||||
if (baf != NULL) {
|
||||
DLOG("Substituting workspace with back_and_forth, as it is focused.\n");
|
||||
return baf;
|
||||
}
|
||||
}
|
||||
|
||||
return workspace;
|
||||
}
|
||||
|
||||
// This code is commented out because we might recycle it for popping up error
|
||||
// messages on parser errors.
|
||||
#if 0
|
||||
@ -400,6 +423,38 @@ void cmd_move_con_to_workspace(I3_CMD, char *which) {
|
||||
ysuccess(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of 'move [window|container] [to] workspace back_and_forth'.
|
||||
*
|
||||
*/
|
||||
void cmd_move_con_to_workspace_back_and_forth(I3_CMD) {
|
||||
owindow *current;
|
||||
Con *ws;
|
||||
|
||||
ws = workspace_back_and_forth_get();
|
||||
|
||||
if (ws == NULL) {
|
||||
y(map_open);
|
||||
ystr("success");
|
||||
y(bool, false);
|
||||
ystr("error");
|
||||
ystr("No workspace was previously active.");
|
||||
y(map_close);
|
||||
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);
|
||||
}
|
||||
|
||||
cmd_output->needs_tree_render = true;
|
||||
// XXX: default reply for now, make this a better reply
|
||||
ysuccess(true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Implementation of 'move [window|container] [to] workspace <name>'.
|
||||
*
|
||||
@ -432,6 +487,8 @@ void cmd_move_con_to_workspace_name(I3_CMD, char *name) {
|
||||
/* get the workspace */
|
||||
Con *ws = workspace_get(name, NULL);
|
||||
|
||||
ws = maybe_auto_back_and_forth_workspace(ws);
|
||||
|
||||
HANDLE_EMPTY_MATCH;
|
||||
|
||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||
@ -489,6 +546,8 @@ void cmd_move_con_to_workspace_number(I3_CMD, char *which) {
|
||||
workspace = workspace_get(which, NULL);
|
||||
}
|
||||
|
||||
workspace = maybe_auto_back_and_forth_workspace(workspace);
|
||||
|
||||
HANDLE_EMPTY_MATCH;
|
||||
|
||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||
|
@ -392,8 +392,7 @@ void workspace_show(Con *workspace) {
|
||||
*/
|
||||
void workspace_show_by_name(const char *num) {
|
||||
Con *workspace;
|
||||
bool changed_num_workspaces;
|
||||
workspace = workspace_get(num, &changed_num_workspaces);
|
||||
workspace = workspace_get(num, NULL);
|
||||
_workspace_show(workspace);
|
||||
}
|
||||
|
||||
@ -664,6 +663,22 @@ void workspace_back_and_forth(void) {
|
||||
workspace_show_by_name(previous_workspace_name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the previously focused workspace con, or NULL if unavailable.
|
||||
*
|
||||
*/
|
||||
Con *workspace_back_and_forth_get(void) {
|
||||
if (!previous_workspace_name) {
|
||||
DLOG("no previous workspace name set.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Con *workspace;
|
||||
workspace = workspace_get(previous_workspace_name, NULL);
|
||||
|
||||
return workspace;
|
||||
}
|
||||
|
||||
static bool get_urgency_flag(Con *con) {
|
||||
Con *child;
|
||||
TAILQ_FOREACH(child, &(con->nodes_head), nodes)
|
||||
|
Reference in New Issue
Block a user