diff --git a/CHANGES.md b/CHANGES.md index dc68d86aca..c2fe52ef16 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -243,6 +243,11 @@ - Export `Minimize` type constructor. + * `XMonad.Util.PureX` + + - Added `focusWindow` and `focusNth` which don't refresh (and thus + possibly flicker) when they happen to be a no-op. + ## 0.16 ### Breaking Changes diff --git a/XMonad/Util/PureX.hs b/XMonad/Util/PureX.hs index 988ad5e5f7..d1d173a5ed 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)) + -- }}}