206 lines
5.4 KiB
Haskell
206 lines
5.4 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- | Theme for XMonad and Xmobar
|
|
|
|
module XMonad.Internal.Theme
|
|
( baseColor
|
|
, bgColor
|
|
, fgColor
|
|
, bordersColor
|
|
, warningColor
|
|
, errorColor
|
|
, selectedFgColor
|
|
, selectedBgColor
|
|
, selectedBordersColor
|
|
, backdropBaseColor
|
|
, backdropFgColor
|
|
, backdropTextColor
|
|
, blend'
|
|
, darken'
|
|
, Slant(..)
|
|
, Weight(..)
|
|
, FontData(..)
|
|
, FontBuilder
|
|
, buildFont
|
|
, fallbackFont
|
|
, defFontFamily
|
|
, defFontData
|
|
, tabbedTheme
|
|
, promptTheme
|
|
) where
|
|
|
|
import Data.Colour
|
|
import Data.Colour.SRGB
|
|
|
|
import qualified RIO.Text as T
|
|
|
|
import qualified XMonad.Layout.Decoration as D
|
|
import qualified XMonad.Prompt as P
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- | Colors - vocabulary roughly based on GTK themes
|
|
|
|
baseColor :: T.Text
|
|
baseColor = "#f7f7f7"
|
|
|
|
bgColor :: T.Text
|
|
bgColor = "#d6d6d6"
|
|
|
|
fgColor :: T.Text
|
|
fgColor = "#2c2c2c"
|
|
|
|
bordersColor :: T.Text
|
|
bordersColor = darken' 0.3 bgColor
|
|
|
|
warningColor :: T.Text
|
|
warningColor = "#ffca28"
|
|
|
|
errorColor :: T.Text
|
|
errorColor = "#e53935"
|
|
|
|
selectedFgColor :: T.Text
|
|
selectedFgColor = "#ffffff"
|
|
|
|
selectedBgColor :: T.Text
|
|
selectedBgColor = "#4a79c7"
|
|
|
|
selectedBordersColor :: T.Text
|
|
selectedBordersColor = "#4a79c7"
|
|
|
|
backdropBaseColor :: T.Text
|
|
backdropBaseColor = baseColor
|
|
|
|
backdropTextColor :: T.Text
|
|
backdropTextColor = blend' 0.95 fgColor backdropBaseColor
|
|
|
|
backdropFgColor :: T.Text
|
|
backdropFgColor = blend' 0.75 fgColor bgColor
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- | Color functions
|
|
|
|
blend' :: Float -> T.Text -> T.Text -> T.Text
|
|
blend' wt c0 c1 = sRGB24showT $ blend wt (sRGB24readT c0) (sRGB24readT c1)
|
|
|
|
darken' :: Float -> T.Text -> T.Text
|
|
darken' wt = sRGB24showT . darken wt . sRGB24readT
|
|
|
|
sRGB24readT :: (RealFrac a, Floating a) => T.Text -> Colour a
|
|
sRGB24readT = sRGB24read . T.unpack
|
|
|
|
sRGB24showT :: (RealFrac a, Floating a) => Colour a -> T.Text
|
|
sRGB24showT = T.pack . sRGB24show
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- | Fonts
|
|
|
|
data Slant = Roman
|
|
| Italic
|
|
| Oblique
|
|
deriving (Eq, Show)
|
|
|
|
data Weight = Light
|
|
| Medium
|
|
| Demibold
|
|
| Bold
|
|
| Black
|
|
deriving (Eq, Show)
|
|
|
|
data FontData = FontData
|
|
{ weight :: Maybe Weight
|
|
, slant :: Maybe Slant
|
|
, size :: Maybe Int
|
|
, pixelsize :: Maybe Int
|
|
, antialias :: Maybe Bool
|
|
}
|
|
|
|
type FontBuilder = FontData -> T.Text
|
|
|
|
buildFont :: Maybe T.Text -> FontData -> T.Text
|
|
buildFont Nothing _ = "fixed"
|
|
buildFont (Just fam) FontData { weight = w
|
|
, slant = l
|
|
, size = s
|
|
, pixelsize = p
|
|
, antialias = a
|
|
}
|
|
= T.intercalate ":" $ ["xft", fam] ++ elems
|
|
where
|
|
elems = [ T.concat [k, "=", v] | (k, Just v) <- [ ("weight", showLower w)
|
|
, ("slant", showLower l)
|
|
, ("size", showLower s)
|
|
, ("pixelsize", showLower p)
|
|
, ("antialias", showLower a)
|
|
]
|
|
]
|
|
showLower :: Show a => Maybe a -> Maybe T.Text
|
|
showLower = fmap (T.toLower . T.pack . show)
|
|
|
|
fallbackFont :: FontBuilder
|
|
fallbackFont = buildFont Nothing
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- | Default font and data
|
|
|
|
defFontData :: FontData
|
|
defFontData = FontData
|
|
{ size = Just 10
|
|
, antialias = Just True
|
|
, weight = Nothing
|
|
, slant = Nothing
|
|
, pixelsize = Nothing
|
|
}
|
|
|
|
defFontFamily :: T.Text
|
|
defFontFamily = "DejaVu Sans"
|
|
|
|
-- defFontDep :: IODependency FontBuilder
|
|
-- defFontDep = fontDependency "DejaVu Sans"
|
|
|
|
-- defFontTree :: IOTree FontBuilder
|
|
-- defFontTree = fontTree "DejaVu Sans"
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- | Complete themes
|
|
|
|
tabbedTheme :: FontBuilder -> D.Theme
|
|
tabbedTheme fb = D.def
|
|
{ D.fontName = T.unpack $ fb $ defFontData { weight = Just Bold }
|
|
|
|
, D.activeTextColor = T.unpack fgColor
|
|
, D.activeColor = T.unpack bgColor
|
|
, D.activeBorderColor = T.unpack bgColor
|
|
|
|
, D.inactiveTextColor = T.unpack backdropTextColor
|
|
, D.inactiveColor = T.unpack backdropFgColor
|
|
, D.inactiveBorderColor = T.unpack backdropFgColor
|
|
|
|
, D.urgentTextColor = T.unpack $ darken' 0.5 errorColor
|
|
, D.urgentColor = T.unpack errorColor
|
|
, D.urgentBorderColor = T.unpack errorColor
|
|
|
|
-- this is in a newer version
|
|
-- , D.activeBorderWidth = 0
|
|
-- , D.inactiveBorderWidth = 0
|
|
-- , D.urgentBorderWidth = 0
|
|
|
|
, D.decoHeight = 20
|
|
, D.windowTitleAddons = []
|
|
, D.windowTitleIcons = []
|
|
}
|
|
|
|
promptTheme :: FontBuilder -> P.XPConfig
|
|
promptTheme fb = P.def
|
|
{ P.font = T.unpack $ fb $ defFontData { size = Just 12 }
|
|
, P.bgColor = T.unpack bgColor
|
|
, P.fgColor = T.unpack fgColor
|
|
, P.fgHLight = T.unpack selectedFgColor
|
|
, P.bgHLight = T.unpack selectedBgColor
|
|
, P.borderColor = T.unpack bordersColor
|
|
, P.promptBorderWidth = 1
|
|
, P.height = 35
|
|
, P.position = P.CenteredAt 0.5 0.5
|
|
, P.historySize = 0
|
|
}
|