{-# LANGUAGE RecordWildCards #-} module Screen (Screen(..), setScreen, withScreen) where import Control.Exception import Data.List import System.IO data Screen = Screen { stdinEcho :: Bool , stdinBufferMode :: BufferMode , stdoutBufferMode :: BufferMode , decsetPm :: [Int] , decrstPm :: [Int] } setScreen :: Screen -> IO Screen setScreen Screen{..} = get <* set where get = Screen <$> hGetEcho stdin <*> hGetBuffering stdin <*> hGetBuffering stdout <*> pure decrstPm <*> pure decsetPm set = do hSetEcho stdin stdinEcho hSetBuffering stdin stdinBufferMode hSetBuffering stdout stdoutBufferMode hPutStr stdout $ "\ESC[?" ++ intercalate ";" (map show decsetPm) ++ "h" hPutStr stdout $ "\ESC[?" ++ intercalate ";" (map show decrstPm) ++ "l" hFlush stdout withScreen :: Screen -> (Screen -> IO a) -> IO a withScreen s = bracket (setScreen s) setScreen