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