{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Graphics.Vty.Platform.Unix.Output.Color
( detectColorMode
)
where
import System.Environment (lookupEnv)
import qualified System.Console.Terminfo as Terminfo
import Control.Exception (catch)
import Data.Maybe
import Graphics.Vty.Attributes.Color
detectColorMode :: String -> IO ColorMode
detectColorMode :: String -> IO ColorMode
detectColorMode String
termName' = do
Maybe Terminal
term <- forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO Terminal
Terminfo.setupTerm String
termName')
(\(SetupTermError
_ :: Terminfo.SetupTermError) -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing)
let getCap :: Capability b -> Maybe b
getCap Capability b
cap = Maybe Terminal
term forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Terminal
t -> forall a. Terminal -> Capability a -> Maybe a
Terminfo.getCapability Terminal
t Capability b
cap
termColors :: Int
termColors = forall a. a -> Maybe a -> a
fromMaybe Int
0 forall a b. (a -> b) -> a -> b
$ forall {b}. Capability b -> Maybe b
getCap (String -> Capability Int
Terminfo.tiGetNum String
"colors")
Maybe String
colorterm <- String -> IO (Maybe String)
lookupEnv String
"COLORTERM"
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ if
| Int
termColors forall a. Ord a => a -> a -> Bool
< Int
8 -> ColorMode
NoColor
| Int
termColors forall a. Ord a => a -> a -> Bool
< Int
16 -> ColorMode
ColorMode8
| Int
termColors forall a. Eq a => a -> a -> Bool
== Int
16 -> ColorMode
ColorMode16
| Int
termColors forall a. Ord a => a -> a -> Bool
< Int
256 -> Word8 -> ColorMode
ColorMode240 (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
termColors forall a. Num a => a -> a -> a
- Word8
16)
| Maybe String
colorterm forall a. Eq a => a -> a -> Bool
== forall a. a -> Maybe a
Just String
"truecolor" -> ColorMode
FullColor
| Maybe String
colorterm forall a. Eq a => a -> a -> Bool
== forall a. a -> Maybe a
Just String
"24bit" -> ColorMode
FullColor
| Bool
otherwise -> Word8 -> ColorMode
ColorMode240 Word8
240