diff options
author | Devin Mullins <me@twifkak.com> | 2007-10-06 09:09:59 +0200 |
---|---|---|
committer | Devin Mullins <me@twifkak.com> | 2007-10-06 09:09:59 +0200 |
commit | fcec780f4bf68073bfad76998b05bf8663e9b83f (patch) | |
tree | 7259dd31f4ec7a516ee63310bfbedb0bef6e9094 /Dmenu.hs | |
parent | 6ee3d30ce497d673bdc25592b846c14b4b660a17 (diff) | |
download | XMonadContrib-fcec780f4bf68073bfad76998b05bf8663e9b83f.tar.gz XMonadContrib-fcec780f4bf68073bfad76998b05bf8663e9b83f.tar.xz XMonadContrib-fcec780f4bf68073bfad76998b05bf8663e9b83f.zip |
change Dmenu functions to return IO/X (Maybe String)
dmenu exits with code 1 when you hit Escape, and I wanna create a contrib that
takes advantage of that.
This required changes in four contribs (Commands, DirectoryPrompt, ShellPrompt,
and WorkspaceDir), and might require changes in users' Configs. Also, I'm not
sure some of the changes I made to the client code are very Haskelly. Would
appreciate input there.
darcs-hash:20071006070959-78224-eeefb4300d6d3de7b199f2b1ad37ba43384e03f1.gz
Diffstat (limited to 'Dmenu.hs')
-rw-r--r-- | Dmenu.hs | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -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) - |