diff options
| author | tv <tv@krebsco.de> | 2026-03-14 11:40:37 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-03-14 11:40:41 +0100 |
| commit | 3c7c985982ee3de6b710cca1b75cdd82c531fe42 (patch) | |
| tree | a1415e2b8d5a98896ab51c0560b7379dc4400f8f /lib/Terminal.hs | |
Diffstat (limited to 'lib/Terminal.hs')
| -rw-r--r-- | lib/Terminal.hs | 41 |
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 |
