vty 5.2.11 → 5.3
raw patch · 28 files changed
+146/−189 lines, 28 filesdep ~Cabaldep ~QuickChecknew-uploader
Dependency ranges changed: Cabal, QuickCheck
Files
- CHANGELOG +15/−2
- Demo.hs +1/−1
- README.md +14/−2
- dist/build/verify-attribute-opsStub/verify-attribute-opsStub-tmp/verify-attribute-opsStub.hs +0/−5
- dist/build/verify-crop-span-generationStub/verify-crop-span-generationStub-tmp/verify-crop-span-generationStub.hs +0/−5
- dist/build/verify-display-attributesStub/verify-display-attributesStub-tmp/verify-display-attributesStub.hs +0/−5
- dist/build/verify-empty-image-propsStub/verify-empty-image-propsStub-tmp/verify-empty-image-propsStub.hs +0/−5
- dist/build/verify-eval-terminfo-capsStub/verify-eval-terminfo-capsStub-tmp/verify-eval-terminfo-capsStub.hs +0/−5
- dist/build/verify-image-opsStub/verify-image-opsStub-tmp/verify-image-opsStub.hs +0/−5
- dist/build/verify-image-transStub/verify-image-transStub-tmp/verify-image-transStub.hs +0/−5
- dist/build/verify-inlineStub/verify-inlineStub-tmp/verify-inlineStub.hs +0/−5
- dist/build/verify-layers-span-generationStub/verify-layers-span-generationStub-tmp/verify-layers-span-generationStub.hs +0/−5
- dist/build/verify-parse-terminfo-capsStub/verify-parse-terminfo-capsStub-tmp/verify-parse-terminfo-capsStub.hs +0/−5
- dist/build/verify-simple-span-generationStub/verify-simple-span-generationStub-tmp/verify-simple-span-generationStub.hs +0/−5
- dist/build/verify-terminalStub/verify-terminalStub-tmp/verify-terminalStub.hs +0/−5
- dist/build/verify-using-mock-terminalStub/verify-using-mock-terminalStub-tmp/verify-using-mock-terminalStub.hs +0/−5
- dist/build/verify-utf8-widthStub/verify-utf8-widthStub-tmp/verify-utf8-widthStub.hs +0/−5
- src/Graphics/Vty/Config.hs +4/−4
- src/Graphics/Vty/Image.hs +2/−1
- src/Graphics/Vty/Inline/Unsafe.hs +1/−1
- src/Graphics/Vty/Input.hs +3/−1
- src/Graphics/Vty/Input/Loop.hs +21/−14
- src/Graphics/Vty/Output.hs +7/−18
- src/Graphics/Vty/Output/Interface.hs +19/−19
- src/Graphics/Vty/PictureToSpans.hs +1/−2
- test/Verify/Graphics/Vty/Output.hs +6/−5
- test/VerifyUsingMockTerminal.hs +5/−5
- vty.cabal +47/−44
CHANGELOG view
@@ -1,5 +1,18 @@-5.2.12- - unreleased+5.3+ - Upgraded QuickCheck dependency to 2.7+ - The standard IO Config (standardIOConfig) was overriding any provided application config.+ In addition, the inputFd and outputFd could not be changed if mkVty was used.+ Fixed.+ - Correct handling of display attributes at end of line. The output attributes are set to default+ at the end of content for the line and at the start of a new line. Previously the current+ attribute would extend to the next start of content. This was odd to reason about and was the+ cause of https://github.com/coreyoconnor/vty/issues/76+ IIRC Yi requires the old behavior to display the selection region correctly.+ - shutdown of the input thread is now performed using killThread and synchronization on an MVar.+ For correct handling of the terminal read vmin and vtime the read must be a blocking read on an+ OS thread. This places a threadWaitRead, which will be interrupted by the killThread, prior to+ the uninterruptable read. An alternative would be to re-import the read foreign call as+ interruptable. 5.2.11 - deepseq bounds increased for tests.
Demo.hs view
@@ -20,7 +20,7 @@ main = do vty <- if True -- change to false for emacs-like input processing then mkVty def- else mkVty (def { vmin = Just 2, vtime = Just 100 } )+ else mkVty (def { vmin = Just 2, vtime = Just 300 } ) _ <- execRWST (vtyInteract False) vty Seq.empty shutdown vty
README.md view
@@ -1,8 +1,20 @@-vty is a terminal interface library.+[](https://travis-ci.org/coreyoconnor/vty) -Project is hosted on github.com: https://github.com/coreyoconnor/vty+`vty` is a terminal interface library. +This project is hosted on github.com: https://github.com/coreyoconnor/vty++Install via `git` with:++``` git clone git://github.com/coreyoconnor/vty.git+```++Install via `cabal` with:++```+cabal install vty+``` # Features
− dist/build/verify-attribute-opsStub/verify-attribute-opsStub-tmp/verify-attribute-opsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyAttributeOps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-crop-span-generationStub/verify-crop-span-generationStub-tmp/verify-crop-span-generationStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyCropSpanGeneration ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-display-attributesStub/verify-display-attributesStub-tmp/verify-display-attributesStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyDisplayAttributes ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-empty-image-propsStub/verify-empty-image-propsStub-tmp/verify-empty-image-propsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyEmptyImageProps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-eval-terminfo-capsStub/verify-eval-terminfo-capsStub-tmp/verify-eval-terminfo-capsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyEvalTerminfoCaps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-image-opsStub/verify-image-opsStub-tmp/verify-image-opsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyImageOps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-image-transStub/verify-image-transStub-tmp/verify-image-transStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyImageTrans ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-inlineStub/verify-inlineStub-tmp/verify-inlineStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyInline ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-layers-span-generationStub/verify-layers-span-generationStub-tmp/verify-layers-span-generationStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyLayersSpanGeneration ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-parse-terminfo-capsStub/verify-parse-terminfo-capsStub-tmp/verify-parse-terminfo-capsStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyParseTerminfoCaps ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-simple-span-generationStub/verify-simple-span-generationStub-tmp/verify-simple-span-generationStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifySimpleSpanGeneration ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-terminalStub/verify-terminalStub-tmp/verify-terminalStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyOutput ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-using-mock-terminalStub/verify-using-mock-terminalStub-tmp/verify-using-mock-terminalStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyUsingMockTerminal ( tests )-main :: IO ()-main = stubMain tests
− dist/build/verify-utf8-widthStub/verify-utf8-widthStub-tmp/verify-utf8-widthStub.hs
@@ -1,5 +0,0 @@-module Main ( main ) where-import Distribution.Simple.Test.LibV09 ( stubMain )-import VerifyUtf8Width ( tests )-main :: IO ()-main = stubMain tests
src/Graphics/Vty/Config.hs view
@@ -139,8 +139,8 @@ , vtime = vtime c1 <|> vtime c0 , debugLog = debugLog c1 <|> debugLog c0 , inputMap = inputMap c0 <> inputMap c1- , inputFd = inputFd c1 <|> inputFd c1- , outputFd = outputFd c1 <|> outputFd c1+ , inputFd = inputFd c1 <|> inputFd c0+ , outputFd = outputFd c1 <|> outputFd c0 , termName = termName c1 <|> termName c0 } @@ -151,8 +151,8 @@ userConfig = do configFile <- (mappend <$> getAppUserDataDirectory "vty" <*> pure "/config") >>= parseConfigFile overrideConfig <- maybe (return def) parseConfigFile =<< getEnv "VTY_CONFIG_FILE"- base <- (<> configFile <> overrideConfig) <$> standardIOConfig- (mappend base) <$> overrideEnvConfig+ let base = configFile <> overrideConfig+ mappend base <$> overrideEnvConfig overrideEnvConfig :: IO Config overrideEnvConfig = do
src/Graphics/Vty/Image.hs view
@@ -184,7 +184,8 @@ where w = imageWidth i + l h = imageHeight i --- | translates an image by padding or cropping the top and left.+-- | translates an image by padding or cropping the left and top. First param is amount to translate+-- left. Second param is amount to translate top. -- -- This can have an unexpected effect: Translating an image to less than (0,0) then to greater than -- (0,0) will crop the image.
src/Graphics/Vty/Inline/Unsafe.hs view
@@ -61,7 +61,7 @@ mout <- readIORef globalOutput out <- case mout of Nothing -> do- config <- (<>) <$> userConfig <*> mkDupeConfig+ config <- mappend <$> userConfig <*> mkDupeConfig out <- outputForConfig config writeIORef globalOutput (Just out) return out
src/Graphics/Vty/Input.hs view
@@ -145,6 +145,8 @@ #if !(MIN_VERSION_base(4,8,0)) import Data.Functor ((<$>)) import Data.Monoid+#else+import Data.Monoid ((<>)) #endif -- | Set up the terminal with file descriptor `inputFd` for input. Returns a 'Input'.@@ -201,4 +203,4 @@ _ <- installHandler continueProcess Ignore Nothing unsetAttrs }-inputForConfig config = mappend config <$> standardIOConfig >>= inputForConfig+inputForConfig config = (<> config) <$> standardIOConfig >>= inputForConfig
src/Graphics/Vty/Input/Loop.hs view
@@ -19,6 +19,7 @@ import Control.Applicative import Control.Concurrent+import Control.Exception (mask, try, SomeException) import Control.Lens import Control.Monad (when, mzero, forM_) import Control.Monad.IO.Class (liftIO)@@ -65,7 +66,6 @@ { _unprocessedBytes :: String , _appliedConfig :: Config , _inputBuffer :: InputBuffer- , _stopRequestRef :: IORef Bool , _classifier :: String -> KClass } @@ -88,7 +88,7 @@ validEvents <- many parseEvent forM_ validEvents emit dropInvalid- stopIfRequested <|> loopInputProcessor+ loopInputProcessor addBytesToProcess :: String -> InputM () addBytesToProcess block = unprocessedBytes <>= block@@ -115,6 +115,11 @@ bufferPtr <- use $ inputBuffer.ptr maxBytes <- use $ inputBuffer.size stringRep <- liftIO $ do+ -- The killThread used in shutdownInput will not interrupt the foreign call fdReadBuf uses+ -- this provides a location to be interrupted prior to the foreign call. If there is input+ -- on the FD then the fdReadBuf will return in a finite amount of time due to the vtime+ -- terminal setting.+ threadWaitRead fd bytesRead <- fdReadBuf fd bufferPtr (fromIntegral maxBytes) if bytesRead > 0 then fmap (map $ chr . fromIntegral) $ peekArray (fromIntegral bytesRead) bufferPtr@@ -147,18 +152,12 @@ logMsg "dropping input bytes" unprocessedBytes .= [] -stopIfRequested :: InputM ()-stopIfRequested = do- True <- (liftIO . readIORef) =<< use stopRequestRef- return ()--runInputProcessorLoop :: ClassifyMap -> Input -> IORef Bool -> IO ()-runInputProcessorLoop classifyTable input stopFlag = do+runInputProcessorLoop :: ClassifyMap -> Input -> IO ()+runInputProcessorLoop classifyTable input = do let bufferSize = 1024 allocaArray bufferSize $ \(bufferPtr :: Ptr Word8) -> do s0 <- InputState [] <$> readIORef (_configRef input) <*> pure (InputBuffer bufferPtr bufferSize)- <*> pure stopFlag <*> pure (classify classifyTable) runReaderT (evalStateT loopInputProcessor s0) input @@ -192,15 +191,23 @@ let Just fd = inputFd config setFdOption fd NonBlockingRead False applyConfig fd config- stopFlag <- newIORef False+ stopSync <- newEmptyMVar input <- Input <$> newChan- <*> pure (writeIORef stopFlag True)+ <*> pure (return ()) <*> newIORef config <*> maybe (return Nothing) (\f -> Just <$> openFile f AppendMode) (debugLog config) logInitialInputState input classifyTable- _ <- forkOS $ runInputProcessorLoop classifyTable input stopFlag- return input+ inputThread <- forkOSFinally (runInputProcessorLoop classifyTable input)+ (\_ -> putMVar stopSync ())+ let killAndWait = do+ killThread inputThread+ takeMVar stopSync+ return $ input { shutdownInput = killAndWait } foreign import ccall "vty_set_term_timing" setTermTiming :: Fd -> Int -> Int -> IO ()++forkOSFinally :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId+forkOSFinally action and_then =+ mask $ \restore -> forkOS $ try (restore action) >>= and_then
src/Graphics/Vty/Output.hs view
@@ -1,11 +1,5 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE NamedFieldPuns #-}--#ifndef MIN_VERSION_base-#defined MIN_VERSION_base(x,y,z) 1-#endif- -- | Output interface. -- -- Access to the current terminal or a specific terminal device.@@ -13,8 +7,8 @@ -- See also: -- -- 1. "Graphics.Vty.Output": This instantiates an abtract interface to the terminal interface based--- on the TERM and COLORTERM environment variables. --- +-- on the TERM and COLORTERM environment variables.+-- -- 2. "Graphics.Vty.Output.Interface": Defines the generic interface all terminals need to implement. -- -- 3. "Graphics.Vty.Output.TerminfoBased": Defines a terminal instance that uses terminfo for all@@ -23,7 +17,7 @@ -- -- 4. "Graphics.Vty.Output.XTermColor": This module contains an interface suitable for xterm-like -- terminals. These are the terminals where TERM == xterm. This does use terminfo for as many--- control codes as possible. +-- control codes as possible. module Graphics.Vty.Output ( module Graphics.Vty.Output , Output(..) -- \todo hide constructors , AssumedState(..)@@ -33,7 +27,6 @@ ) where - import Graphics.Vty.Prelude import Graphics.Vty.Config@@ -47,10 +40,7 @@ import Control.Monad.Trans import Data.List (isPrefixOf)--#if !(MIN_VERSION_base(4,8,0))-import Data.Monoid (mappend)-#endif+import Data.Monoid ((<>)) -- | Returns a `Output` for the terminal specified in `Config` --@@ -76,9 +66,9 @@ -- Not an xterm-like terminal. try for generic terminfo. else TerminfoBased.reserveTerminal termName fd return t-outputForConfig config = mappend config <$> standardIOConfig >>= outputForConfig+outputForConfig config = (<> config) <$> standardIOConfig >>= outputForConfig --- | Sets the cursor position to the given output column and row. +-- | Sets the cursor position to the given output column and row. -- -- This is not necessarially the same as the character position with the same coordinates. -- Characters can be a variable number of columns in width.@@ -98,11 +88,10 @@ bounds <- displayBounds t dc <- displayContext t bounds liftIO $ outputByteBuffer t $ writeToByteString $ writeHideCursor dc- + -- | Shows the cursor showCursor :: MonadIO m => Output -> m () showCursor t = do bounds <- displayBounds t dc <- displayContext t bounds liftIO $ outputByteBuffer t $ writeToByteString $ writeShowCursor dc-
src/Graphics/Vty/Output/Interface.hs view
@@ -149,7 +149,6 @@ (Vector.toList ops) -- build the Write corresponding to the output image out = (if manipCursor then writeHideCursor dc else mempty)- `mappend` writeDefaultAttr dc `mappend` writeOutputOps dc initialAttr diffs ops `mappend` (case picCursor pic of@@ -167,30 +166,31 @@ writeIORef (assumedStateRef $ contextDevice dc) as' writeOutputOps :: DisplayContext -> FixedAttr -> [Bool] -> DisplayOps -> Write-writeOutputOps dc inFattr diffs ops =- let (_, out, _, _) = Vector.foldl' writeOutputOps' - (0, mempty, inFattr, diffs) +writeOutputOps dc initialAttr diffs ops =+ let (_, out, _) = Vector.foldl' writeOutputOps'+ (0, mempty, diffs) ops in out where - writeOutputOps' (y, out, fattr, True : diffs') spanOps- = let (spanOut, fattr') = writeSpanOps dc y fattr spanOps- in (y+1, out `mappend` spanOut, fattr', diffs')- writeOutputOps' (y, out, fattr, False : diffs') _spanOps- = (y + 1, out, fattr, diffs')- writeOutputOps' (_y, _out, _fattr, []) _spanOps+ writeOutputOps' (y, out, True : diffs') spanOps+ = let spanOut = writeSpanOps dc y initialAttr spanOps+ out' = out `mappend` spanOut+ in (y+1, out', diffs')+ writeOutputOps' (y, out, False : diffs') _spanOps+ = (y + 1, out, diffs')+ writeOutputOps' (_y, _out, []) _spanOps = error "vty - output spans without a corresponding diff." -writeSpanOps :: DisplayContext -> Int -> FixedAttr -> SpanOps -> (Write, FixedAttr)-writeSpanOps dc y inFattr spanOps =+writeSpanOps :: DisplayContext -> Int -> FixedAttr -> SpanOps -> Write+writeSpanOps dc y initialAttr spanOps = -- The first operation is to set the cursor to the start of the row- let start = writeMoveCursor dc 0 y+ let start = writeMoveCursor dc 0 y `mappend` writeDefaultAttr dc -- then the span ops are serialized in the order specified- in Vector.foldl' (\(out, fattr) op -> case writeSpanOp dc op fattr of- (opOut, fattr') -> (out `mappend` opOut, fattr')- )- (start, inFattr)- spanOps+ in fst $ Vector.foldl' (\(out, fattr) op -> case writeSpanOp dc op fattr of+ (opOut, fattr') -> (out `mappend` opOut, fattr')+ )+ (start, initialAttr)+ spanOps writeSpanOp :: DisplayContext -> SpanOp -> FixedAttr -> (Write, FixedAttr) writeSpanOp dc (TextSpan attr _ _ str) fattr =@@ -201,7 +201,7 @@ `mappend` writeUtf8Text (T.encodeUtf8 $ TL.toStrict str) in (out, fattr') writeSpanOp _dc (Skip _) _fattr = error "writeSpanOp for Skip"-writeSpanOp dc (RowEnd _) fattr = (writeRowEnd dc, fattr)+writeSpanOp dc (RowEnd _) fattr = (writeDefaultAttr dc `mappend` writeRowEnd dc, fattr) -- | The cursor position is given in X,Y character offsets. Due to multi-column characters this -- needs to be translated to column, row positions.
src/Graphics/Vty/PictureToSpans.hs view
@@ -221,8 +221,7 @@ return () return outOps --- | Add the operations required to build a given image to the current set of row operations--- returns the number of columns and rows contributed to the output.+-- | Add the operations required to build a given image to the current set of row operations. startImageBuild :: Image -> BlitM s () startImageBuild image = do outOfBounds <- isOutOfBounds image <$> get
test/Verify/Graphics/Vty/Output.hs view
@@ -1,5 +1,7 @@ module Verify.Graphics.Vty.Output where +import Control.Applicative ((<$>))+ import Graphics.Vty.Output.Mock import qualified Data.ByteString as BS@@ -49,12 +51,11 @@ compareMockOutput :: MockData -> String -> IO Result compareMockOutput mockData expectedStr = do- outBytes <- readIORef mockData >>= return . UTF8.toRep- let expectedBytes :: BS.ByteString = UTF8.toRep $ UTF8.fromString expectedStr- if outBytes /= expectedBytes- then return $ failed { reason = "bytes\n" ++ show outBytes+ outStr <- UTF8.toString <$> readIORef mockData+ if outStr /= expectedStr+ then return $ failed { reason = "bytes\n" ++ outStr ++ "\nare not the expected bytes\n"- ++ show expectedBytes+ ++ expectedStr } else return succeeded
test/VerifyUsingMockTerminal.hs view
@@ -46,8 +46,8 @@ -- The mock output string that represents the output bytes a single line containing the T -- string: Followed by h - 1 lines of a change to the background attribute and then the -- background character- let expected = "HD" ++ "MA" ++ replicate (fromEnum w) 'T'- ++ concat (replicate (fromEnum h - 1) $ "MA" ++ replicate (fromEnum w) 'B')+ let expected = "H" ++ "MDA" ++ replicate (fromEnum w) 'T'+ ++ concat (replicate (fromEnum h - 1) $ "MDA" ++ replicate (fromEnum w) 'B') compareMockOutput mockData expected manyTRows :: MockWindow -> Property@@ -60,7 +60,7 @@ outputPicture dc pic -- The UTF8 string that represents the output bytes is h repeats of a move, 'M', followed by an -- attribute change. 'A', followed by w 'T's- let expected = "HD" ++ concat (replicate (fromEnum h) $ "MA" ++ replicate (fromEnum w) 'T')+ let expected = "H" ++ concat (replicate (fromEnum h) $ "MDA" ++ replicate (fromEnum w) 'T') compareMockOutput mockData expected manyTRowsCroppedWidth :: MockWindow -> Property@@ -73,7 +73,7 @@ outputPicture dc pic -- The UTF8 string that represents the output bytes is h repeats of a move, 'M', followed by an -- attribute change. 'A', followed by w 'T's- let expected = "HD" ++ concat (replicate (fromEnum h) $ "MA" ++ replicate (fromEnum w) 'T')+ let expected = "H" ++ concat (replicate (fromEnum h) $ "MDA" ++ replicate (fromEnum w) 'T') compareMockOutput mockData expected manyTRowsCroppedHeight :: MockWindow -> Property@@ -86,7 +86,7 @@ outputPicture dc pic -- The UTF8 string that represents the output bytes is h repeats of a move, 'M', followed by an -- attribute change. 'A', followed by w count 'T's- let expected = "HD" ++ concat (replicate (fromEnum h) $ "MA" ++ replicate (fromEnum w) 'T')+ let expected = "H" ++ concat (replicate (fromEnum h) $ "MDA" ++ replicate (fromEnum w) 'T') compareMockOutput mockData expected tests :: IO [Test]
vty.cabal view
@@ -1,5 +1,5 @@ name: vty-version: 5.2.11+version: 5.3 license: BSD3 license-file: LICENSE author: AUTHORS@@ -8,30 +8,33 @@ category: User Interfaces synopsis: A simple terminal UI library description:- vty is terminal GUI library in the niche of ncurses. It is intended to be easy to use, have no- confusing corner cases, and good support for common terminal types.+ vty is terminal GUI library in the niche of ncurses. It is intended to+ be easy to use, have no confusing corner cases, and good support for+ common terminal types. .- Included in the source distribution is a program test/interactive_terminal_test.hs that- demonstrates the various features. + Included in the source distribution is a program+ test/interactive_terminal_test.hs that demonstrates the various+ features. . Developers: See the "Graphics.Vty" module. . Users: See the "Graphics.Vty.Config" module. .- If your terminal is not behaving as expected the results of the vty-interactive-terminal-test- executable should be sent to the Vty maintainter to aid in debugging the issue.+ If your terminal is not behaving as expected the results of the+ vty-interactive-terminal-test executable should be sent to the Vty+ maintainter to aid in debugging the issue. .- Notable infelicities: Assumes UTF-8 character encoding support by the terminal; Poor signal- handling; Requires terminfo.+ Notable infelicities: Assumes UTF-8 character encoding support by the+ terminal; Poor signal handling; Requires terminfo. .- Project is hosted on github.com: https:\/\/github.com\/coreyoconnor\/vty+ This project is hosted on github.com: <https://github.com/coreyoconnor/vty> .- git clone git:\/\/github.com\/coreyoconnor\/vty.git+ > git clone git://github.com/coreyoconnor/vty.git . © 2006-2007 Stefan O'Rear; BSD3 license. . © Corey O'Connor; BSD3 license.-cabal-version: >= 1.18.0+cabal-version: >= 1.20.0 build-type: Simple data-files: README.md, TODO,@@ -136,8 +139,8 @@ hs-source-dirs: test test-module: VerifyAttributeOps build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -168,8 +171,8 @@ Verify.Graphics.Vty.Output build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -201,8 +204,8 @@ Verify.Graphics.Vty.Output build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -235,8 +238,8 @@ Verify.Graphics.Vty.Span build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -261,8 +264,8 @@ other-modules: Verify build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -288,8 +291,8 @@ Verify.Graphics.Vty.Output build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, blaze-builder >= 0.3.3.2 && < 0.5,@@ -318,8 +321,8 @@ Verify.Graphics.Vty.Image build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -346,8 +349,8 @@ Verify.Graphics.Vty.Image build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -373,8 +376,8 @@ Verify.Graphics.Vty.Output build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -401,8 +404,8 @@ Verify.Graphics.Vty.Output build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -433,8 +436,8 @@ Verify.Graphics.Vty.Span build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -465,8 +468,8 @@ Verify.Graphics.Vty.Span build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -497,8 +500,8 @@ Verify.Graphics.Vty.Span build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -523,8 +526,8 @@ other-modules: Verify build-depends: vty,- Cabal >= 1.18,- QuickCheck >= 2.4,+ Cabal >= 1.20,+ QuickCheck >= 2.7, random >= 1.0 && < 1.2, base >= 4 && < 5, bytestring,@@ -547,9 +550,9 @@ main-is: VerifyUsingMockInput.hs build-depends: vty,- Cabal >= 1.18,+ Cabal >= 1.20, data-default >= 0.5.3,- QuickCheck >= 2.4,+ QuickCheck >= 2.7, smallcheck == 1.*, quickcheck-assertions >= 0.1.1, test-framework == 0.8.*,@@ -580,10 +583,10 @@ main-is: VerifyConfig.hs build-depends: vty,- Cabal >= 1.18,+ Cabal >= 1.20, data-default >= 0.5.3, HUnit,- QuickCheck >= 2.4,+ QuickCheck >= 2.7, smallcheck == 1.*, quickcheck-assertions >= 0.1.1, test-framework == 0.8.*,