diff options
author | Spencer Janssen <sjanssen@cse.unl.edu> | 2007-11-19 04:03:53 +0100 |
---|---|---|
committer | Spencer Janssen <sjanssen@cse.unl.edu> | 2007-11-19 04:03:53 +0100 |
commit | d453a0add31502345c84d42defbc81d1f98c0e82 (patch) | |
tree | 1c12847a0f96b76a40494be10cf805675ed5d6e9 /XMonad | |
parent | 6a085c3da654d9f921af1799ad646112bc5b83cc (diff) | |
download | metatile-d453a0add31502345c84d42defbc81d1f98c0e82.tar metatile-d453a0add31502345c84d42defbc81d1f98c0e82.zip |
Factor out doubleFork logic
darcs-hash:20071119030353-a5988-935fc83135dc394c1e1a757f0232022b4de96f01
Diffstat (limited to 'XMonad')
-rw-r--r-- | XMonad/Core.hs | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/XMonad/Core.hs b/XMonad/Core.hs index d533bf6..e873848 100644 --- a/XMonad/Core.hs +++ b/XMonad/Core.hs @@ -270,9 +270,14 @@ catchIO f = liftIO (f `catch` \e -> hPrint stderr e >> hFlush stderr) -- | spawn. Launch an external application spawn :: MonadIO m => String -> m () -spawn x = liftIO $ do +spawn x = doubleFork $ executeFile "/bin/sh" False ["-c", x] Nothing + +-- | Double fork and execute an IO action (usually one of the exec family of +-- functions) +doubleFork :: MonadIO m => IO () -> m () +doubleFork m = liftIO $ do pid <- forkProcess $ do - forkProcess (createSession >> executeFile "/bin/sh" False ["-c", x] Nothing) + forkProcess (createSession >> m) exitWith ExitSuccess getProcessStatus True False pid return () @@ -324,14 +329,7 @@ recompile = do let msg = unlines $ ["Error detected while loading xmonad configuration file: " ++ src] ++ lines ghcErr ++ ["","Please check the file for errors."] - -- usual double fork for async processes, and no zombies. - -- careful to use exec directly, avoiding shell - -- interpreting chars in the command line args - pid <- forkProcess $ do - forkProcess $ createSession >> executeFile "xmessage" True [msg] Nothing - exitWith ExitSuccess - getProcessStatus True False pid - return () + doubleFork $ executeFile "xmessage" True [msg] Nothing -- | Run a side effecting action with the current workspace. Like 'when' but whenJust :: Monad m => Maybe a -> (a -> m ()) -> m () |