{- Swap window with the master, but save it. -} module Rahm.Desktop.SwapMaster (swapMaster) where import Control.Monad (void) import Control.Monad.State (gets) import Control.Monad.Trans (lift) import Control.Monad.Trans.Maybe (MaybeT (..)) import qualified Rahm.Desktop.StackSet as W ( focusMaster, masterWindow, peek, swapWindows, ) import XMonad ( ExtensionClass (..), Window, X (..), windows, windowset, ) import qualified XMonad.Util.ExtensibleState as XS (get, put) newtype LastWindow = LastWindow { lastWindow :: Maybe Window } deriving (Show, Read) instance ExtensionClass LastWindow where initialValue = LastWindow Nothing hoist :: (Monad m) => Maybe a -> MaybeT m a hoist = MaybeT . return swapMaster :: X () swapMaster = void $ runMaybeT $ do ss <- gets windowset focused <- hoist $ W.peek ss master <- hoist $ W.masterWindow ss if focused == master then do lw <- MaybeT $ lastWindow <$> XS.get lift $ windows (W.swapWindows [(focused, lw)]) else lift $ windows (W.swapWindows [(focused, master)]) lift $ do XS.put (LastWindow $ Just master) windows W.focusMaster