Skip to content
This repository has been archived by the owner on Apr 18, 2023. It is now read-only.

Commit

Permalink
Workspace renaming: Interpret outputs as nondirectional
Browse files Browse the repository at this point in the history
Currently when renaming outputs, an output assignment of "left" will
cause the workspace to move left. Treat this assignment as a proper name
instead (even though it is unlikely an output will be named "left").

Move logic for determining output to move to out of
`workspace_move_to_output`

Add test for ignoring direcionality during rename.

Fixes #3208.
  • Loading branch information
ograff committed Apr 4, 2018
1 parent bc760c2 commit e4a184e
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 11 deletions.
2 changes: 1 addition & 1 deletion include/workspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,4 +207,4 @@ Con *workspace_encapsulate(Con *ws);
* This returns true if and only if moving the workspace was successful.
*
*/
bool workspace_move_to_output(Con *ws, const char *output);
bool workspace_move_to_output(Con *ws, Output *output);
23 changes: 21 additions & 2 deletions src/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -1128,7 +1128,21 @@ void cmd_move_workspace_to_output(I3_CMD, const char *name) {
continue;
}

bool success = workspace_move_to_output(ws, name);
Output *current_output = get_output_for_con(ws);
if (current_output == NULL) {
ELOG("Cannot get current output. This is a bug in i3.\n");
ysuccess(false);
return;
}

Output *target_output = get_output_from_string(current_output, name);
if (!target_output) {
ELOG("Could not get output from string \"%s\"\n", name);
ysuccess(false);
return;
}

bool success = workspace_move_to_output(ws, target_output);
if (!success) {
ELOG("Failed to move workspace to output.\n");
ysuccess(false);
Expand Down Expand Up @@ -1990,7 +2004,12 @@ void cmd_rename_workspace(I3_CMD, const char *old_name, const char *new_name) {
continue;
}

workspace_move_to_output(workspace, assignment->output);
Output *target_output = get_output_by_name(assignment->output, true);
if (!target_output) {
LOG("Could not get output named \"%s\"\n", assignment->output);
continue;
}
workspace_move_to_output(workspace, target_output);

if (previously_focused)
workspace_show(con_get_workspace(previously_focused));
Expand Down
10 changes: 2 additions & 8 deletions src/workspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -923,21 +923,15 @@ Con *workspace_encapsulate(Con *ws) {
* Move the given workspace to the specified output.
* This returns true if and only if moving the workspace was successful.
*/
bool workspace_move_to_output(Con *ws, const char *name) {
LOG("Trying to move workspace %p / %s to output \"%s\".\n", ws, ws->name, name);
bool workspace_move_to_output(Con *ws, Output *output) {
LOG("Trying to move workspace %p / %s to output %p / \"%s\".\n", ws, ws->name, output, output_primary_name(output));

Output *current_output = get_output_for_con(ws);
if (current_output == NULL) {
ELOG("Cannot get current output. This is a bug in i3.\n");
return false;
}

Output *output = get_output_from_string(current_output, name);
if (!output) {
ELOG("Could not get output from string \"%s\"\n", name);
return false;
}

Con *content = output_get_content(output->con);
LOG("got output %p with content %p\n", output, content);

Expand Down
12 changes: 12 additions & 0 deletions testcases/t/522-rename-assigned-workspace.t
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ workspace 1 output fake-0
workspace 2 output fake-1
workspace 3:foo output fake-1
workspace baz output fake-1
workspace 5 output left
EOT

my $i3 = i3(get_socket_path());
Expand Down Expand Up @@ -82,4 +83,15 @@ cmd 'rename workspace to baz';
is(get_output_for_workspace('baz'), 'fake-1',
'Renaming the workspace to a number and name should move it to the assigned output');

##########################################################################
# Renaming a workspace so that it is assigned a directional output does
# not move the workspace or crash
##########################################################################

cmd 'focus output fake-0';
cmd 'workspace bar';
cmd 'rename workspace to 5';
is(get_output_for_workspace('5'), 'fake-0',
'Renaming the workspace to a workspace assigned to a directional output should not move the workspace');

done_testing;

0 comments on commit e4a184e

Please sign in to comment.