{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- | Best-effort terminfo-based color mode detection.
--
-- This module is exposed for testing purposes only; applications should
-- never need to import this directly.
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