From f606508bccac841925e8d669fe90595697fac8af Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 15 Aug 2015 16:03:45 -0400 Subject: [PATCH] Fix switching focus between outputs --- sway/container.c | 1 + sway/workspace.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/sway/container.c b/sway/container.c index 189f064b7..98941b2c2 100644 --- a/sway/container.c +++ b/sway/container.c @@ -157,6 +157,7 @@ swayc_t *destroy_output(swayc_t *output) { } swayc_t *destroy_workspace(swayc_t *workspace) { + //NOTE: This is called from elsewhere without checking children length //TODO move containers to other workspaces? //for now just dont delete if (workspace->children->length == 0) { diff --git a/sway/workspace.c b/sway/workspace.c index 9748c23f3..6f46dd6b4 100644 --- a/sway/workspace.c +++ b/sway/workspace.c @@ -94,7 +94,7 @@ swayc_t *workspace_find_by_name(const char* name) { } void workspace_switch(swayc_t *workspace) { - swayc_t *parent = workspace; + swayc_t *parent = workspace->parent; while (parent->type != C_OUTPUT) { parent = parent->parent; } @@ -111,11 +111,21 @@ void workspace_switch(swayc_t *workspace) { container_map(workspace, set_mask, &mask); wlc_output_set_mask(wlc_get_focused_output(), 2); - unfocus_all(&root_container); - focus_view(workspace); - destroy_workspace(c_workspace); } + unfocus_all(&root_container); + focus_view(workspace); + + // focus the output this workspace is on + swayc_t *output = workspace->parent; + sway_log(L_DEBUG, "Switching focus to output %p (%d)", output, output->type); + while (output && output->type != C_OUTPUT) { + output = output->parent; + } + if (output) { + sway_log(L_DEBUG, "Switching focus to output %p (%d)", output, output->type); + wlc_output_focus(output->handle); + } active_workspace = workspace; }