aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Actions/SpawnOn.hs
diff options
context:
space:
mode:
authorSpencer Janssen <spencerjanssen@gmail.com>2009-01-17 05:04:32 +0100
committerSpencer Janssen <spencerjanssen@gmail.com>2009-01-17 05:04:32 +0100
commit90949577aeb040012a49c7687bcfec8fcfb80e34 (patch)
treeac6147d375cb6fda28e135cee521cf9597791f65 /XMonad/Actions/SpawnOn.hs
parent8c294bb7ac6c1c6a71edfeae11719111a84bf284 (diff)
downloadXMonadContrib-90949577aeb040012a49c7687bcfec8fcfb80e34.tar.gz
XMonadContrib-90949577aeb040012a49c7687bcfec8fcfb80e34.tar.xz
XMonadContrib-90949577aeb040012a49c7687bcfec8fcfb80e34.zip
Add XMonad.Actions.SpawnOn
Ignore-this: 63869d1ab11f2ed5aab1690763065800 darcs-hash:20090117040432-25a6b-306aa18fed69a47197ca8c349cf6452939db5188.gz
Diffstat (limited to 'XMonad/Actions/SpawnOn.hs')
-rw-r--r--XMonad/Actions/SpawnOn.hs77
1 files changed, 77 insertions, 0 deletions
diff --git a/XMonad/Actions/SpawnOn.hs b/XMonad/Actions/SpawnOn.hs
new file mode 100644
index 0000000..d452cdf
--- /dev/null
+++ b/XMonad/Actions/SpawnOn.hs
@@ -0,0 +1,77 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonad.Actions.SpawnOn
+-- Copyright : (c) Spencer Janssen
+-- License : BSD
+--
+-- Maintainer : Spencer Janssen <spencerjanssen@gmail.com>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- This module provides helper functions to be used in @manageHook@. Here's
+-- how you might use this:
+--
+-- > import XMonad.Hooks.ManageHelpers
+-- > main = do
+-- > sp <- mkSpawner
+-- > xmonad defaultConfig {
+-- > ...
+-- > manageHook = spawnHook sp <+> manageHook defaultConfig
+-- > ...
+-- > }
+
+module XMonad.Actions.SpawnOn (
+ Spawner,
+ mkSpawner,
+ manageSpawn,
+ spawnHere,
+ spawnOn,
+ shellPromptHere,
+ shellPromptOn
+) where
+
+import Data.IORef
+import System.Posix.Types (ProcessID)
+
+import XMonad
+import qualified XMonad.StackSet as W
+
+import XMonad.Hooks.ManageHelpers
+import XMonad.Prompt
+import XMonad.Prompt.Shell
+
+newtype Spawner = Spawner {pidsRef :: IORef [(ProcessID, WorkspaceId)]}
+
+maxPids :: Int
+maxPids = 5
+
+mkSpawner :: (Functor m, MonadIO m) => m Spawner
+mkSpawner = io . fmap Spawner $ newIORef []
+
+manageSpawn :: Spawner -> ManageHook
+manageSpawn sp = do
+ pids <- io . readIORef $ pidsRef sp
+ mp <- pid
+ case flip lookup pids =<< mp of
+ Just w -> doF (W.shift w)
+ Nothing -> doF id
+
+mkPrompt :: (String -> X ()) -> XPConfig -> X ()
+mkPrompt cb c = do
+ cmds <- io $ getCommands
+ mkXPrompt Shell c (getShellCompl cmds) cb
+
+shellPromptHere :: Spawner -> XPConfig -> X ()
+shellPromptHere sp = mkPrompt (spawnHere sp)
+
+shellPromptOn :: Spawner -> WorkspaceId -> XPConfig -> X ()
+shellPromptOn sp ws = mkPrompt (spawnOn sp ws)
+
+spawnHere :: Spawner -> String -> X ()
+spawnHere sp cmd = withWindowSet $ \ws -> spawnOn sp (currTag ws) cmd
+ where currTag = W.tag . W.workspace . W.current
+
+spawnOn :: Spawner -> WorkspaceId -> String -> X ()
+spawnOn sp ws cmd = do
+ p <- spawnPID cmd
+ io $ modifyIORef (pidsRef sp) (take maxPids . ((p, ws) :))