aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorBrian Ashworth <bosrsf04@gmail.com>2019-02-13 23:46:20 -0500
committeremersion <contact@emersion.fr>2019-02-14 11:01:08 +0100
commitab42874f71bceeaf0357dbf3020f1cb73fb2c738 (patch)
treea3876a12d29047f178ae3beb59a31d00ee6005f1 /sway
parentcc39bbdff336cbad8892e79e8888ae483c457f70 (diff)
seat: allow tree focus changes while layer focused
This allows the focused inactive tree node and visible workspaces to be changed while a surface layer has focus. The layer temporarily loses focus, the tree focus changes, and the layer gets refocused.
Diffstat (limited to 'sway')
-rw-r--r--sway/input/seat.c4
-rw-r--r--sway/tree/workspace.c14
2 files changed, 14 insertions, 4 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 18664d7c..df48b751 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -725,6 +725,10 @@ void seat_set_raw_focus(struct sway_seat *seat, struct sway_node *node) {
void seat_set_focus(struct sway_seat *seat, struct sway_node *node) {
if (seat->focused_layer) {
+ struct wlr_layer_surface_v1 *layer = seat->focused_layer;
+ seat_set_focus_layer(seat, NULL);
+ seat_set_focus(seat, node);
+ seat_set_focus_layer(seat, layer);
return;
}
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index b9780922..cda6caf7 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -451,9 +451,15 @@ struct sway_workspace *workspace_prev(struct sway_workspace *current) {
bool workspace_switch(struct sway_workspace *workspace,
bool no_auto_back_and_forth) {
struct sway_seat *seat = input_manager_current_seat();
- struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
+ struct sway_workspace *active_ws = NULL;
+ struct sway_node *focus = seat_get_focus_inactive(seat, &root->node);
+ if (focus && focus->type == N_WORKSPACE) {
+ active_ws = focus->sway_workspace;
+ } else if (focus && focus->type == N_CONTAINER) {
+ active_ws = focus->sway_container->workspace;
+ }
- if (!no_auto_back_and_forth && config->auto_back_and_forth
+ if (!no_auto_back_and_forth && config->auto_back_and_forth && active_ws
&& active_ws == workspace && seat->prev_workspace_name) {
struct sway_workspace *new_ws =
workspace_by_name(seat->prev_workspace_name);
@@ -462,9 +468,9 @@ bool workspace_switch(struct sway_workspace *workspace,
workspace_create(NULL, seat->prev_workspace_name);
}
- if (!seat->prev_workspace_name ||
+ if (active_ws && (!seat->prev_workspace_name ||
(strcmp(seat->prev_workspace_name, active_ws->name)
- && active_ws != workspace)) {
+ && active_ws != workspace))) {
free(seat->prev_workspace_name);
seat->prev_workspace_name = malloc(strlen(active_ws->name) + 1);
if (!seat->prev_workspace_name) {