aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DynamicWorkspaces.hs52
-rw-r--r--MetaModule.hs1
2 files changed, 53 insertions, 0 deletions
diff --git a/DynamicWorkspaces.hs b/DynamicWorkspaces.hs
new file mode 100644
index 0000000..0f417bb
--- /dev/null
+++ b/DynamicWorkspaces.hs
@@ -0,0 +1,52 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonadContrib.DynamicWorkspaces
+-- Copyright : (c) David Roundy <droundy@darcs.net>
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : David Roundy <droundy@darcs.net>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- Provides bindings to add and delete workspaces. Note that you may only
+-- delete a workspace that is already empty.
+--
+-----------------------------------------------------------------------------
+
+module XMonadContrib.DynamicWorkspaces (
+ -- * Usage
+ -- $usage
+ addWorkspace, removeWorkspace
+ ) where
+
+import XMonad ( X )
+import Operations ( windows )
+import StackSet ( tagMember, StackSet(..), Screen(..), Workspace(..) )
+
+-- $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_Down), removeWorkspace)
+
+addWorkspace :: X ()
+addWorkspace = windows addWorkspace'
+
+removeWorkspace :: X ()
+removeWorkspace = 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 })
+ = 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 } })
+ , hidden = (w:ws) })
+ = s { current = scr { workspace = w }
+ , hidden = ws }
+removeWorkspace' s = s
diff --git a/MetaModule.hs b/MetaModule.hs
index a8ccd25..11ef9af 100644
--- a/MetaModule.hs
+++ b/MetaModule.hs
@@ -31,6 +31,7 @@ import XMonadContrib.DeManage ()
import XMonadContrib.Dmenu ()
import XMonadContrib.DwmPromote ()
import XMonadContrib.DynamicLog ()
+import XMonadContrib.DynamicWorkspaces ()
import XMonadContrib.Dzen ()
import XMonadContrib.FindEmptyWorkspace ()
import XMonadContrib.FlexibleResize ()