scroll-1.20150314: unix/Pager.hs
module Pager where
import System.IO
import System.Posix.IO
import System.Posix.Terminal
import Control.Applicative
-- If stdin is not connected to a tty, we're being used as a pager with
-- output piped in. The content of stdin is sucked in and returned for
-- paging, and stdin is re-opened from the terminal device.
stdinPager :: IO (Maybe String)
stdinPager = go =<< queryTerminal stdInput
where
go True = return Nothing
go False = do
stdoutisterm <- queryTerminal stdOutput
if stdoutisterm
then do
term <- getTerminalName stdOutput
oldstdin <- dup stdInput
closeFd stdInput
newstdin <- openFd term ReadOnly Nothing defaultFileFlags
_ <- dupTo newstdin stdInput
Just <$> (hGetContents =<< fdToHandle oldstdin)
else error "stdout is not a terminal"