@@ -15,8 +15,9 @@ import qualified Graphics.Vty.Output.TerminfoBased as TerminfoBased
1515import Blaze.ByteString.Builder (writeToByteString)
1616import Blaze.ByteString.Builder.Word (writeWord8)
1717
18−import Control.Monad (void)
18+import Control.Monad (void, when)
1919import Control.Monad.Trans
20+import Data.IORef
2021
2122import System.Posix.IO (fdWrite)
2223import System.Posix.Types (Fd)
@@ -34,19 +35,42 @@ reserveTerminal variant outFd = liftIO $ do
3435 -- xterm-color is broken.
3536 let variant' = if variant == "xterm-color" then "xterm" else variant
3637 flushedPut setUtf8CharSet
37− flushedPut enableBracketedPastes
38− flushedPut requestMouseEvents
3938 t <- TerminfoBased.reserveTerminal variant' outFd
39+
40+ mouseModeStatus <- newIORef False
41+ pasteModeStatus <- newIORef False
42+
43+ let xtermSetMode t' m newStatus = do
44+ curStatus <- getModeStatus t' m
45+ when (newStatus /= curStatus) $
46+ case m of
47+ Mouse -> liftIO $ do
48+ case newStatus of
49+ True -> flushedPut requestMouseEvents
50+ False -> flushedPut disableMouseEvents
51+ writeIORef mouseModeStatus newStatus
52+ BracketedPaste -> liftIO $ do
53+ case newStatus of
54+ True -> flushedPut enableBracketedPastes
55+ False -> flushedPut disableBracketedPastes
56+ writeIORef pasteModeStatus newStatus
57+
58+ xtermGetMode Mouse = liftIO $ readIORef mouseModeStatus
59+ xtermGetMode BracketedPaste = liftIO $ readIORef pasteModeStatus
60+
4061 let t' = t
4162 { terminalID = terminalID t ++ " (xterm-color)"
4263 , releaseTerminal = do
4364 liftIO $ flushedPut setDefaultCharSet
44− liftIO $ flushedPut disableBracketedPastes
45− liftIO $ flushedPut disableMouseEvents
65+ setMode t' BracketedPaste False
66+ setMode t' Mouse False
4667 releaseTerminal t
4768 , mkDisplayContext = \tActual r -> do
4869 dc <- mkDisplayContext t tActual r
4970 return $ dc { inlineHack = xtermInlineHack t' }
71+ , supportsMode = const True
72+ , getModeStatus = xtermGetMode
73+ , setMode = xtermSetMode t'
5074 }
5175 return t'
5276