------------------------------------------------------------------------------
-- |
-- Module : ScratchpadPrime
-- Copyright : (c) Mads N Noe 2009
-- Maintainer : mntnoe (@) gmail.com
-- License : as-is
--
-- A modified scatchpad which uses GNU Screen to detach the window rather than
-- putting it on a hidden workspace. This makes cycling between workspaces
-- easy, as there is no need for a dummy workspace to store the terminal when
-- hidden.
--
------------------------------------------------------------------------------
module ScratchpadPrime (
scratchpad'
) where
-- Haskell modules
import Control.Monad
-- XMonad modules
import XMonad
import qualified XMonad.StackSet as W
-- | A modified scatchpad which uses GNU Screen to detach the
-- window rather than putting it on a hidden workspace.
scratchpad' :: Query Bool -> String -> X ()
scratchpad' q cmd = withWindowSet $ \s -> do
filterCurrent <- filterM (runQuery $ q)
$ (maybe [] W.integrate
. W.stack
. W.workspace
. W.current) s
case filterCurrent of
(x:_) -> kill' x
[] -> do
filterAll <- filterM (runQuery $ q) $ W.allWindows s
case filterAll of
(x:_) -> windows (W.shiftWin (W.currentTag s) x)
-- no need to 'sleep 0.2' here, as window isn't resized
[] -> spawn cmd
-- | As 'kill', but kill a given window (rather than killing the focused window).
kill' :: Window ->X ()
kill' w = withDisplay $ \d -> do
wmdelt <- atom_WM_DELETE_WINDOW ; wmprot <- atom_WM_PROTOCOLS
protocols <- io $ getWMProtocols d w
io $ if wmdelt `elem` protocols
then allocaXEvent $ \ev -> do
setEventType ev clientMessage
setClientMessageEvent ev w wmprot 32 wmdelt 0
sendEvent d w False noEventMask ev
else killClient d w >> return ()