aboutsummaryrefslogtreecommitdiffstats
path: root/DynamicWorkspaces.hs
diff options
context:
space:
mode:
authorDavid Roundy <droundy@darcs.net>2007-08-14 03:45:48 +0200
committerDavid Roundy <droundy@darcs.net>2007-08-14 03:45:48 +0200
commit4711289c5e074bd5a1070726e8c3bbd84b26a5a6 (patch)
tree67aaef635870d6bb68fdd935bdcf1f9b197f23ae /DynamicWorkspaces.hs
parentd444f374b6904bde4a10531f0161f367c8b54fb1 (diff)
downloadXMonadContrib-4711289c5e074bd5a1070726e8c3bbd84b26a5a6.tar.gz
XMonadContrib-4711289c5e074bd5a1070726e8c3bbd84b26a5a6.tar.xz
XMonadContrib-4711289c5e074bd5a1070726e8c3bbd84b26a5a6.zip
make DynamicWorkspace more thorough.
Note: there's still a bug due to our failure to inform the old layouts to clean up. darcs-hash:20070814014548-72aca-9b66ee3deba31a15b6e0b0dd0b79847edc6fc6e3.gz
Diffstat (limited to 'DynamicWorkspaces.hs')
-rw-r--r--DynamicWorkspaces.hs41
1 files changed, 28 insertions, 13 deletions
diff --git a/DynamicWorkspaces.hs b/DynamicWorkspaces.hs
index 0f417bb..51ee58f 100644
--- a/DynamicWorkspaces.hs
+++ b/DynamicWorkspaces.hs
@@ -19,34 +19,49 @@ module XMonadContrib.DynamicWorkspaces (
addWorkspace, removeWorkspace
) where
-import XMonad ( X )
+import Control.Monad.State ( get, gets, modify )
+
+import XMonad ( X, XState(..), Layout, trace )
import Operations ( windows )
-import StackSet ( tagMember, StackSet(..), Screen(..), Workspace(..) )
+import StackSet ( tagMember, StackSet(..), Screen(..), Workspace(..),
+ integrate, differentiate )
+import Data.Map ( delete, insert )
+import Graphics.X11.Xlib ( Window )
-- $usage
-- You can use this module with the following in your Config.hs file:
--
-- > import XMonadContrib.DynamicWorkspaces
--
--- > , ((modMask .|. shiftMask, xK_Up), addWorkspace)
+-- > , ((modMask .|. shiftMask, xK_Up), addWorkspace defaultLayouts)
-- > , ((modMask .|. shiftMask, xK_Down), removeWorkspace)
-addWorkspace :: X ()
-addWorkspace = windows addWorkspace'
+addWorkspace :: [Layout Window] -> X ()
+addWorkspace (l:ls) = do s <- gets windowset
+ let newtag:_ = filter (not . (`tagMember` s)) [0..]
+ modify $ \st -> st { layouts = insert newtag (l,ls) $ layouts st }
+ windows (addWorkspace' newtag)
+addWorkspace [] = trace "bad layouts in XMonadContrib.DynamicWorkspaces.addWorkspace\n"
removeWorkspace :: X ()
-removeWorkspace = windows removeWorkspace'
+removeWorkspace = do XState { windowset = s, layouts = fls } <- get
+ let w = tag $ workspace $ current s
+ modify $ \st -> st { layouts = delete w fls }
+ windows removeWorkspace'
-addWorkspace' :: (Enum i, Num i) => StackSet i a sid sd -> StackSet i a sid sd
-addWorkspace' s@(StackSet { current = scr@(Screen { workspace = w })
- , hidden = ws })
+addWorkspace' :: i -> StackSet i a sid sd -> StackSet i a sid sd
+addWorkspace' newtag s@(StackSet { current = scr@(Screen { workspace = w })
+ , hidden = ws })
= s { current = scr { workspace = Workspace newtag Nothing }
, hidden = w:ws }
- where (newtag:_) = filter (not . (`tagMember` s)) [0..]
removeWorkspace' :: StackSet i a sid sd -> StackSet i a sid sd
-removeWorkspace' s@(StackSet { current = scr@(Screen { workspace = Workspace { stack = Nothing } })
+removeWorkspace' s@(StackSet { current = scr@(Screen { workspace = Workspace { stack = st } })
, hidden = (w:ws) })
- = s { current = scr { workspace = w }
- , hidden = ws }
+ = s { current = scr { workspace = w { stack = meld st (stack w) } }
+ , 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