{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_HADDOCK hide #-}
module Imj.Graphics.Render.Delta.Console
( ConsoleConfig(..)
, configureConsoleFor
, restoreConsoleSettings
, runThenRestoreConsoleSettings
) where
import Imj.Prelude
import Control.Exception( finally )
import System.Console.Terminal.Size( size , Window(..))
import System.Console.ANSI( clearScreen, hideCursor
, setSGR, setCursorPosition, showCursor )
import System.IO( hSetBuffering
, hGetBuffering
, hSetEcho
, BufferMode( .. )
, stdin
, stdout )
data ConsoleConfig = Gaming | Editing
configureConsoleFor :: ConsoleConfig -> BufferMode -> IO ()
configureConsoleFor config stdoutMode =
hSetBuffering stdout stdoutMode >>
case config of
Gaming -> do
hSetEcho stdin False
hideCursor
clearScreen
let requiredInputBuffering = NoBuffering
initialIb <- hGetBuffering stdin
hSetBuffering stdin requiredInputBuffering
ib <- hGetBuffering stdin
when (ib /= requiredInputBuffering) $
error $ "input buffering mode "
++ show initialIb
++ " could not be changed to "
++ show requiredInputBuffering
++ " instead it is now "
++ show ib
Editing -> do
hSetEcho stdin True
showCursor
setSGR []
size >>= maybe (return ()) (\(Window x _) -> setCursorPosition (pred x) 0)
hSetBuffering stdout LineBuffering
restoreConsoleSettings :: IO ()
restoreConsoleSettings =
configureConsoleFor Editing LineBuffering
runThenRestoreConsoleSettings :: IO a -> IO a
runThenRestoreConsoleSettings action =
action `finally` restoreConsoleSettings