aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/StackSet.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Rahm/Desktop/StackSet.hs')
-rw-r--r--src/Rahm/Desktop/StackSet.hs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/StackSet.hs b/src/Rahm/Desktop/StackSet.hs
new file mode 100644
index 0000000..251bee3
--- /dev/null
+++ b/src/Rahm/Desktop/StackSet.hs
@@ -0,0 +1,51 @@
+module Rahm.Desktop.StackSet (
+ masterWindow,
+ findWorkspace,
+ ensureWorkspace,
+ swapWorkspaces,
+ greedyView,
+ shiftWin,
+ module W) where
+
+import Prelude hiding (head, tail)
+import Data.List.Safe (head, tail)
+import Data.List (find)
+import XMonad.StackSet as W hiding (greedyView, shiftWin)
+import qualified XMonad.StackSet
+import Data.Default
+import Data.Maybe (fromMaybe)
+
+masterWindow :: StackSet i l a s sd -> Maybe a
+masterWindow = head . integrate' . stack . workspace . current
+
+findWorkspace :: (Eq i) =>
+ i -> StackSet i l a s sd -> Maybe (Workspace i l a)
+findWorkspace wid = find ((==wid) . tag) . workspaces
+
+ensureWorkspace :: (Eq i) =>
+ i -> StackSet i l a s sd -> (StackSet i l a s sd, Workspace i l a)
+ensureWorkspace t ss =
+ case findWorkspace t ss of
+ Nothing ->
+ let ws = Workspace t (layout . workspace . current $ ss) Nothing in
+ (ss { hidden = ws : hidden ss }, ws)
+ Just ws -> (ss, ws)
+
+swapWorkspaces ::
+ (Eq i) =>
+ i -> i -> StackSet i l a s sd -> StackSet i l a s sd
+swapWorkspaces wid1 wid2 ss =
+ let (ss', workspace1) = ensureWorkspace wid1 ss
+ (ss'', workspace2) = ensureWorkspace wid2 ss'
+ in
+ mapWorkspace (\w ->
+ case () of
+ _ | tag w == wid1 -> workspace2
+ _ | tag w == wid2 -> workspace1
+ _ -> w) ss''
+
+greedyView :: (Eq i) => i -> StackSet i l a s sd -> StackSet i l a s sd
+greedyView wid ss = swapWorkspaces (tag . workspace . current $ ss) wid ss
+
+shiftWin :: (Ord a, Eq s, Eq i) => i -> a -> StackSet i l a s sd -> StackSet i l a s sd
+shiftWin wid a = XMonad.StackSet.shiftWin wid a . fst . ensureWorkspace wid