aboutsummaryrefslogtreecommitdiffstats
path: root/DynamicWorkspaces.hs
diff options
context:
space:
mode:
authorDavid Roundy <droundy@darcs.net>2007-08-14 20:35:42 +0200
committerDavid Roundy <droundy@darcs.net>2007-08-14 20:35:42 +0200
commit03f5d93ba1d2a0488468186f61b300d3621b3c79 (patch)
tree5c8b38c40910de0803b2dd35e851dddde114ca62 /DynamicWorkspaces.hs
parent4711289c5e074bd5a1070726e8c3bbd84b26a5a6 (diff)
downloadXMonadContrib-03f5d93ba1d2a0488468186f61b300d3621b3c79.tar.gz
XMonadContrib-03f5d93ba1d2a0488468186f61b300d3621b3c79.tar.xz
XMonadContrib-03f5d93ba1d2a0488468186f61b300d3621b3c79.zip
clean up DynamicWorkspaces to handle layouts properly.
darcs-hash:20070814183542-72aca-69bc348ac38c0a2133782d874344255ab1221821.gz
Diffstat (limited to 'DynamicWorkspaces.hs')
-rw-r--r--DynamicWorkspaces.hs28
1 files changed, 16 insertions, 12 deletions
diff --git a/DynamicWorkspaces.hs b/DynamicWorkspaces.hs
index 51ee58f..ab8dd8f 100644
--- a/DynamicWorkspaces.hs
+++ b/DynamicWorkspaces.hs
@@ -19,10 +19,10 @@ module XMonadContrib.DynamicWorkspaces (
addWorkspace, removeWorkspace
) where
-import Control.Monad.State ( get, gets, modify )
+import Control.Monad.State ( gets, modify )
import XMonad ( X, XState(..), Layout, trace )
-import Operations ( windows )
+import Operations ( windows, view )
import StackSet ( tagMember, StackSet(..), Screen(..), Workspace(..),
integrate, differentiate )
import Data.Map ( delete, insert )
@@ -44,10 +44,14 @@ addWorkspace (l:ls) = do s <- gets windowset
addWorkspace [] = trace "bad layouts in XMonadContrib.DynamicWorkspaces.addWorkspace\n"
removeWorkspace :: X ()
-removeWorkspace = do XState { windowset = s, layouts = fls } <- get
- let w = tag $ workspace $ current s
- modify $ \st -> st { layouts = delete w fls }
- windows removeWorkspace'
+removeWorkspace = do s <- gets windowset
+ case s of
+ StackSet { current = Screen { workspace = torem }
+ , hidden = (w:_) }
+ -> do view $ tag w
+ modify $ \st -> st { layouts = delete (tag torem) $ layouts st }
+ windows (removeWorkspace' (tag torem))
+ _ -> return ()
addWorkspace' :: i -> StackSet i a sid sd -> StackSet i a sid sd
addWorkspace' newtag s@(StackSet { current = scr@(Screen { workspace = w })
@@ -55,13 +59,13 @@ addWorkspace' newtag s@(StackSet { current = scr@(Screen { workspace = w })
= s { current = scr { workspace = Workspace newtag Nothing }
, hidden = w:ws }
-removeWorkspace' :: StackSet i a sid sd -> StackSet i a sid sd
-removeWorkspace' s@(StackSet { current = scr@(Screen { workspace = Workspace { stack = st } })
- , hidden = (w:ws) })
- = s { current = scr { workspace = w { stack = meld st (stack w) } }
- , hidden = ws }
+removeWorkspace' :: (Eq i) => i -> StackSet i a sid sd -> StackSet i a sid sd
+removeWorkspace' torem s@(StackSet { current = scr@(Screen { workspace = wc })
+ , hidden = (w:ws) })
+ | tag w == torem = s { current = scr { workspace = wc { stack = meld (stack w) (stack wc) } }
+ , hidden = ws }
where meld Nothing Nothing = Nothing
meld x Nothing = x
meld Nothing x = x
meld (Just x) (Just y) = differentiate (integrate x ++ integrate y)
-removeWorkspace' s = s
+removeWorkspace' _ s = s