181 lines
3.9 KiB
Haskell
181 lines
3.9 KiB
Haskell
|
{-# LANGUAGE LambdaCase #-}
|
||
|
|
||
|
module XMonad.Internal.Theme
|
||
|
( baseColor
|
||
|
, bgColor
|
||
|
, fgColor
|
||
|
, bordersColor
|
||
|
, warningColor
|
||
|
, errorColor
|
||
|
, selectedFgColor
|
||
|
, selectedBgColor
|
||
|
, selectedBordersColor
|
||
|
, backdropBaseColor
|
||
|
, backdropFgColor
|
||
|
, backdropTextColor
|
||
|
, blend'
|
||
|
, darken'
|
||
|
, Slant(..)
|
||
|
, Weight(..)
|
||
|
, ThemeFont(..)
|
||
|
, fmtFontXFT
|
||
|
, font
|
||
|
, tabbedTheme
|
||
|
, promptTheme
|
||
|
) where
|
||
|
|
||
|
import Data.Char
|
||
|
|
||
|
import Data.Colour
|
||
|
import Data.Colour.SRGB
|
||
|
|
||
|
import Data.List
|
||
|
|
||
|
import qualified XMonad.Layout.Decoration as D
|
||
|
import qualified XMonad.Prompt as P
|
||
|
|
||
|
-- Colors
|
||
|
|
||
|
baseColor :: String
|
||
|
baseColor = "#f7f7f7"
|
||
|
|
||
|
bgColor :: String
|
||
|
bgColor = "#d6d6d6"
|
||
|
|
||
|
fgColor :: String
|
||
|
fgColor = "#2c2c2c"
|
||
|
|
||
|
bordersColor :: String
|
||
|
bordersColor = darken' 0.3 bgColor
|
||
|
|
||
|
warningColor :: String
|
||
|
warningColor = "#ffca28"
|
||
|
|
||
|
errorColor :: String
|
||
|
errorColor = "#e53935"
|
||
|
|
||
|
selectedFgColor :: String
|
||
|
selectedFgColor = "#ffffff"
|
||
|
|
||
|
selectedBgColor :: String
|
||
|
selectedBgColor = "#3399ff"
|
||
|
|
||
|
selectedBordersColor :: String
|
||
|
selectedBordersColor = "#006cd9"
|
||
|
|
||
|
backdropBaseColor :: String
|
||
|
backdropBaseColor = baseColor
|
||
|
|
||
|
backdropTextColor :: String
|
||
|
backdropTextColor = blend' 0.95 fgColor backdropBaseColor
|
||
|
|
||
|
backdropFgColor :: String
|
||
|
backdropFgColor = blend' 0.75 fgColor bgColor
|
||
|
|
||
|
-- Color functions
|
||
|
|
||
|
blend' :: Float -> String -> String -> String
|
||
|
blend' wt c0 c1 = sRGB24show $ blend wt (sRGB24read c0) (sRGB24read c1)
|
||
|
|
||
|
darken' :: Float -> String -> String
|
||
|
darken' wt = sRGB24show . darken wt . sRGB24read
|
||
|
|
||
|
-- Fonts
|
||
|
|
||
|
-- TODO use the font package from contrib
|
||
|
-- https://hackage.haskell.org/package/xmonad-contrib-0.16/docs/XMonad-Util-Font.html
|
||
|
|
||
|
data Slant = Roman
|
||
|
| Italic
|
||
|
| Oblique
|
||
|
deriving (Eq, Show)
|
||
|
|
||
|
data Weight = Light
|
||
|
| Medium
|
||
|
| Demibold
|
||
|
| Bold
|
||
|
| Black
|
||
|
deriving (Eq, Show)
|
||
|
|
||
|
data ThemeFont = ThemeFont
|
||
|
{ family :: String
|
||
|
, weight :: Maybe Weight
|
||
|
, slant :: Maybe Slant
|
||
|
, size :: Maybe Int
|
||
|
, pixelsize :: Maybe Int
|
||
|
, antialias :: Maybe Bool
|
||
|
}
|
||
|
|
||
|
fmtFontXFT :: ThemeFont -> String
|
||
|
fmtFontXFT ThemeFont
|
||
|
-- TODO there should be a better way to do this...
|
||
|
{ family = f
|
||
|
, weight = w
|
||
|
, slant = l
|
||
|
, size = s
|
||
|
, pixelsize = i
|
||
|
, antialias = a
|
||
|
} = "xft:" ++ intercalate ":" (filter (not . null) elems)
|
||
|
where
|
||
|
elems = [ f
|
||
|
, fmt "weight" w
|
||
|
, fmt "slant" l
|
||
|
, fmt "size" s
|
||
|
, fmt "pixelsize" i
|
||
|
, fmt "antialias" a]
|
||
|
fmt :: Show a => String -> Maybe a -> String
|
||
|
fmt e = \case
|
||
|
Just d -> e ++ "=" ++ map toLower (show d)
|
||
|
Nothing -> ""
|
||
|
|
||
|
font :: ThemeFont
|
||
|
font = ThemeFont
|
||
|
{ family = "DejaVu Sans"
|
||
|
, size = Just 10
|
||
|
, antialias = Just True
|
||
|
, weight = Nothing
|
||
|
, slant = Nothing
|
||
|
, pixelsize = Nothing
|
||
|
}
|
||
|
|
||
|
-- Complete themes
|
||
|
|
||
|
tabbedTheme :: D.Theme
|
||
|
tabbedTheme = D.def
|
||
|
{ D.fontName = fmtFontXFT font { weight = Just Bold }
|
||
|
|
||
|
, D.activeTextColor = fgColor
|
||
|
, D.activeColor = bgColor
|
||
|
, D.activeBorderColor = bgColor
|
||
|
|
||
|
, D.inactiveTextColor = backdropTextColor
|
||
|
, D.inactiveColor = backdropFgColor
|
||
|
, D.inactiveBorderColor = backdropFgColor
|
||
|
|
||
|
, D.urgentTextColor = darken' 0.5 errorColor
|
||
|
, D.urgentColor = errorColor
|
||
|
, D.urgentBorderColor = errorColor
|
||
|
|
||
|
-- this is in a newer version
|
||
|
-- , D.activeBorderWidth = 0
|
||
|
-- , D.inactiveBorderWidth = 0
|
||
|
-- , D.urgentBorderWidth = 0
|
||
|
|
||
|
, D.decoHeight = 20
|
||
|
, D.windowTitleAddons = []
|
||
|
, D.windowTitleIcons = []
|
||
|
}
|
||
|
|
||
|
promptTheme :: P.XPConfig
|
||
|
promptTheme = P.def
|
||
|
{ P.font = fmtFontXFT font
|
||
|
, P.bgColor = bgColor
|
||
|
, P.fgColor = fgColor
|
||
|
, P.fgHLight = selectedFgColor
|
||
|
, P.bgHLight = selectedBgColor
|
||
|
, P.borderColor = bordersColor
|
||
|
, P.promptBorderWidth = 1
|
||
|
, P.height = 30
|
||
|
, P.position = P.CenteredAt 0.5 0.5
|
||
|
}
|