xmonad-config/lib/XMonad/Internal/Theme.hs

211 lines
4.9 KiB
Haskell
Raw Normal View History

2020-04-01 22:06:00 -04:00
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- Theme for XMonad and Xmobar
2020-04-01 22:06:00 -04:00
2020-04-01 20:17:47 -04:00
module XMonad.Internal.Theme
( baseColor
, bgColor
, fgColor
, bordersColor
, warningColor
, errorColor
, selectedFgColor
, selectedBgColor
, selectedBordersColor
, backdropBaseColor
, backdropFgColor
, backdropTextColor
, blend'
, darken'
2022-12-30 14:58:23 -05:00
, Slant (..)
, Weight (..)
, FontData (..)
2022-07-02 17:09:21 -04:00
, FontBuilder
, buildFont
, fallbackFont
, defFontFamily
2022-07-02 17:09:21 -04:00
, defFontData
2020-04-01 20:17:47 -04:00
, tabbedTheme
, promptTheme
2022-12-30 14:58:23 -05:00
)
where
2020-03-16 13:50:08 -04:00
2022-12-30 14:58:23 -05:00
import Data.Colour
import Data.Colour.SRGB
2023-02-12 23:08:05 -05:00
import RIO
2022-12-30 14:58:23 -05:00
import qualified RIO.Text as T
import qualified XMonad.Layout.Decoration as D
2022-12-30 14:58:23 -05:00
import qualified XMonad.Prompt as P
2020-03-16 13:50:08 -04:00
2020-04-01 22:06:00 -04:00
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- Colors - vocabulary roughly based on GTK themes
2020-03-16 13:50:08 -04:00
baseColor :: T.Text
2020-03-16 13:50:08 -04:00
baseColor = "#f7f7f7"
bgColor :: T.Text
2020-03-16 13:50:08 -04:00
bgColor = "#d6d6d6"
fgColor :: T.Text
2020-03-16 14:48:38 -04:00
fgColor = "#2c2c2c"
2020-03-16 13:50:08 -04:00
bordersColor :: T.Text
2020-03-22 17:59:49 -04:00
bordersColor = darken' 0.3 bgColor
2020-03-16 13:50:08 -04:00
warningColor :: T.Text
2020-03-16 13:50:08 -04:00
warningColor = "#ffca28"
errorColor :: T.Text
2020-03-16 13:50:08 -04:00
errorColor = "#e53935"
selectedFgColor :: T.Text
2020-03-16 13:50:08 -04:00
selectedFgColor = "#ffffff"
selectedBgColor :: T.Text
2021-11-05 16:54:53 -04:00
selectedBgColor = "#4a79c7"
2020-03-16 13:50:08 -04:00
selectedBordersColor :: T.Text
2021-11-05 16:54:53 -04:00
selectedBordersColor = "#4a79c7"
2020-03-22 17:59:49 -04:00
backdropBaseColor :: T.Text
2020-03-16 13:50:08 -04:00
backdropBaseColor = baseColor
backdropTextColor :: T.Text
2020-03-16 13:50:08 -04:00
backdropTextColor = blend' 0.95 fgColor backdropBaseColor
backdropFgColor :: T.Text
2020-03-16 13:50:08 -04:00
backdropFgColor = blend' 0.75 fgColor bgColor
2020-04-01 22:06:00 -04:00
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- Color functions
2020-03-16 13:50:08 -04:00
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
2020-03-16 13:50:08 -04:00
sRGB24showT :: (RealFrac a, Floating a) => Colour a -> T.Text
sRGB24showT = T.pack . sRGB24show
2020-03-16 13:50:08 -04:00
2020-04-01 22:06:00 -04:00
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- Fonts
data Slant
= Roman
| Italic
| Oblique
deriving (Eq, Show)
data Weight
= Light
| Medium
| Demibold
| Bold
| Black
deriving (Eq, Show)
2020-03-22 17:59:49 -04:00
2022-07-02 17:09:21 -04:00
data FontData = FontData
2022-12-30 14:58:23 -05:00
{ weight :: Maybe Weight
, slant :: Maybe Slant
, size :: Maybe Int
, pixelsize :: Maybe Int
, antialias :: Maybe Bool
}
2020-03-16 13:50:08 -04:00
type FontBuilder = FontData -> T.Text
2022-07-02 17:09:21 -04:00
buildFont :: Maybe T.Text -> FontData -> T.Text
2022-07-02 17:09:21 -04:00
buildFont Nothing _ = "fixed"
2022-12-30 14:58:23 -05:00
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)
2020-03-16 13:50:08 -04:00
2022-07-03 18:23:32 -04:00
fallbackFont :: FontBuilder
fallbackFont = buildFont Nothing
2022-07-02 17:09:21 -04:00
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- Default font and data
2022-07-02 17:09:21 -04:00
defFontData :: FontData
2022-12-30 14:58:23 -05:00
defFontData =
FontData
{ size = Just 10
, antialias = Just True
, weight = Nothing
, slant = Nothing
, pixelsize = Nothing
}
2020-03-16 13:50:08 -04:00
defFontFamily :: T.Text
defFontFamily = "DejaVu Sans"
2022-07-03 18:23:32 -04:00
-- defFontDep :: IODependency FontBuilder
-- defFontDep = fontDependency "DejaVu Sans"
-- defFontTree :: IOTree FontBuilder
-- defFontTree = fontTree "DejaVu Sans"
2022-07-02 17:09:21 -04:00
2020-04-01 22:06:00 -04:00
--------------------------------------------------------------------------------
2022-12-30 14:58:23 -05:00
-- Complete themes
2020-03-16 13:50:08 -04:00
2022-07-02 17:09:21 -04:00
tabbedTheme :: FontBuilder -> D.Theme
2022-12-30 14:58:23 -05:00
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 = []
}
2020-03-16 13:50:08 -04:00
2022-07-02 17:09:21 -04:00
promptTheme :: FontBuilder -> P.XPConfig
2022-12-30 14:58:23 -05:00
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
}