aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/SwapMaster.hs
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