summaryrefslogtreecommitdiffstats
path: root/src/Much
diff options
context:
space:
mode:
Diffstat (limited to 'src/Much')
-rw-r--r--src/Much/Screen.hs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/Much/Screen.hs b/src/Much/Screen.hs
new file mode 100644
index 0000000..b93847f
--- /dev/null
+++ b/src/Much/Screen.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE RecordWildCards #-}
+module Much.Screen (Screen(..), setScreen, withScreen) where
+
+import Control.Exception
+import Data.List
+import System.IO
+
+
+data Screen = Screen
+ { inputEcho :: Bool
+ , inputBufferMode :: BufferMode
+ , outputBufferMode :: BufferMode
+ , decsetPm :: [Int]
+ , decrstPm :: [Int]
+ }
+
+setScreen :: Handle -> Handle -> Screen -> IO Screen
+setScreen i o Screen{..} = get <* set where
+ get = Screen <$> hGetEcho i
+ <*> hGetBuffering i
+ <*> hGetBuffering o
+ <*> pure decrstPm
+ <*> pure decsetPm
+ set = do
+ hSetEcho i inputEcho
+ hSetBuffering i inputBufferMode
+ hSetBuffering o outputBufferMode
+ hPutStr o $ "\ESC[?" ++ intercalate ";" (map show decsetPm) ++ "h"
+ hPutStr o $ "\ESC[?" ++ intercalate ";" (map show decrstPm) ++ "l"
+ hFlush o
+
+withScreen :: Handle -> Handle -> Screen -> (Screen -> IO a) -> IO a
+withScreen i o s = bracket (setScreen i o s) (setScreen i o)