on a9e45da help sign in
19 files changed+81−247
since splitsnapshots
unifiedsplit
CHANGELOG.md−38 demos/Demo.hs+4−12 src/Graphics/Vty/Attributes/Color.hs+3−67 src/Graphics/Vty/Config.hs+1−10 src/Graphics/Vty/Image.hs+1−1 src/Graphics/Vty/Image/Internal.hs+2−2 src/Graphics/Vty/Input.hs+2−2 src/Graphics/Vty/Input/Mouse.hs+2−2 src/Graphics/Vty/Output.hs+4−5 src/Graphics/Vty/Output/Interface.hs+17−22 src/Graphics/Vty/Output/Mock.hs+2−3 src/Graphics/Vty/Output/TerminfoBased.hs+33−66 src/Graphics/Vty/Output/XTermColor.hs+3−4 src/Graphics/Vty/PictureToSpans.hs+1−1 test/VerifyImageOps.hs+1−1 test/VerifyOutput.hs+2−6 test/VerifyUsingMockInput.hs+1−3 test/interactive_terminal_test.hs+1−1 vty.cabal+1−1
CHANGELOG.md−38
@@ -1,42 +1,4 @@
11
2−5.35.1
3−------
4−
5−Bug fixes:
6− * Fixed a build issue with a test program.
7−
8−5.35
9−----
10−
11−New features:
12− * Add support for 24-bit color (thanks @u-quark). This change
13− updates Vty to look at the `COLORTERM` environment variable that is
14− conventionally used to advertise support for truecolor escape
15− sequences. The change also updates the Vty demo to demonstrate
16− 24-bit colors. This change also adds a new data type, `ColorMode`,
17− to represent the color mode in use, as well as an `Output` interface
18− field, `outputColorMode`, to track the active color mode and use it
19− to clamp emitted color escape sequences to the active color range.
20−
21−API changes:
22− * All types in `Graphics.Vty.Input.Events` now have strict constructor
23− fields.
24− * Internal events are now wrapped in a new `InternalEvent` type to
25− improve how signal handling is done. This change modifies the `Input`
26− type's event channel API to produce `InternalEvents`, not `Events`.
27− The new `InternalEvent` either wraps `Event` with the `InputEvent`
28− constructor (the previous behavior) or indicates that Vty resumed
29− after handling a signal using the `ResumeAfterSignal` constructor.
30− This change avoids the previous use of `EvResize` with lazy exception
31− arguments as a sentinel value for `ResumeAfterSignal`.
32−
33−Other enhancements:
34− * Bracketed paste parsing performance has been greatly improved thanks
35− to benchmarking and optimization work by @iphydf. As part of that
36− work, Vty now uses bytestrings rather than Strings internally when
37− parsing input to look for events.
38− * The `\b` value is now interpreted as `KBS` (thanks @vglfr)
39−
4025.34
413----
424
demos/Demo.hs+4−12
@@ -31,8 +31,7 @@ introText = vertCat $ map (string defAttr)
3131 [ "this line is hidden by the top layer"
3232 , "The vty demo program will echo the events generated by the pressed keys."
3333 , "Below there is a 240 color box."
34− , "Followed by a description of the 16 color palette."
35− , "Followed by tones of red using a 24-bit palette."
34+ , "Followed by a description of the 16 color pallete."
3635 , "If the 240 color box is not visible then the terminal"
3736 , "claims 240 colors are not supported."
3837 , "Try setting TERM to xterm-256color"
@@ -43,19 +42,12 @@ introText = vertCat $ map (string defAttr)
4342 , "¯\\_(ツ)_/¯ ¯\\_(ツ)_/¯ ¯\\_(ツ)_/¯ ¯\\_(ツ)_/¯"
4443 ]
4544
46−splitColorImages :: [Image] -> [[Image]]
47−splitColorImages [] = []
48−splitColorImages is = (take 20 is ++ [string defAttr " "]) : (splitColorImages (drop 20 is))
49−
50−fullcolorbox :: Image
51−fullcolorbox = vertCat $ map horizCat $ splitColorImages colorImages
52− where
53− colorImages = map (\i -> string (currentAttr `withBackColor` linearColor i 0 0) " ") [0..255]
54−
5545colorbox_240 :: Image
5646colorbox_240 = vertCat $ map horizCat $ splitColorImages colorImages
5747 where
5848 colorImages = map (\i -> string (currentAttr `withBackColor` Color240 i) " ") [0..239]
49+ splitColorImages [] = []
50+ splitColorImages is = (take 20 is ++ [string defAttr " "]) : (splitColorImages (drop 20 is))
5951
6052colorbox_16 :: Image
6153colorbox_16 = border <|> column0 <|> border <|> column1 <|> border <|> column2 <|> border
@@ -78,7 +70,7 @@ updateDisplay = do
7870 "Press ESC to exit. Events for keys below."
7971 eventLog <- foldMap (string defAttr) <$> get
8072 let pic = picForImage (info <-> eventLog)
81− `addToBottom` (introText <-> colorbox_240 <|> colorbox_16 <|> fullcolorbox)
73+ `addToBottom` (introText <-> colorbox_240 <|> colorbox_16)
8274 vty <- ask
8375 liftIO $ update vty pic
8476
src/Graphics/Vty/Attributes/Color.hs+3−67
@@ -1,14 +1,8 @@
11{-# LANGUAGE DeriveGeneric #-}
22{-# LANGUAGE DeriveAnyClass #-}
3−{-# LANGUAGE MultiWayIf #-}
4−{-# LANGUAGE ScopedTypeVariables #-}
53
64module Graphics.Vty.Attributes.Color
75 ( Color(..)
8− , ColorMode(..)
9−
10− -- * Detecting Terminal Color Support
11− , detectColorMode
126
137 -- ** Fixed Colors
148 -- | Standard 8-color ANSI terminal color codes.
@@ -38,10 +32,7 @@ module Graphics.Vty.Attributes.Color
3832 , brightCyan
3933 , brightWhite
4034 -- ** Creating Colors From RGB
41− , linearColor
42− , srgbColor
4335 , rgbColor
44− , color240
4536 , module Graphics.Vty.Attributes.Color240
4637 )
4738where
@@ -49,11 +40,6 @@ where
4940import Data.Word
5041import GHC.Generics
5142import Control.DeepSeq
52−import System.Environment (lookupEnv)
53−
54−import qualified System.Console.Terminfo as Terminfo
55−import Control.Exception (catch)
56−import Data.Maybe
5743
5844import Graphics.Vty.Attributes.Color240
5945
@@ -95,7 +81,7 @@ import Graphics.Vty.Attributes.Color240
9581-- reported then the color reproduction will be incorrect.
9682--
9783-- If the terminal reports <= 16 colors then the 240 color palette
98−-- points are only mapped to the 8 color palette. I'm not sure of
84+-- points are only mapped to the 8 color pallete. I'm not sure of
9985-- the RGB points for the "bright" colors which is why they are not
10086-- addressable via the 240 color palette.
10187--
@@ -109,33 +95,9 @@ import Graphics.Vty.Attributes.Color240
10995-- terminfo but I don't know it.
11096--
11197-- Seriously, terminal color support is INSANE.
112−data Color = ISOColor !Word8 | Color240 !Word8 | RGBColor !Word8 !Word8 !Word8
98+data Color = ISOColor !Word8 | Color240 !Word8
11399 deriving ( Eq, Show, Read, Generic, NFData )
114100
115−data ColorMode
116− = NoColor
117− | ColorMode8
118− | ColorMode16
119− | ColorMode240 !Word8
120− | FullColor
121− deriving ( Eq, Show )
122−
123−detectColorMode :: String -> IO ColorMode
124−detectColorMode termName' = do
125− term <- catch (Just <$> Terminfo.setupTerm termName')
126− (\(_ :: Terminfo.SetupTermError) -> return Nothing)
127− let getCap cap = term >>= \t -> Terminfo.getCapability t cap
128− termColors = fromMaybe 0 $ getCap (Terminfo.tiGetNum "colors")
129− colorterm <- lookupEnv "COLORTERM"
130− return $ if
131− | termColors < 8 -> NoColor
132− | termColors < 16 -> ColorMode8
133− | termColors == 16 -> ColorMode16
134− | termColors < 256 -> ColorMode240 (fromIntegral termColors - 16)
135− | colorterm == Just "truecolor" -> FullColor
136− | colorterm == Just "24bit" -> FullColor
137− | otherwise -> ColorMode240 240
138−
139101black, red, green, yellow, blue, magenta, cyan, white :: Color
140102black = ISOColor 0
141103red = ISOColor 1
@@ -157,35 +119,9 @@ brightMagenta= ISOColor 13
157119brightCyan = ISOColor 14
158120brightWhite = ISOColor 15
159121
160−linearColor :: Integral i => i -> i -> i -> Color
161−linearColor r g b = RGBColor r' g' b'
162− where
163− r' = fromIntegral (clamp r) :: Word8
164− g' = fromIntegral (clamp g) :: Word8
165− b' = fromIntegral (clamp b) :: Word8
166− clamp = min 255 . max 0
167−
168−srgbColor :: Integral i => i -> i -> i -> Color
169−srgbColor r g b =
170− -- srgb to rgb transformation as described at
171− -- https://en.wikipedia.org/wiki/SRGB#The_reverse_transformation
172− --
173− -- TODO: it may be worth translating this to a lookup table, as with color240
174− let shrink n = fromIntegral n / 255 :: Double
175− -- called gamma^-1 in wiki
176− gamma u
177− | u <= 0.04045 = u/12.92
178− | otherwise = ((u + 0.055) / 1.055) ** 2.4
179− -- TODO: this is a slightly inaccurate conversion. is it worth doing proterly?
180− expand n = round (255 * n)
181− convert = expand . gamma . shrink
182− in RGBColor (convert r) (convert g) (convert b)
183−
184−color240 :: Integral i => i -> i -> i -> Color
185−color240 r g b = Color240 (rgbColorToColor240 r g b)
186122
187123-- | Create a Vty 'Color' (in the 240 color set) from an RGB triple.
188124-- This function is lossy in the sense that we only internally support 240 colors but the
189125-- #RRGGBB format supports 16^3 colors.
190126rgbColor :: Integral i => i -> i -> i -> Color
191−rgbColor = color240
127+rgbColor r g b = Color240 (rgbColorToColor240 r g b)
src/Graphics/Vty/Config.hs+1−10
@@ -3,7 +3,6 @@
33{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
44{-# LANGUAGE TypeOperators #-}
55{-# LANGUAGE ScopedTypeVariables #-}
6−{-# LANGUAGE LambdaCase, MultiWayIf #-}
76-- | Vty supports a configuration file format and associated 'Config'
87-- data type. The 'Config' can be provided to 'mkVty' to customize the
98-- application's use of Vty.
@@ -123,7 +122,6 @@ import Data.Semigroup (Semigroup(..))
123122import Data.Typeable (Typeable)
124123
125124import Graphics.Vty.Input.Events
126−import Graphics.Vty.Attributes.Color (ColorMode(..), detectColorMode)
127125
128126import GHC.Generics
129127
@@ -195,9 +193,6 @@ data Config =
195193 -- configuration specifies one. If no custom table is loaded
196194 -- (or if a load fails), the built-in character width table
197195 -- will be used.
198− , colorMode :: Maybe ColorMode
199− -- ^ The color mode used to know how many colors the terminal
200− -- supports.
201196 }
202197 deriving (Show, Eq)
203198
@@ -219,7 +214,6 @@ instance Semigroup Config where
219214 , termWidthMaps = termWidthMaps c1 <|> termWidthMaps c0
220215 , allowCustomUnicodeWidthTables =
221216 allowCustomUnicodeWidthTables c1 <|> allowCustomUnicodeWidthTables c0
222− , colorMode = colorMode c1 <|> colorMode c0
223217 }
224218
225219instance Monoid Config where
@@ -235,7 +229,6 @@ instance Monoid Config where
235229 , termName = Nothing
236230 , termWidthMaps = []
237231 , allowCustomUnicodeWidthTables = Nothing
238− , colorMode = Nothing
239232 }
240233#if !(MIN_VERSION_base(4,11,0))
241234 mappend = (<>)
@@ -291,8 +284,7 @@ standardIOConfig = do
291284 mb <- lookupEnv termVariable
292285 case mb of
293286 Nothing -> throwIO VtyMissingTermEnvVar
294− Just t -> do
295− mcolorMode <- detectColorMode t
287+ Just t ->
296288 return defaultConfig
297289 { vmin = Just 1
298290 , mouseMode = Just False
@@ -301,7 +293,6 @@ standardIOConfig = do
301293 , inputFd = Just stdInput
302294 , outputFd = Just stdOutput
303295 , termName = Just t
304− , colorMode = Just mcolorMode
305296 }
306297
307298parseConfigFile :: FilePath -> IO Config
src/Graphics/Vty/Image.hs+1−1
@@ -137,7 +137,7 @@ char a c =
137137 let displayWidth = safeWcwidth c
138138 in HorizText a (TL.singleton c) displayWidth 1
139139
140−-- | Make an image from a string of characters laid out on a single
140+-- | Make an image from a string of characters layed out on a single
141141-- row with the same display attribute. The string is assumed to be a
142142-- sequence of ISO-10646 characters. The input string should be
143143-- sanitized of escape sequences (ASCII 27) and carriage returns;
src/Graphics/Vty/Image/Internal.hs+2−2
@@ -228,7 +228,7 @@ instance Monoid Image where
228228--
229229-- The result image will have a width equal to the sum of the two images
230230-- width. And the height will equal the largest height of the two
231−-- images. The area not defined in one image due to a height mismatch
231+-- images. The area not defined in one image due to a height missmatch
232232-- will be filled with the background pattern.
233233horizJoin :: Image -> Image -> Image
234234horizJoin EmptyImage i = i
@@ -259,7 +259,7 @@ horizJoin _ _ = error "horizJoin applied to undefined values."
259259--
260260-- The result image will have a height equal to the sum of the heights
261261-- of both images. The width will equal the largest width of the two
262−-- images. The area not defined in one image due to a width mismatch
262+-- images. The area not defined in one image due to a width missmatch
263263-- will be filled with the background pattern.
264264vertJoin :: Image -> Image -> Image
265265vertJoin EmptyImage i = i
src/Graphics/Vty/Input.hs+2−2
@@ -77,7 +77,7 @@
7777-- The input encoding determines how UTF-8 encoded characters are
7878-- recognized.
7979--
80−-- * 7-bit mode: UTF-8 can be input unambiguously. UTF-8 input is
80+-- * 7-bit mode: UTF-8 can be input unambiguiously. UTF-8 input is
8181-- a superset of ASCII. UTF-8 does not overlap escaped control key
8282-- sequences. However, the escape key must be differentiated from
8383-- escaped control key sequences by the timing of the input bytes.
@@ -95,7 +95,7 @@
9595--
9696-- == Terminal Input is Broken
9797--
98−-- Clearly terminal input has fundamental issues. There is no easy way
98+-- Clearly terminal input has fundemental issues. There is no easy way
9999-- to reliably resolve these issues.
100100--
101101-- One resolution would be to ditch standard terminal interfaces
src/Graphics/Vty/Input/Mouse.hs+2−2
@@ -89,7 +89,7 @@ scrollDown = 65
8989hasBitSet :: Int -> Int -> Bool
9090hasBitSet val bit = val .&. bit > 0
9191
92−-- | Attempt to classify an input string as a mouse event.
92+-- | Attempt to lassify an input string as a mouse event.
9393classifyMouseEvent :: ByteString -> KClass
9494classifyMouseEvent s = runParser s $ do
9595 when (not $ isMouseEvent s) failParse
@@ -102,7 +102,7 @@ classifyMouseEvent s = runParser s $ do
102102 'M' -> classifyNormalMouseEvent
103103 _ -> failParse
104104
105−-- Given a modifier/button value, determine which button was indicated
105+-- Given a modifer/button value, determine which button was indicated
106106getSGRButton :: Int -> Parser Button
107107getSGRButton mods =
108108 let buttonMap = [ (leftButton, BLeft)
src/Graphics/Vty/Output.hs+4−5
@@ -58,12 +58,11 @@ import Data.Monoid ((<>))
5858-- * If TERM contains "xterm" or "screen", use XTermColor.
5959-- * otherwise use the TerminfoBased driver.
6060outputForConfig :: Config -> IO Output
61−outputForConfig Config{ outputFd = Just fd, termName = Just termName
62− , colorMode = Just colorMode, .. } = do
61+outputForConfig Config{ outputFd = Just fd, termName = Just termName, .. } = do
6362 t <- if "xterm" `isPrefixOf` termName || "screen" `isPrefixOf` termName
64− then XTermColor.reserveTerminal termName fd colorMode
63+ then XTermColor.reserveTerminal termName fd
6564 -- Not an xterm-like terminal. try for generic terminfo.
66− else TerminfoBased.reserveTerminal termName fd colorMode
65+ else TerminfoBased.reserveTerminal termName fd
6766
6867 case mouseMode of
6968 Just s -> setMode t Mouse s
@@ -78,7 +77,7 @@ outputForConfig config = (<> config) <$> standardIOConfig >>= outputForConfig
7877
7978-- | Sets the cursor position to the given output column and row.
8079--
81−-- This is not necessarily the same as the character position with the
80+-- This is not necessarially the same as the character position with the
8281-- same coordinates. Characters can be a variable number of columns in
8382-- width.
8483--
src/Graphics/Vty/Output/Interface.hs+17−22
@@ -79,6 +79,9 @@ data Output = Output
7979 , displayBounds :: IO DisplayRegion
8080 -- | Output the bytestring to the terminal device.
8181 , outputByteBuffer :: BS.ByteString -> IO ()
82+ -- | Specifies the maximum number of colors supported by the
83+ -- context.
84+ , contextColorCount :: Int
8285 -- | Specifies whether the cursor can be shown / hidden.
8386 , supportsCursorVisibility :: Bool
8487 -- | Indicates support for terminal modes for this output device.
@@ -114,8 +117,6 @@ data Output = Output
114117 -- be a reliable indicator of whether the feature will work as
115118 -- desired.
116119 , supportsStrikethrough :: IO Bool
117− -- | Returns how many colors the terminal supports.
118− , outputColorMode :: ColorMode
119120 }
120121
121122displayContext :: Output -> DisplayRegion -> IO DisplayContext
@@ -309,23 +310,17 @@ limitAttrForDisplay t attr
309310 where
310311 clampColor Default = Default
311312 clampColor KeepCurrent = KeepCurrent
312− clampColor (SetTo c) = clampColor' (outputColorMode t) c
313−
314− clampColor' NoColor _ = Default
315−
316− clampColor' ColorMode8 (ISOColor v)
317− | v >= 8 = SetTo $ ISOColor (v - 8)
318− | otherwise = SetTo $ ISOColor v
319− clampColor' ColorMode8 _ = Default
320−
321− clampColor' ColorMode16 c@(ISOColor _) = SetTo c
322− clampColor' ColorMode16 _ = Default
323−
324− clampColor' (ColorMode240 _) c@(ISOColor _) = SetTo c
325− clampColor' (ColorMode240 colorCount) c@(Color240 n)
326− | n <= colorCount = SetTo c
327− | otherwise = Default
328− clampColor' colorMode@(ColorMode240 _) (RGBColor r g b) =
329− clampColor' colorMode (color240 r g b)
330−
331− clampColor' FullColor c = SetTo c
313+ clampColor (SetTo c) = clampColor' c
314+ clampColor' (ISOColor v)
315+ | contextColorCount t < 8 = Default
316+ | contextColorCount t < 16 && v >= 8 = SetTo $ ISOColor (v - 8)
317+ | otherwise = SetTo $ ISOColor v
318+ clampColor' (Color240 v)
319+ -- Should we choose closest ISO color?
320+ | contextColorCount t < 8 = Default
321+ | contextColorCount t < 16 = Default
322+ | contextColorCount t <= 256 = SetTo $ Color240 v
323+ | otherwise
324+ = let p :: Double = fromIntegral v / 240.0
325+ v' = floor $ p * (fromIntegral $ contextColorCount t)
326+ in SetTo $ Color240 v'
src/Graphics/Vty/Output/Mock.hs+2−3
@@ -11,7 +11,6 @@ module Graphics.Vty.Output.Mock
1111where
1212
1313import Graphics.Vty.Image (DisplayRegion)
14−import Graphics.Vty.Attributes.Color (ColorMode(ColorMode16))
1514import Graphics.Vty.Output.Interface
1615
1716import Blaze.ByteString.Builder.Word (writeWord8)
@@ -31,7 +30,7 @@ type MockData = IORef (UTF8.UTF8 BS.ByteString)
3130-- without considering terminal specific issues.
3231--
3332-- The mock implementation is useful in manually determining if the
34−-- sequence of terminal operations matches the expected sequence. The
33+-- sequence of terminal operations matche the expected sequence. The
3534-- requirement of the produced representation is simplicity in parsing
3635-- the text representation and determining how the picture was mapped to
3736-- terminal operations.
@@ -56,12 +55,12 @@ mockTerminal r = liftIO $ do
5655 , outputByteBuffer = \bytes -> do
5756 putStrLn $ "mock outputByteBuffer of " ++ show (BS.length bytes) ++ " bytes"
5857 writeIORef outRef $ UTF8.fromRep bytes
58+ , contextColorCount = 16
5959 , supportsCursorVisibility = True
6060 , supportsMode = const False
6161 , setMode = const $ const $ return ()
6262 , getModeStatus = const $ return False
6363 , assumedStateRef = newAssumedStateRef
64− , outputColorMode = ColorMode16
6564 , mkDisplayContext = \tActual rActual -> return $ DisplayContext
6665 { contextRegion = rActual
6766 , contextDevice = tActual
src/Graphics/Vty/Output/TerminfoBased.hs+33−66
@@ -25,7 +25,7 @@ import Graphics.Vty.Image (DisplayRegion)
2525import Graphics.Vty.DisplayAttributes
2626import Graphics.Vty.Output.Interface
2727
28−import Blaze.ByteString.Builder (Write, writeToByteString, writeStorable, writeWord8)
28+import Blaze.ByteString.Builder (Write, writeToByteString, writeStorable)
2929
3030import Data.IORef
3131import Data.Maybe (isJust, isNothing, fromJust)
@@ -49,6 +49,7 @@ data TerminfoCaps = TerminfoCaps
4949 , cup :: CapExpression
5050 , cnorm :: Maybe CapExpression
5151 , civis :: Maybe CapExpression
52+ , supportsNoColors :: Bool
5253 , useAltColorMap :: Bool
5354 , setForeColor :: CapExpression
5455 , setBackColor :: CapExpression
@@ -103,28 +104,28 @@ sendCapToTerminal t cap capParams = do
103104--
104105-- * Providing independent string capabilities for all display
105106-- attributes.
106−reserveTerminal :: String -> Fd -> ColorMode -> IO Output
107−reserveTerminal termName outFd colorMode = do
107+reserveTerminal :: String -> Fd -> IO Output
108+reserveTerminal termName outFd = do
108109 ti <- Terminfo.setupTerm termName
109110 -- assumes set foreground always implies set background exists.
110111 -- if set foreground is not set then all color changing style
111112 -- attributes are filtered.
112113 msetaf <- probeCap ti "setaf"
113114 msetf <- probeCap ti "setf"
114− let (useAlt, setForeCap)
115+ let (noColors, useAlt, setForeCap)
115116 = case msetaf of
116− Just setaf -> (False, setaf)
117+ Just setaf -> (False, False, setaf)
117118 Nothing -> case msetf of
118− Just setf -> (True, setf)
119− Nothing -> (True, error $ "no fore color support for terminal " ++ termName)
119+ Just setf -> (False, True, setf)
120+ Nothing -> (True, True, error $ "no fore color support for terminal " ++ termName)
120121 msetab <- probeCap ti "setab"
121122 msetb <- probeCap ti "setb"
122− let setBackCap
123+ let set_back_cap
123124 = case msetab of
124− Just setab -> setab
125125 Nothing -> case msetb of
126126 Just setb -> setb
127127 Nothing -> error $ "no back color support for terminal " ++ termName
128+ Just setab -> setab
128129
129130 hyperlinkModeStatus <- newIORef False
130131 newAssumedStateRef <- newIORef initialAssumedState
@@ -150,9 +151,10 @@ reserveTerminal termName outFd colorMode = do
150151 <*> requireCap ti "cup"
151152 <*> probeCap ti "cnorm"
152153 <*> probeCap ti "civis"
154+ <*> pure noColors
153155 <*> pure useAlt
154156 <*> pure setForeCap
155− <*> pure setBackCap
157+ <*> pure set_back_cap
156158 <*> requireCap ti "sgr0"
157159 <*> requireCap ti "clear"
158160 <*> requireCap ti "el"
@@ -192,12 +194,17 @@ reserveTerminal termName outFd colorMode = do
192194 when (toEnum len /= actualLen) $ fail $ "Graphics.Vty.Output: outputByteBuffer "
193195 ++ "length mismatch. " ++ show len ++ " /= " ++ show actualLen
194196 ++ " Please report this bug to vty project."
197+ , contextColorCount
198+ = case supportsNoColors terminfoCaps of
199+ False -> case Terminfo.getCapability ti (Terminfo.tiGetNum "colors" ) of
200+ Nothing -> 8
201+ Just v -> toEnum v
202+ True -> 1
195203 , supportsCursorVisibility = isJust $ civis terminfoCaps
196204 , supportsMode = terminfoModeSupported
197205 , setMode = terminfoSetMode
198206 , getModeStatus = terminfoModeStatus
199207 , assumedStateRef = newAssumedStateRef
200− , outputColorMode = colorMode
201208 -- I think fix would help assure tActual is the only
202209 -- reference. I was having issues tho.
203210 , mkDisplayContext = (`terminfoDisplayContext` terminfoCaps)
@@ -295,7 +302,7 @@ writeURLEscapes NoLinkChange =
295302-- | Portably setting the display attributes is a giant pain in the ass.
296303--
297304-- If the terminal supports the sgr capability (which sets the on/off
298−-- state of each style directly; and, for no good reason, resets the
305+-- state of each style directly ; and, for no good reason, resets the
299306-- colors to the default) this procedure is used:
300307--
301308-- 0. set the style attributes. This resets the fore and back color.
@@ -334,9 +341,9 @@ terminfoWriteSetAttr dc terminfoCaps urlsEnabled prevAttr reqAttr diffs =
334341 -- The only way to reset either color, portably, to the default
335342 -- is to use either the set state capability or the set default
336343 -- capability.
337− True -> do
344+ True -> do
338345 case reqDisplayCapSeqFor (displayAttrCaps terminfoCaps)
339− (fixedStyle attr)
346+ (fixedStyle attr )
340347 (styleToApplySeq $ fixedStyle attr) of
341348 -- only way to reset a color to the defaults
342349 EnterExitSeq caps -> writeDefaultAttr dc urlsEnabled
@@ -369,9 +376,9 @@ terminfoWriteSetAttr dc terminfoCaps urlsEnabled prevAttr reqAttr diffs =
369376 -- applied states.
370377 EnterExitSeq caps -> foldMap (\cap -> writeCapExpr cap []) caps
371378 `mappend`
372− writeColorDiff Foreground (foreColorDiff diffs)
379+ writeColorDiff setForeColor (foreColorDiff diffs)
373380 `mappend`
374− writeColorDiff Background (backColorDiff diffs)
381+ writeColorDiff setBackColor (backColorDiff diffs)
375382 -- implicitly resets the colors to the defaults
376383 SetState state -> writeCapExpr (fromJust $ setAttrStates
377384 $ displayAttrCaps terminfoCaps
@@ -403,65 +410,29 @@ terminfoWriteSetAttr dc terminfoCaps urlsEnabled prevAttr reqAttr diffs =
403410 | otherwise = mempty
404411 setColors =
405412 (case fixedForeColor attr of
406− Just c -> writeColor Foreground c
413+ Just c -> writeCapExpr (setForeColor terminfoCaps)
414+ [toEnum $ colorMap c]
407415 Nothing -> mempty)
408416 `mappend`
409417 (case fixedBackColor attr of
410− Just c -> writeColor Background c
418+ Just c -> writeCapExpr (setBackColor terminfoCaps)
419+ [toEnum $ colorMap c]
411420 Nothing -> mempty)
412− writeColorDiff _side NoColorChange
421+ writeColorDiff _f NoColorChange
413422 = mempty
414− writeColorDiff _side ColorToDefault
423+ writeColorDiff _f ColorToDefault
415424 = error "ColorToDefault is not a possible case for applyColorDiffs"
416− writeColorDiff side (SetColor c)
417− = writeColor side c
418−
419− writeColor side (RGBColor r g b) =
420− case outputColorMode (contextDevice dc) of
421− FullColor ->
422− hardcodeColor side (r, g, b)
423− _ ->
424− error "clampColor should remove rgb colors in standard mode"
425− writeColor side c =
426− writeCapExpr (setSideColor side terminfoCaps) [toEnum $ colorMap c]
427−
428−-- a color can either be in the foreground or the background
429−data ColorSide = Foreground | Background
430−
431−-- get the capability for drawing a color on a specific side
432−setSideColor :: ColorSide -> TerminfoCaps -> CapExpression
433−setSideColor Foreground = setForeColor
434−setSideColor Background = setBackColor
435−
436−hardcodeColor :: ColorSide -> (Word8, Word8, Word8) -> Write
437−hardcodeColor side (r, g, b) =
438− -- hardcoded color codes are formatted as "\x1b[{side};2;{r};{g};{b}m"
439− mconcat [ writeStr "\x1b[", sideCode, delimiter, writeChar '2', delimiter
440− , writeColor r, delimiter, writeColor g, delimiter, writeColor b
441− , writeChar 'm']
442− where
443− writeChar = writeWord8 . fromIntegral . fromEnum
444− writeStr = mconcat . map writeChar
445− writeColor = writeStr . show
446− delimiter = writeChar ';'
447− -- 38/48 are used to set whether we should write to the
448− -- foreground/background. I really don't want to know why.
449− sideCode = case side of
450− Foreground -> writeStr "38"
451− Background -> writeStr "48"
425+ writeColorDiff f (SetColor c)
426+ = writeCapExpr (f terminfoCaps) [toEnum $ colorMap c]
452427
453428-- | The color table used by a terminal is a 16 color set followed by a
454429-- 240 color set that might not be supported by the terminal.
455430--
456−-- This takes a Color which clearly identifies which palette to use and
457−-- computes the index into the full 256 color palette.
431+-- This takes a Color which clearly identifies which pallete to use and
432+-- computes the index into the full 256 color pallete.
458433ansiColorIndex :: Color -> Int
459434ansiColorIndex (ISOColor v) = fromEnum v
460435ansiColorIndex (Color240 v) = 16 + fromEnum v
461−ansiColorIndex (RGBColor _ _ _) =
462− error $ unlines [ "Attempted to create color index from rgb color."
463− , "This is currently unsupported, and shouldn't ever happen"
464− ]
465436
466437-- | For terminals without setaf/setab
467438--
@@ -478,10 +449,6 @@ altColorIndex (ISOColor 6) = 3
478449altColorIndex (ISOColor 7) = 7
479450altColorIndex (ISOColor v) = fromEnum v
480451altColorIndex (Color240 v) = 16 + fromEnum v
481−altColorIndex (RGBColor _ _ _) =
482− error $ unlines [ "Attempted to create color index from rgb color."
483− , "This is currently unsupported, and shouldn't ever happen"
484− ]
485452
486453{- | The sequence of terminfo caps to apply a given style are determined
487454 - according to these rules.
src/Graphics/Vty/Output/XTermColor.hs+3−4
@@ -10,7 +10,6 @@ where
1010import Graphics.Vty.Output.Interface
1111import Graphics.Vty.Input.Mouse
1212import Graphics.Vty.Input.Focus
13−import Graphics.Vty.Attributes.Color (ColorMode)
1413import qualified Graphics.Vty.Output.TerminfoBased as TerminfoBased
1514
1615import Blaze.ByteString.Builder (writeToByteString)
@@ -43,8 +42,8 @@ fdWrite fd s =
4342 fdWriteBuf fd (castPtr buf) (fromIntegral len)
4443
4544-- | Construct an Xterm output driver. Initialize the display to UTF-8.
46−reserveTerminal :: ( Applicative m, MonadIO m ) => String -> Fd -> ColorMode -> m Output
47−reserveTerminal variant outFd colorMode = liftIO $ do
45+reserveTerminal :: ( Applicative m, MonadIO m ) => String -> Fd -> m Output
46+reserveTerminal variant outFd = liftIO $ do
4847 let flushedPut = void . fdWrite outFd
4948 -- If the terminal variant is xterm-color use xterm instead since,
5049 -- more often than not, xterm-color is broken.
@@ -52,7 +51,7 @@ reserveTerminal variant outFd colorMode = liftIO $ do
5251
5352 utf8a <- utf8Active
5453 when (not utf8a) $ flushedPut setUtf8CharSet
55− t <- TerminfoBased.reserveTerminal variant' outFd colorMode
54+ t <- TerminfoBased.reserveTerminal variant' outFd
5655
5756 mouseModeStatus <- newIORef False
5857 focusModeStatus <- newIORef False
src/Graphics/Vty/PictureToSpans.hs+1−1
@@ -72,7 +72,7 @@ displayOpsForPic pic r = Vector.create (combinedOpsForLayers pic r)
7272-- | Returns the DisplayOps for an image rendered to a window the size
7373-- of the image.
7474--
75−-- largely used only for debugging.
75+-- largerly used only for debugging.
7676displayOpsForImage :: Image -> DisplayOps
7777displayOpsForImage i = displayOpsForPic (picForImage i) (imageWidth i, imageHeight i)
7878
test/VerifyImageOps.hs+1−1
@@ -137,7 +137,7 @@ cropBottomLimitsHeight :: Image -> Int -> Property
137137cropBottomLimitsHeight i v = v >= 0 ==>
138138 v >= imageHeight (cropBottom v i)
139139
140−-- ridiculous tests just to satisfy my desire for nice code coverage :-P
140+-- rediculous tests just to satisfy my desire for nice code coverage :-P
141141canShowImage :: Image -> Bool
142142canShowImage i = length (show i) > 0
143143
test/VerifyOutput.hs+2−6
@@ -1,4 +1,4 @@
1−-- We setup the environment to invoke certain terminals of interest.
1+-- We setup the environment to envoke certain terminals of interest.
22-- This assumes appropriate definitions exist in the current environment
33-- for the terminals of interest.
44{-# LANGUAGE ScopedTypeVariables #-}
@@ -35,11 +35,7 @@ smokeTestTermNonMac termName i = liftIOResult $ do
3535smokeTestTerm :: String -> Image -> IO Result
3636smokeTestTerm termName i = do
3737 nullOut <- openFd "/dev/null" WriteOnly Nothing defaultFileFlags
38− t <- outputForConfig $ defaultConfig
39− { outputFd = Just nullOut
40− , termName = Just termName
41− , colorMode = Just NoColor
42− }
38+ t <- outputForConfig $ defaultConfig { outputFd = Just nullOut, termName = Just termName }
4339 -- putStrLn $ "context color count: " ++ show (contextColorCount t)
4440 reserveDisplay t
4541 dc <- displayContext t (100,100)
test/VerifyUsingMockInput.hs+1−3
@@ -132,9 +132,7 @@ assertEventsFromSynInput table inputSpec expectedEvents = do
132132 readLoop 0 = return ()
133133 readLoop n = do
134134 e <- atomically $ readTChan $ input^.eventChannel
135− case e of
136− InputEvent ev -> modifyIORef eventsRef ((:) ev)
137− ResumeAfterSignal -> return ()
135+ modifyIORef eventsRef ((:) e)
138136 readLoop (n - 1)
139137 genEventsUsingIoActions maxDuration writeWaitClose readEvents
140138 outEvents <- reverse <$> readIORef eventsRef
test/interactive_terminal_test.hs+1−1
@@ -364,7 +364,7 @@ Did the test output match the description?
364364|]
365365 defaultSuccessConfirmResults
366366
367−-- Explicitly define the bytes that encode each example text.
367+-- Explicitely definethe bytes that encode each example text.
368368-- This avoids any issues with how the compiler represents string literals.
369369--
370370-- This document is UTF-8 encoded so the UTF-8 string is still included for
vty.cabal+1−1
@@ -1,5 +1,5 @@
11name: vty
2−version: 5.35.1
2+version: 5.34
33license: BSD3
44license-file: LICENSE
55author: AUTHORS