diff options
author | Miikka Koskinen <arcatan@kapsi.fi> | 2007-05-13 20:43:38 +0200 |
---|---|---|
committer | Miikka Koskinen <arcatan@kapsi.fi> | 2007-05-13 20:43:38 +0200 |
commit | 77787aa02c70245f18b5aa2428ee99e1f7dea65e (patch) | |
tree | e95b14186a77db7f6ee1b7db73d435c6447e7abd | |
parent | 199b34cb3638ba0bffe76891fa2da107b07bb836 (diff) | |
download | XMonadContrib-77787aa02c70245f18b5aa2428ee99e1f7dea65e.tar.gz XMonadContrib-77787aa02c70245f18b5aa2428ee99e1f7dea65e.tar.xz XMonadContrib-77787aa02c70245f18b5aa2428ee99e1f7dea65e.zip |
XMonadContrib.FindEmptyWorkspace
With this module you can find empty workspaces, view them and tag windows to
them.
darcs-hash:20070513184338-0ff8e-baad1381c3dd123c74c6ca608279dfd683d96333.gz
-rw-r--r-- | FindEmptyWorkspace.hs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/FindEmptyWorkspace.hs b/FindEmptyWorkspace.hs new file mode 100644 index 0000000..efd524f --- /dev/null +++ b/FindEmptyWorkspace.hs @@ -0,0 +1,59 @@ +----------------------------------------------------------------------------- +-- | +-- Module : XMonadContrib.FindEmptyWorkspace +-- Copyright : (c) Miikka Koskinen 2007 +-- License : BSD3-style (see LICENSE) +-- +-- Maintainer : arcatan@kapsi.fi +-- +----------------------------------------------------------------------------- +-- +-- Find an empty workspace in xmonad. +-- +-- To use, modify your Config.hs to: +-- +-- import XMonadContrib.FindEmptyWorkspace +-- +-- and add a keybinding: +-- +-- , ((modMask, xK_m ), viewEmptyWorkspace) +-- , ((modMask .|. shiftMask, xK_m ), tagToEmptyWorkspace) +-- +-- Now you can jump to an empty workspace with mod-n. Mod-shift-n will +-- tag the current window to an empty workspace and view it. +-- + +module XMonadContrib.FindEmptyWorkspace ( + viewEmptyWorkspace, tagToEmptyWorkspace + ) where + +import Control.Monad.State +import qualified Data.Map as M + +import XMonad +import Operations +import qualified StackSet as W + +-- | Find the first empty workspace in a WindowSet. Returns Nothing if +-- all workspaces are in use. +findEmptyWorkspace :: WindowSet -> Maybe WorkspaceId +findEmptyWorkspace = findKey (([],[]) ==) . W.stacks + +withEmptyWorkspace :: (WorkspaceId -> X ()) -> X () +withEmptyWorkspace f = do + ws <- gets workspace + whenJust (findEmptyWorkspace ws) f + +-- | Find and view an empty workspace. Do nothing if all workspaces are +-- in use. +viewEmptyWorkspace :: X () +viewEmptyWorkspace = withEmptyWorkspace view + +-- | Tag current window to an empty workspace and view it. Do nothing if +-- all workspaces are in use. +tagToEmptyWorkspace :: X () +tagToEmptyWorkspace = withEmptyWorkspace $ \w -> tag w >> view w + +-- Thanks to mauke on #haskell +findKey :: (a -> Bool) -> M.Map k a -> Maybe k +findKey f = M.foldWithKey (\k a -> mplus (if f a then Just k else Nothing)) Nothing |