diff options
author | David Roundy <droundy@darcs.net> | 2007-08-14 03:45:48 +0200 |
---|---|---|
committer | David Roundy <droundy@darcs.net> | 2007-08-14 03:45:48 +0200 |
commit | 4711289c5e074bd5a1070726e8c3bbd84b26a5a6 (patch) | |
tree | 67aaef635870d6bb68fdd935bdcf1f9b197f23ae /DynamicWorkspaces.hs | |
parent | d444f374b6904bde4a10531f0161f367c8b54fb1 (diff) | |
download | XMonadContrib-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.hs | 41 |
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 |