aboutsummaryrefslogtreecommitdiffstats
path: root/Dmenu.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Dmenu.hs')
-rw-r--r--Dmenu.hs18
1 files changed, 11 insertions, 7 deletions
diff --git a/Dmenu.hs b/Dmenu.hs
index 222d668..e5542c9 100644
--- a/Dmenu.hs
+++ b/Dmenu.hs
@@ -21,6 +21,7 @@ module XMonadContrib.Dmenu (
import XMonad
import qualified StackSet as W
+import System.Exit
import System.Process
import System.IO
import Control.Monad.State
@@ -32,7 +33,9 @@ import Control.Monad.State
-- %import XMonadContrib.Dmenu
-runProcessWithInput :: FilePath -> [String] -> String -> IO String
+-- | 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 (Maybe String)
runProcessWithInput cmd args input = do
(pin, pout, perr, ph) <- runInteractiveProcess cmd args Nothing Nothing
hPutStr pin input
@@ -41,16 +44,17 @@ runProcessWithInput cmd args input = do
when (output==output) $ return ()
hClose pout
hClose perr
- waitForProcess ph
- return output
-
+ exitCode <- waitForProcess ph
+ case exitCode of
+ ExitSuccess -> return (Just output)
+ ExitFailure _ -> return Nothing
+
-- | 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
+dmenuXinerama :: [String] -> X (Maybe String)
dmenuXinerama opts = do
curscreen <- (fromIntegral . W.screen . W.current) `liftM` gets windowset :: X Int
io $ runProcessWithInput "dmenu" ["-xs", show (curscreen+1)] (unlines opts)
-dmenu :: [String] -> X String
+dmenu :: [String] -> X (Maybe String)
dmenu opts = io $ runProcessWithInput "dmenu" [] (unlines opts)
-