module Graphics.Vty.Output.XTermColor ( reserveTerminal )
where
import Graphics.Vty.Output.Interface
import qualified Graphics.Vty.Output.TerminfoBased as TerminfoBased
import Blaze.ByteString.Builder (writeToByteString)
import Blaze.ByteString.Builder.Word (writeWord8)
import Control.Applicative
import Control.Monad (void)
import Control.Monad.Trans
import Data.Foldable (foldMap)
import System.Posix.IO (fdWrite)
import System.Posix.Types (Fd)
reserveTerminal :: ( Applicative m, MonadIO m ) => String -> Fd -> m Output
reserveTerminal variant outFd = liftIO $ do
let flushedPut = void . fdWrite outFd
let variant' = if variant == "xterm-color" then "xterm" else variant
flushedPut setUtf8CharSet
t <- TerminfoBased.reserveTerminal variant' outFd
let t' = t
{ terminalID = terminalID t ++ " (xterm-color)"
, releaseTerminal = do
liftIO $ flushedPut setDefaultCharSet
releaseTerminal t
, mkDisplayContext = \tActual r -> do
dc <- mkDisplayContext t tActual r
return $ dc { inlineHack = xtermInlineHack t' }
}
return t'
setUtf8CharSet, setDefaultCharSet :: String
setUtf8CharSet = "\ESC%G"
setDefaultCharSet = "\ESC%@"
xtermInlineHack :: Output -> IO ()
xtermInlineHack t = do
let writeReset = foldMap (writeWord8.toEnum.fromEnum) "\ESC[K"
outputByteBuffer t $ writeToByteString writeReset