aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/SwapMaster.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2022-04-10 13:26:16 -0600
committerJosh Rahm <joshuarahm@gmail.com>2022-10-09 12:19:46 -0600
commita652c330707e2e9bbe963e01af79ce730cf3452e (patch)
tree047655195f50efcbd51db8f825acf589dc6abead /src/Rahm/Desktop/SwapMaster.hs
parent381a3e5a00813314249bb74b5460f5ff5a4006bb (diff)
downloadrde-a652c330707e2e9bbe963e01af79ce730cf3452e.tar.gz
rde-a652c330707e2e9bbe963e01af79ce730cf3452e.tar.bz2
rde-a652c330707e2e9bbe963e01af79ce730cf3452e.zip
Rename Internal to Rahm.Desktop
Diffstat (limited to 'src/Rahm/Desktop/SwapMaster.hs')
-rw-r--r--src/Rahm/Desktop/SwapMaster.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/SwapMaster.hs b/src/Rahm/Desktop/SwapMaster.hs
new file mode 100644
index 0000000..b039fdb
--- /dev/null
+++ b/src/Rahm/Desktop/SwapMaster.hs
@@ -0,0 +1,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