blob: b039fdb486b9a71bdd2cc1244b0245b3d4296268 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
{- Swap window with the master, but save it. -}
module Rahm.Desktop.SwapMaster (swapMaster) where
import qualified XMonad.StackSet as W
import Rahm.Desktop.Windows (mapWindows, getMaster, swapWindows)
import Control.Monad.Trans.Maybe
import XMonad (Window, ExtensionClass(..), X(..), windows, windowset)
import Control.Monad (void)
import Control.Monad.Trans (lift)
import Data.Maybe (fromMaybe)
import Control.Monad.State (gets)
import qualified XMonad.Util.ExtensibleState as XS
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 $ getMaster ss
if focused == master
then do
lw <- MaybeT $ lastWindow <$> XS.get
lift $ windows (swapWindows focused lw)
else lift $ windows (swapWindows focused master)
lift $ do
XS.put (LastWindow $ Just master)
windows W.focusMaster
|