Move runXXX functions to one module

This patch takes runProcessWithInput out of Dmenu, runProcessWithInputAndWait
out of Dzen, and runInXTerm out of RunInXTerm and collects them in one central
module called Run.  This way, other modules may include Run instead of Dmenu
to get what they want without giving the impression of making use of dmenu.
This commit is contained in:
Christian Thiemann
2007-10-12 14:52:33 +00:00
parent c437e3e384
commit 830945336f
8 changed files with 92 additions and 52 deletions

View File

@@ -20,7 +20,7 @@ module XMonadContrib.DirectoryPrompt (
import XMonad
import XMonadContrib.XPrompt
import XMonadContrib.Dmenu ( runProcessWithInput )
import XMonadContrib.Run ( runProcessWithInput )
-- $usage
-- For an example usage see "XMonadContrib.WorkspaceDir"

View File

@@ -17,16 +17,14 @@
module XMonadContrib.Dmenu (
-- * Usage
-- $usage
dmenu, dmenuXinerama, dmenuMap,
runProcessWithInput
dmenu, dmenuXinerama, dmenuMap
) where
import XMonad
import qualified StackSet as W
import qualified Data.Map as M
import System.Process
import System.IO
import Control.Monad.State
import XMonadContrib.Run
-- $usage
-- You can use this module with the following in your Config.hs file:
@@ -35,20 +33,6 @@ import Control.Monad.State
-- %import XMonadContrib.Dmenu
-- | Returns Just output if the command succeeded, and Nothing if it didn't.
-- This corresponds to dmenu's notion of exit code 1 for a cancelled invocation.
runProcessWithInput :: FilePath -> [String] -> String -> IO String
runProcessWithInput cmd args input = do
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
hClose pin
output <- hGetContents pout
when (output==output) $ return ()
hClose pout
hClose perr
waitForProcess ph
return output
-- | Starts dmenu on the current screen. Requires this patch to dmenu:
-- <http://www.jcreigh.com/dmenu/dmenu-3.2-xinerama.patch>
dmenuXinerama :: [String] -> X String

30
Dzen.hs
View File

@@ -14,38 +14,10 @@
module XMonadContrib.Dzen (dzen, dzenScreen) where
import System.Posix.Process (forkProcess, getProcessStatus, createSession)
import System.IO
import System.Process
import System.Exit
import Control.Concurrent (threadDelay)
import Control.Monad.State
import qualified StackSet as W
import XMonad
-- wait is in us
runProcessWithInputAndWait :: FilePath -> [String] -> String -> Int -> IO ()
runProcessWithInputAndWait cmd args input timeout = do
pid <- forkProcess $ do
forkProcess $ do -- double fork it over to init
createSession
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
hFlush pin
threadDelay timeout
hClose pin
-- output <- hGetContents pout
-- when (output==output) $ return ()
hClose pout
hClose perr
waitForProcess ph
return ()
exitWith ExitSuccess
return ()
getProcessStatus True False pid
return ()
import XMonadContrib.Run
curScreen :: X ScreenId
curScreen = (W.screen . W.current) `liftM` gets windowset

View File

@@ -60,7 +60,6 @@ import XMonadContrib.ResizableTile ()
import XMonadContrib.Roledex ()
import XMonadContrib.RotSlaves ()
import XMonadContrib.RotView ()
import XMonadContrib.RunInXTerm ()
import XMonadContrib.SetWMName ()
import XMonadContrib.ShellPrompt ()
import XMonadContrib.SimpleDate ()

84
Run.hs Normal file
View File

@@ -0,0 +1,84 @@
-----------------------------------------------------------------------------
-- |
-- Module : XMonadContrib.Run
-- Copyright : (C) 2007 Spencer Janssen, Andrea Rossato, glasser@mit.edu
-- License : BSD-style (see LICENSE)
--
-- Maintainer : Christian Thiemann <mail@christian-thiemann.de>
-- Stability : unstable
-- Portability : unportable
--
-- This modules provides several commands to run an external process.
-- It is composed of functions formerly defined in XMonadContrib.Dmenu (by
-- Spenver Jannsen), XMonadContrib.Dzen (by glasser@mit.edu) and
-- XMonadContrib.RunInXTerm (by Andrea Rossato).
--
-----------------------------------------------------------------------------
module XMonadContrib.Run (
-- * Usage
-- $usage
runInXTerm,
runProcessWithInput,
runProcessWithInputAndWait
) where
import XMonad
import Control.Concurrent (threadDelay)
import Control.Monad.State
import System.Environment
import System.Exit
import System.IO
import System.Posix.Process (forkProcess, getProcessStatus, createSession)
import System.Process
-- $usage
-- For an example usage of runInXTerm see XMonadContrib.SshPrompt
--
-- For an example usage of runProcessWithInput see
-- XMonadContrib.{DirectoryPrompt,Dmenu,ShellPrompt,WmiiActions,WorkspaceDir}
--
-- For an example usage of runProcessWithInputAndWait see XMonadContrib.Dzen
-- | Returns Just output if the command succeeded, and Nothing if it didn't.
-- This corresponds to dmenu's notion of exit code 1 for a cancelled invocation.
runProcessWithInput :: FilePath -> [String] -> String -> IO String
runProcessWithInput cmd args input = do
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
hClose pin
output <- hGetContents pout
when (output==output) $ return ()
hClose pout
hClose perr
waitForProcess ph
return output
-- wait is in us
runProcessWithInputAndWait :: FilePath -> [String] -> String -> Int -> IO ()
runProcessWithInputAndWait cmd args input timeout = do
pid <- forkProcess $ do
forkProcess $ do -- double fork it over to init
createSession
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
hFlush pin
threadDelay timeout
hClose pin
-- output <- hGetContents pout
-- when (output==output) $ return ()
hClose pout
hClose perr
waitForProcess ph
return ()
exitWith ExitSuccess
return ()
getProcessStatus True False pid
return ()
runInXTerm :: String -> X ()
runInXTerm com = do
c <- io $ catch (getEnv "XTERMCMD") (const $ return "xterm")
spawn ("exec " ++ c ++ " -e " ++ com)

View File

@@ -22,7 +22,7 @@ module XMonadContrib.ShellPrompt (
import XMonad
import XMonadContrib.XPrompt
import XMonadContrib.Dmenu
import XMonadContrib.Run
import Control.Monad
import Data.List

View File

@@ -26,7 +26,8 @@ module XMonadContrib.WmiiActions (
) where
import XMonad
import XMonadContrib.Dmenu (dmenu, dmenuXinerama, runProcessWithInput)
import XMonadContrib.Dmenu (dmenu, dmenuXinerama)
import XMonadContrib.Run (runProcessWithInput)
import Control.Monad (filterM, liftM, liftM2)
import System.Directory (getDirectoryContents, doesFileExist, getPermissions, executable)

View File

@@ -33,7 +33,7 @@ import System.Directory ( setCurrentDirectory )
import XMonad
import Operations ( sendMessage )
import XMonadContrib.Dmenu ( runProcessWithInput )
import XMonadContrib.Run ( runProcessWithInput )
import XMonadContrib.XPrompt ( XPConfig )
import XMonadContrib.DirectoryPrompt ( directoryPrompt )
import XMonadContrib.LayoutModifier