@@ -15,8 +15,9 @@ import qualified Graphics.Vty.Output.TerminfoBased as TerminfoBased
15import Blaze.ByteString.Builder (writeToByteString)
15import Blaze.ByteString.Builder (writeToByteString)
16import Blaze.ByteString.Builder.Word (writeWord8)
16import Blaze.ByteString.Builder.Word (writeWord8)
18−import Control.Monad (void)
18+import Control.Monad (void, when)
19import Control.Monad.Trans
19import Control.Monad.Trans
21import System.Posix.IO (fdWrite)
22import System.Posix.IO (fdWrite)
22import System.Posix.Types (Fd)
23import System.Posix.Types (Fd)
@@ -34,19 +35,42 @@ reserveTerminal variant outFd = liftIO $ do
34 -- xterm-color is broken.
35 -- xterm-color is broken.
35 let variant' = if variant == "xterm-color" then "xterm" else variant
36 let variant' = if variant == "xterm-color" then "xterm" else variant
36 flushedPut setUtf8CharSet
37 flushedPut setUtf8CharSet
37− flushedPut enableBracketedPastes
38− flushedPut requestMouseEvents
39 t <- TerminfoBased.reserveTerminal variant' outFd
38 t <- TerminfoBased.reserveTerminal variant' outFd
40+ mouseModeStatus <- newIORef False
41+ pasteModeStatus <- newIORef False
43+ let xtermSetMode t' m newStatus = do
44+ curStatus <- getModeStatus t' m
45+ when (newStatus /= curStatus) $
49+ True -> flushedPut requestMouseEvents
50+ False -> flushedPut disableMouseEvents
51+ writeIORef mouseModeStatus newStatus
52+ BracketedPaste -> liftIO $ do
54+ True -> flushedPut enableBracketedPastes
55+ False -> flushedPut disableBracketedPastes
56+ writeIORef pasteModeStatus newStatus
58+ xtermGetMode Mouse = liftIO $ readIORef mouseModeStatus
59+ xtermGetMode BracketedPaste = liftIO $ readIORef pasteModeStatus
40 let t' = t
61 let t' = t
41 { terminalID = terminalID t ++ " (xterm-color)"
62 { terminalID = terminalID t ++ " (xterm-color)"
42 , releaseTerminal = do
63 , releaseTerminal = do
43 liftIO $ flushedPut setDefaultCharSet
64 liftIO $ flushedPut setDefaultCharSet
44− liftIO $ flushedPut disableBracketedPastes
65+ setMode t' BracketedPaste False
45− liftIO $ flushedPut disableMouseEvents
66+ setMode t' Mouse False
46 releaseTerminal t
67 releaseTerminal t
47 , mkDisplayContext = \tActual r -> do
68 , mkDisplayContext = \tActual r -> do
48 dc <- mkDisplayContext t tActual r
69 dc <- mkDisplayContext t tActual r
49 return $ dc { inlineHack = xtermInlineHack t' }
70 return $ dc { inlineHack = xtermInlineHack t' }
71+ , supportsMode = const True
72+ , getModeStatus = xtermGetMode
73+ , setMode = xtermSetMode t'