diff --git a/CHANGES.md b/CHANGES.md index 954d1489..70e1fee6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -256,6 +256,11 @@ - Added `workspaceNamesListTransform` which makes workspace names visible to external pagers. + * `XMonad.Util.PureX` + + - Added `focusWindow` and `focusNth` which don't refresh (and thus + possibly flicker) when they happen to be a no-op. + * Several `LayoutClass` instances now have an additional `Typeable` constraint which may break some advanced configs. The upside is that we can now add `Typeable` to `LayoutClass` in `XMonad.Core` and make it diff --git a/XMonad/Util/PureX.hs b/XMonad/Util/PureX.hs index 988ad5e5..d1d173a5 100644 --- a/XMonad/Util/PureX.hs +++ b/XMonad/Util/PureX.hs @@ -44,6 +44,7 @@ module XMonad.Util.PureX ( withWindowSet', withFocii, modify'', modifyWindowSet', getStack, putStack, peek, + focusWindow, focusNth, view, greedyView, invisiView, shift, curScreen, curWorkspace, curTag, curScreenId, @@ -52,6 +53,7 @@ module XMonad.Util.PureX ( -- xmonad import XMonad import qualified XMonad.StackSet as W +import qualified XMonad.Actions.FocusNth -- mtl import Control.Monad.State @@ -272,5 +274,21 @@ shift tag = withFocii $ \ctag fw -> mfw' <- peek return (Any $ Just fw /= mfw') +-- | Internal. Refresh-tracking logic of focus operations. +focusWith :: XLike m => (WindowSet -> WindowSet) -> m Any +focusWith focuser = do + old <- peek + modifyWindowSet' focuser + new <- peek + return (Any $ old /= new) + +-- | A refresh-tracking version of @W.focusWindow@. +focusWindow :: XLike m => Window -> m Any +focusWindow w = focusWith (W.focusWindow w) + +-- | A refresh-tracking version of @XMonad.Actions.FocusNth.focusNth@. +focusNth :: XLike m => Int -> m Any +focusNth i = focusWith (W.modify' (XMonad.Actions.FocusNth.focusNth' i)) + -- }}}