module Xmobar.Plugins.CommandReader(CommandReader(..)) where
import System.IO
import Xmobar.Run.Exec
import System.Process(runInteractiveCommand, getProcessExitCode)
data CommandReader = CommandReader String String
deriving (ReadPrec [CommandReader]
ReadPrec CommandReader
Int -> ReadS CommandReader
ReadS [CommandReader]
(Int -> ReadS CommandReader)
-> ReadS [CommandReader]
-> ReadPrec CommandReader
-> ReadPrec [CommandReader]
-> Read CommandReader
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS CommandReader
readsPrec :: Int -> ReadS CommandReader
$creadList :: ReadS [CommandReader]
readList :: ReadS [CommandReader]
$creadPrec :: ReadPrec CommandReader
readPrec :: ReadPrec CommandReader
$creadListPrec :: ReadPrec [CommandReader]
readListPrec :: ReadPrec [CommandReader]
Read, Int -> CommandReader -> ShowS
[CommandReader] -> ShowS
CommandReader -> String
(Int -> CommandReader -> ShowS)
-> (CommandReader -> String)
-> ([CommandReader] -> ShowS)
-> Show CommandReader
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CommandReader -> ShowS
showsPrec :: Int -> CommandReader -> ShowS
$cshow :: CommandReader -> String
show :: CommandReader -> String
$cshowList :: [CommandReader] -> ShowS
showList :: [CommandReader] -> ShowS
Show)
instance Exec CommandReader where
alias :: CommandReader -> String
alias (CommandReader String
_ String
a) = String
a
start :: CommandReader -> (String -> IO ()) -> IO ()
start (CommandReader String
p String
_) String -> IO ()
cb = do
(hstdin, hstdout, hstderr, ph) <- String -> IO (Handle, Handle, Handle, ProcessHandle)
runInteractiveCommand String
p
hClose hstdin
hClose hstderr
hSetBinaryMode hstdout False
hSetBuffering hstdout LineBuffering
forever ph (hGetLine hstdout >>= cb)
where forever :: ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a =
do IO a
a
ec <- ProcessHandle -> IO (Maybe ExitCode)
getProcessExitCode ProcessHandle
ph
case ec of
Maybe ExitCode
Nothing -> ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a
Just ExitCode
_ -> String -> IO ()
cb String
"EXITED"