aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Actions/SpawnOn.hs
diff options
context:
space:
mode:
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) :))