summaryrefslogtreecommitdiffstats
path: root/src/Much/Screen.hs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2022-04-05 21:39:55 +0200
committertv <tv@krebsco.de>2022-04-05 22:06:40 +0200
commitf4cdf79bd4a75e9eafe68b9a908f4cc68682b7ef (patch)
treed2cb50df2344d97042b2c006ee39811e2b87511d /src/Much/Screen.hs
parent032cb86ff8108eb4915a692015da344a41f78506 (diff)
boom
Diffstat (limited to 'src/Much/Screen.hs')
-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)