summaryrefslogtreecommitdiffstats
path: root/lib/Terminal.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Terminal.hs')
-rw-r--r--lib/Terminal.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/Terminal.hs b/lib/Terminal.hs
new file mode 100644
index 0000000..607ca23
--- /dev/null
+++ b/lib/Terminal.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE RecordWildCards #-}
+module Terminal
+ ( Config(..)
+ , setConfig
+ , withConfig
+ )
+ where
+
+import Control.Exception
+import Data.List
+import System.IO
+
+data Config = Config
+ { hin :: Handle
+ , hout :: Handle
+ , hinEcho :: Bool
+ , hinBufferMode :: BufferMode
+ , houtBufferMode :: BufferMode
+ , decsetPm :: [Int]
+ , decrstPm :: [Int]
+ }
+
+setConfig :: Config -> IO Config
+setConfig Config{..} = get <* set where
+ get = Config <$> pure hin
+ <*> pure hout
+ <*> hGetEcho hin
+ <*> hGetBuffering hin
+ <*> hGetBuffering hout
+ <*> pure decrstPm
+ <*> pure decsetPm
+ set = do
+ hSetEcho hin hinEcho
+ hSetBuffering hin hinBufferMode
+ hSetBuffering hout houtBufferMode
+ hPutStr hout $ "\ESC[?" <> intercalate ";" (map show decsetPm) <> "h"
+ hPutStr hout $ "\ESC[?" <> intercalate ";" (map show decrstPm) <> "l"
+ hFlush hout
+
+withConfig :: Config -> IO a -> IO a
+withConfig s = bracket (setConfig s) setConfig . const