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
readListPrec :: ReadPrec [CommandReader]
$creadListPrec :: ReadPrec [CommandReader]
readPrec :: ReadPrec CommandReader
$creadPrec :: ReadPrec CommandReader
readList :: ReadS [CommandReader]
$creadList :: ReadS [CommandReader]
readsPrec :: Int -> ReadS CommandReader
$creadsPrec :: Int -> ReadS 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
showList :: [CommandReader] -> ShowS
$cshowList :: [CommandReader] -> ShowS
show :: CommandReader -> String
$cshow :: CommandReader -> String
showsPrec :: Int -> CommandReader -> ShowS
$cshowsPrec :: Int -> 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
(Handle
hstdin, Handle
hstdout, Handle
hstderr, ProcessHandle
ph) <- String -> IO (Handle, Handle, Handle, ProcessHandle)
runInteractiveCommand String
p
Handle -> IO ()
hClose Handle
hstdin
Handle -> IO ()
hClose Handle
hstderr
Handle -> Bool -> IO ()
hSetBinaryMode Handle
hstdout Bool
False
Handle -> BufferMode -> IO ()
hSetBuffering Handle
hstdout BufferMode
LineBuffering
ProcessHandle -> IO () -> IO ()
forall a. ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph (Handle -> IO String
hGetLine Handle
hstdout IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ()
cb)
where forever :: ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a =
do IO a
a
Maybe ExitCode
ec <- ProcessHandle -> IO (Maybe ExitCode)
getProcessExitCode ProcessHandle
ph
case Maybe ExitCode
ec of
Maybe ExitCode
Nothing -> ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a
Just ExitCode
_ -> String -> IO ()
cb String
"EXITED"