Bugfix: Warp pointer to the correct window when using the 'focus' command
Comment in the code makes the fix clear, I think. Steps to reproduce the issue: 1) On the right monitor, open two terminals (h-split workspace) 2) 'i3 mark foo' on the right terminal 3) Focus the left terminal 4) Switch to the left monitor 5) i3 '[con_mark="foo"] focus' 6) the left window will contain the pointer (and is focused for a short period of time, or even permanently due to race conditions)
This commit is contained in:
parent
201268d9b2
commit
658bf5adff
|
@ -440,6 +440,24 @@ focus:
|
||||||
int count = 0;
|
int count = 0;
|
||||||
TAILQ_FOREACH(current, &owindows, owindows) {
|
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||||
Con *ws = con_get_workspace(current->con);
|
Con *ws = con_get_workspace(current->con);
|
||||||
|
|
||||||
|
/* If the container is not on the current workspace,
|
||||||
|
* workspace_show() will switch to a different workspace and (if
|
||||||
|
* enabled) trigger a mouse pointer warp to the currently focused
|
||||||
|
* container (!) on the target workspace.
|
||||||
|
*
|
||||||
|
* Therefore, before calling workspace_show(), we make sure that
|
||||||
|
* 'current' will be focused on the workspace. However, we cannot
|
||||||
|
* just con_focus(current) because then the pointer will not be
|
||||||
|
* warped at all (the code thinks we are already there).
|
||||||
|
*
|
||||||
|
* So we focus 'current' to make it the currently focused window of
|
||||||
|
* the target workspace, then revert focus. */
|
||||||
|
Con *currently_focused = focused;
|
||||||
|
con_focus(current->con);
|
||||||
|
con_focus(currently_focused);
|
||||||
|
|
||||||
|
/* Now switch to the workspace, then focus */
|
||||||
workspace_show(ws);
|
workspace_show(ws);
|
||||||
LOG("focusing %p / %s\n", current->con, current->con->name);
|
LOG("focusing %p / %s\n", current->con, current->con->name);
|
||||||
con_focus(current->con);
|
con_focus(current->con);
|
||||||
|
|
Loading…
Reference in New Issue