diff options
Diffstat (limited to 'src/Rahm/Desktop/StackSet.hs')
| -rw-r--r-- | src/Rahm/Desktop/StackSet.hs | 51 |
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 |