aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/cursor.c
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-05-19 19:57:10 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2018-05-20 14:46:29 -0400
commita3d3c819cf38d7a04f79f6d5b16e11ac0a786135 (patch)
treec654c796330c5b330afe11a60a5acf2b1844f0fb /sway/input/cursor.c
parentMerge pull request #2006 from kupospelov/fix-title-pixel-bar (diff)
downloadsway-a3d3c819cf38d7a04f79f6d5b16e11ac0a786135.tar.gz
sway-a3d3c819cf38d7a04f79f6d5b16e11ac0a786135.tar.zst
sway-a3d3c819cf38d7a04f79f6d5b16e11ac0a786135.zip
Fix focus_follows_mouse over swaybar
If you moved your mouse over swaybar (e.g. to scroll between workspaces), focus would move to the workspace. This is not the right thing to do. The solution is complicated by the fact that if you move your mouse into a new output with an empty workspace, that workspace _should_ receive focus.
Diffstat (limited to 'sway/input/cursor.c')
-rw-r--r--sway/input/cursor.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 9259c475..3a73954c 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -146,7 +146,23 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor, uint32_t time_msec)
146 struct sway_container *c = container_at_coords(cursor->seat, 146 struct sway_container *c = container_at_coords(cursor->seat,
147 cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); 147 cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
148 if (c && config->focus_follows_mouse) { 148 if (c && config->focus_follows_mouse) {
149 seat_set_focus_warp(cursor->seat, c, false); 149 if (c->type == C_WORKSPACE) {
150 // Only follow the mouse if it would move to a new output
151 // Otherwise we'll focus the workspace, which is probably wrong
152 struct sway_container *focus = seat_get_focus(cursor->seat);
153 if (focus->type != C_OUTPUT) {
154 focus = container_parent(focus, C_OUTPUT);
155 }
156 struct sway_container *output = c;
157 if (output->type != C_OUTPUT) {
158 output = container_parent(c, C_OUTPUT);
159 }
160 if (output != focus) {
161 seat_set_focus_warp(cursor->seat, c, false);
162 }
163 } else {
164 seat_set_focus_warp(cursor->seat, c, false);
165 }
150 } 166 }
151 167
152 // reset cursor if switching between clients 168 // reset cursor if switching between clients