Files
xmonad-contrib/Dmenu.hs
Devin Mullins beaead5256 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.
2007-10-06 07:09:59 +00:00

61 lines
2.0 KiB
Haskell

-----------------------------------------------------------------------------
-- |
-- Module : XMonadContrib.Dmenu
-- Copyright : (c) Spencer Janssen <sjanssen@cse.unl.edu>
-- License : BSD-style (see LICENSE)
--
-- Maintainer : Spencer Janssen <sjanssen@cse.unl.edu>
-- Stability : unstable
-- Portability : unportable
--
-- A convenient binding to dmenu.
--
-----------------------------------------------------------------------------
module XMonadContrib.Dmenu (
-- * Usage
-- $usage
dmenu, dmenuXinerama,
runProcessWithInput
) where
import XMonad
import qualified StackSet as W
import System.Exit
import System.Process
import System.IO
import Control.Monad.State
-- $usage
-- You can use this module with the following in your Config.hs file:
--
-- > import XMonadContrib.Dmenu
-- %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 (Maybe 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
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 (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 (Maybe String)
dmenu opts = io $ runProcessWithInput "dmenu" [] (unlines opts)