X.L.TrackFloating: Fix changing focus on inactive workspaces

When focus changes¹ on an inactive workspace (not `current`, but
`visible`), TrackFloating and UseTransientFor would think they should
use the remembered focus point as they look at the wrong (`current`)
workspace instead of the workspace they're supposed to layout, and so
focus seems to be out of their set of windows, when actually it is not.

Fix this by looking at the correct workspace.

¹) This isn't entirely straightforward, as there are normally no
   keybindings or StackSet operations for this, but it's perfectly legal
   to `W.view` the inactive workspace, change focus, and `W.view` back
   in a single `windows` action.
This commit is contained in:
Tomas Janousek
2021-02-15 17:07:21 +00:00
parent ebf9561d76
commit 43592c84d4
2 changed files with 6 additions and 2 deletions

View File

@@ -51,7 +51,7 @@ data TrackFloating a = TrackFloating (Maybe Window)
instance LayoutModifier TrackFloating Window where
modifyLayoutWithUpdate (TrackFloating mw) ws@(W.Workspace{ W.stack = ms }) r
= do
xCur <- gets (W.peek . windowset)
xCur <- gets (W.peek . W.view (W.tag ws) . windowset)
let isF = xCur /= (W.focus <$> ms)
-- use the remembered focus point when true focus differs from
-- what this (sub)layout is given, which happens e.g. when true
@@ -75,7 +75,7 @@ data UseTransientFor a = UseTransientFor deriving (Read,Show,Eq)
instance LayoutModifier UseTransientFor Window where
modifyLayout _ ws@(W.Workspace{ W.stack = ms }) r = do
m <- gets (W.peek . windowset)
m <- gets (W.peek . W.view (W.tag ws) . windowset)
d <- asks display
parent <- join <$> T.traverse (io . getTransientForHint d) m