{-# LANGUAGE CPP #-}
module Xmobar.X11.Draw (drawInWin) where
import Prelude hiding (lookup)
import Control.Monad.IO.Class
import Control.Monad.Reader
import Control.Monad (when)
import Control.Arrow ((&&&))
import Data.Map hiding (foldr, map, filter)
import qualified Data.List.NonEmpty as NE
import Graphics.X11.Xlib hiding (textExtents, textWidth)
import Graphics.X11.Xlib.Extras
import Xmobar.Config.Types
import qualified Xmobar.X11.Bitmap as B
import Xmobar.X11.Actions (Action(..))
import Xmobar.X11.Types
import Xmobar.X11.Text
import Xmobar.X11.ColorCache
import Xmobar.X11.Window (drawBorder)
import Xmobar.X11.Parsers (Widget(..))
import Xmobar.System.Utils (safeIndex)
#ifdef XFT
import Xmobar.X11.MinXft
import Graphics.X11.Xrender
#endif
fi :: (Integral a, Num b) => a -> b
fi :: a -> b
fi = a -> b
forall a b. (Integral a, Num b) => a -> b
fromIntegral
drawInWin :: Rectangle -> [[(Widget, String, Int, Maybe [Action])]] -> X ()
drawInWin :: Rectangle -> [[(Widget, String, Int, Maybe [Action])]] -> X ()
drawInWin wr :: Rectangle
wr@(Rectangle _ _ wid :: Dimension
wid ht :: Dimension
ht) ~[left :: [(Widget, String, Int, Maybe [Action])]
left,center :: [(Widget, String, Int, Maybe [Action])]
center,right :: [(Widget, String, Int, Maybe [Action])]
right] = do
XConf
r <- ReaderT XConf IO XConf
forall r (m :: * -> *). MonadReader r m => m r
ask
let (c :: Config
c,d :: Display
d) = (XConf -> Config
config (XConf -> Config)
-> (XConf -> Display) -> XConf -> (Config, Display)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& XConf -> Display
display) XConf
r
(w :: Dimension
w,(fs :: NonEmpty XFont
fs,vs :: [Int]
vs)) = (XConf -> Dimension
window (XConf -> Dimension)
-> (XConf -> (NonEmpty XFont, [Int]))
-> XConf
-> (Dimension, (NonEmpty XFont, [Int]))
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& XConf -> NonEmpty XFont
fontListS (XConf -> NonEmpty XFont)
-> (XConf -> [Int]) -> XConf -> (NonEmpty XFont, [Int])
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& XConf -> [Int]
verticalOffsets) XConf
r
strLn :: [(Widget, b, Int, d)]
-> ReaderT XConf IO [(Widget, b, Int, Position)]
strLn = IO [(Widget, b, Int, Position)]
-> ReaderT XConf IO [(Widget, b, Int, Position)]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [(Widget, b, Int, Position)]
-> ReaderT XConf IO [(Widget, b, Int, Position)])
-> ([(Widget, b, Int, d)] -> IO [(Widget, b, Int, Position)])
-> [(Widget, b, Int, d)]
-> ReaderT XConf IO [(Widget, b, Int, Position)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Widget, b, Int, d) -> IO (Widget, b, Int, Position))
-> [(Widget, b, Int, d)] -> IO [(Widget, b, Int, Position)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Widget, b, Int, d) -> IO (Widget, b, Int, Position)
forall d b d.
Num d =>
(Widget, b, Int, d) -> IO (Widget, b, Int, d)
getWidth
iconW :: String -> Dimension
iconW i :: String
i = Dimension -> (Bitmap -> Dimension) -> Maybe Bitmap -> Dimension
forall b a. b -> (a -> b) -> Maybe a -> b
maybe 0 Bitmap -> Dimension
B.width (String -> Map String Bitmap -> Maybe Bitmap
forall k a. Ord k => k -> Map k a -> Maybe a
lookup String
i (Map String Bitmap -> Maybe Bitmap)
-> Map String Bitmap -> Maybe Bitmap
forall a b. (a -> b) -> a -> b
$ XConf -> Map String Bitmap
iconS XConf
r)
getWidth :: (Widget, b, Int, d) -> IO (Widget, b, Int, d)
getWidth (Text s :: String
s,cl :: b
cl,i :: Int
i,_) =
Display -> XFont -> String -> IO Int
textWidth Display
d (NonEmpty XFont -> Int -> XFont
forall a. NonEmpty a -> Int -> a
safeIndex NonEmpty XFont
fs Int
i) String
s IO Int -> (Int -> IO (Widget, b, Int, d)) -> IO (Widget, b, Int, d)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \tw :: Int
tw -> (Widget, b, Int, d) -> IO (Widget, b, Int, d)
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Widget
Text String
s,b
cl,Int
i,Int -> d
forall a b. (Integral a, Num b) => a -> b
fi Int
tw)
getWidth (Icon s :: String
s,cl :: b
cl,i :: Int
i,_) = (Widget, b, Int, d) -> IO (Widget, b, Int, d)
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Widget
Icon String
s,b
cl,Int
i,Dimension -> d
forall a b. (Integral a, Num b) => a -> b
fi (Dimension -> d) -> Dimension -> d
forall a b. (a -> b) -> a -> b
$ String -> Dimension
iconW String
s)
Dimension
p <- IO Dimension -> ReaderT XConf IO Dimension
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Dimension -> ReaderT XConf IO Dimension)
-> IO Dimension -> ReaderT XConf IO Dimension
forall a b. (a -> b) -> a -> b
$ Display
-> Dimension -> Dimension -> Dimension -> CInt -> IO Dimension
createPixmap Display
d Dimension
w Dimension
wid Dimension
ht
(Screen -> CInt
defaultDepthOfScreen (Display -> Screen
defaultScreenOfDisplay Display
d))
#if XFT
Bool -> X () -> X ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Config -> Int
alpha Config
c Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= 255) (IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display -> Dimension -> String -> Int -> Rectangle -> IO ()
drawBackground Display
d Dimension
p (Config -> String
bgColor Config
c) (Config -> Int
alpha Config
c) Rectangle
wr)
#else
_ <- return wr
#endif
Display -> [String] -> ([Dimension] -> X ()) -> X ()
forall (m :: * -> *) a.
MonadIO m =>
Display -> [String] -> ([Dimension] -> m a) -> m a
withColors Display
d [Config -> String
bgColor Config
c, Config -> String
borderColor Config
c] (([Dimension] -> X ()) -> X ()) -> ([Dimension] -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \[bgcolor :: Dimension
bgcolor, bdcolor :: Dimension
bdcolor] -> do
GC
gc <- IO GC -> ReaderT XConf IO GC
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO GC -> ReaderT XConf IO GC) -> IO GC -> ReaderT XConf IO GC
forall a b. (a -> b) -> a -> b
$ Display -> Dimension -> IO GC
createGC Display
d Dimension
w
#if XFT
Bool -> X () -> X ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Config -> Int
alpha Config
c Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 255) (X () -> X ()) -> X () -> X ()
forall a b. (a -> b) -> a -> b
$ do
#else
do
#endif
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display -> GC -> Dimension -> IO ()
setForeground Display
d GC
gc Dimension
bgcolor
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display
-> Dimension
-> GC
-> Position
-> Position
-> Dimension
-> Dimension
-> IO ()
fillRectangle Display
d Dimension
p GC
gc 0 0 Dimension
wid Dimension
ht
Dimension
-> GC
-> NonEmpty XFont
-> [Int]
-> Position
-> Align
-> [(Widget, String, Int, Position)]
-> X ()
printStrings Dimension
p GC
gc NonEmpty XFont
fs [Int]
vs 1 Align
L ([(Widget, String, Int, Position)] -> X ())
-> ReaderT XConf IO [(Widget, String, Int, Position)] -> X ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [(Widget, String, Int, Maybe [Action])]
-> ReaderT XConf IO [(Widget, String, Int, Position)]
forall b d.
[(Widget, b, Int, d)]
-> ReaderT XConf IO [(Widget, b, Int, Position)]
strLn [(Widget, String, Int, Maybe [Action])]
left
Dimension
-> GC
-> NonEmpty XFont
-> [Int]
-> Position
-> Align
-> [(Widget, String, Int, Position)]
-> X ()
printStrings Dimension
p GC
gc NonEmpty XFont
fs [Int]
vs 1 Align
R ([(Widget, String, Int, Position)] -> X ())
-> ReaderT XConf IO [(Widget, String, Int, Position)] -> X ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [(Widget, String, Int, Maybe [Action])]
-> ReaderT XConf IO [(Widget, String, Int, Position)]
forall b d.
[(Widget, b, Int, d)]
-> ReaderT XConf IO [(Widget, b, Int, Position)]
strLn [(Widget, String, Int, Maybe [Action])]
right
Dimension
-> GC
-> NonEmpty XFont
-> [Int]
-> Position
-> Align
-> [(Widget, String, Int, Position)]
-> X ()
printStrings Dimension
p GC
gc NonEmpty XFont
fs [Int]
vs 1 Align
C ([(Widget, String, Int, Position)] -> X ())
-> ReaderT XConf IO [(Widget, String, Int, Position)] -> X ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< [(Widget, String, Int, Maybe [Action])]
-> ReaderT XConf IO [(Widget, String, Int, Position)]
forall b d.
[(Widget, b, Int, d)]
-> ReaderT XConf IO [(Widget, b, Int, Position)]
strLn [(Widget, String, Int, Maybe [Action])]
center
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Border
-> Int
-> Display
-> Dimension
-> GC
-> Dimension
-> Dimension
-> Dimension
-> IO ()
drawBorder (Config -> Border
border Config
c) (Config -> Int
borderWidth Config
c) Display
d Dimension
p GC
gc Dimension
bdcolor Dimension
wid Dimension
ht
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display
-> Dimension
-> Dimension
-> GC
-> Position
-> Position
-> Dimension
-> Dimension
-> Position
-> Position
-> IO ()
copyArea Display
d Dimension
p Dimension
w GC
gc 0 0 Dimension
wid Dimension
ht 0 0
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display -> GC -> IO ()
freeGC Display
d GC
gc
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display -> Dimension -> IO ()
freePixmap Display
d Dimension
p
IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display -> Bool -> IO ()
sync Display
d Bool
True
verticalOffset :: (Integral b, Integral a, MonadIO m) =>
a -> Widget -> XFont -> Int -> Config -> m b
verticalOffset :: a -> Widget -> XFont -> Int -> Config -> m b
verticalOffset ht :: a
ht (Text t :: String
t) fontst :: XFont
fontst voffs :: Int
voffs _
| Int
voffs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> -1 = b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ Int -> b
forall a b. (Integral a, Num b) => a -> b
fi Int
voffs
| Bool
otherwise = do
(as :: Position
as,ds :: Position
ds) <- IO (Position, Position) -> m (Position, Position)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Position, Position) -> m (Position, Position))
-> IO (Position, Position) -> m (Position, Position)
forall a b. (a -> b) -> a -> b
$ XFont -> String -> IO (Position, Position)
textExtents XFont
fontst String
t
let margin :: b
margin = (a -> b
forall a b. (Integral a, Num b) => a -> b
fi a
ht b -> b -> b
forall a. Num a => a -> a -> a
- Position -> b
forall a b. (Integral a, Num b) => a -> b
fi Position
ds b -> b -> b
forall a. Num a => a -> a -> a
- Position -> b
forall a b. (Integral a, Num b) => a -> b
fi Position
as) b -> b -> b
forall a. Integral a => a -> a -> a
`div` 2
b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ Position -> b
forall a b. (Integral a, Num b) => a -> b
fi Position
as b -> b -> b
forall a. Num a => a -> a -> a
+ b
margin b -> b -> b
forall a. Num a => a -> a -> a
- 1
verticalOffset ht :: a
ht (Icon _) _ _ conf :: Config
conf
| Config -> Int
iconOffset Config
conf Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> -1 = b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ Int -> b
forall a b. (Integral a, Num b) => a -> b
fi (Config -> Int
iconOffset Config
conf)
| Bool
otherwise = b -> m b
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> m b) -> b -> m b
forall a b. (a -> b) -> a -> b
$ a -> b
forall a b. (Integral a, Num b) => a -> b
fi (a
ht a -> a -> a
forall a. Integral a => a -> a -> a
`div` 2) b -> b -> b
forall a. Num a => a -> a -> a
- 1
printString :: Display -> Drawable -> XFont -> GC -> String -> String
-> Position -> Position -> String -> Int -> IO ()
printString :: Display
-> Dimension
-> XFont
-> GC
-> String
-> String
-> Position
-> Position
-> String
-> Int
-> IO ()
printString d :: Display
d p :: Dimension
p (Core fs :: FontStruct
fs) gc :: GC
gc fc :: String
fc bc :: String
bc x :: Position
x y :: Position
y s :: String
s a :: Int
a = do
Display -> GC -> Dimension -> IO ()
setFont Display
d GC
gc (Dimension -> IO ()) -> Dimension -> IO ()
forall a b. (a -> b) -> a -> b
$ FontStruct -> Dimension
fontFromFontStruct FontStruct
fs
Display -> [String] -> ([Dimension] -> IO ()) -> IO ()
forall (m :: * -> *) a.
MonadIO m =>
Display -> [String] -> ([Dimension] -> m a) -> m a
withColors Display
d [String
fc, String
bc] (([Dimension] -> IO ()) -> IO ())
-> ([Dimension] -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \[fc' :: Dimension
fc', bc' :: Dimension
bc'] -> do
Display -> GC -> Dimension -> IO ()
setForeground Display
d GC
gc Dimension
fc'
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 255) (Display -> GC -> Dimension -> IO ()
setBackground Display
d GC
gc Dimension
bc')
Display
-> Dimension -> GC -> Position -> Position -> String -> IO ()
drawImageString Display
d Dimension
p GC
gc Position
x Position
y String
s
printString d :: Display
d p :: Dimension
p (Utf8 fs :: FontSet
fs) gc :: GC
gc fc :: String
fc bc :: String
bc x :: Position
x y :: Position
y s :: String
s a :: Int
a =
Display -> [String] -> ([Dimension] -> IO ()) -> IO ()
forall (m :: * -> *) a.
MonadIO m =>
Display -> [String] -> ([Dimension] -> m a) -> m a
withColors Display
d [String
fc, String
bc] (([Dimension] -> IO ()) -> IO ())
-> ([Dimension] -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \[fc' :: Dimension
fc', bc' :: Dimension
bc'] -> do
Display -> GC -> Dimension -> IO ()
setForeground Display
d GC
gc Dimension
fc'
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 255) (Display -> GC -> Dimension -> IO ()
setBackground Display
d GC
gc Dimension
bc')
IO () -> IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Display
-> Dimension
-> FontSet
-> GC
-> Position
-> Position
-> String
-> IO ()
wcDrawImageString Display
d Dimension
p FontSet
fs GC
gc Position
x Position
y String
s
#ifdef XFT
printString dpy :: Display
dpy drw :: Dimension
drw fs :: XFont
fs@(Xft fonts :: [AXftFont]
fonts) _ fc :: String
fc bc :: String
bc x :: Position
x y :: Position
y s :: String
s al :: Int
al =
Display
-> Dimension
-> String
-> String
-> (AXftDraw -> AXftColor -> AXftColor -> IO ())
-> IO ()
withDrawingColors Display
dpy Dimension
drw String
fc String
bc ((AXftDraw -> AXftColor -> AXftColor -> IO ()) -> IO ())
-> (AXftDraw -> AXftColor -> AXftColor -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \draw :: AXftDraw
draw fc' :: AXftColor
fc' bc' :: AXftColor
bc' -> do
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
al Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 255) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
(a :: Position
a,d :: Position
d) <- XFont -> String -> IO (Position, Position)
textExtents XFont
fs String
s
XGlyphInfo
gi <- Display -> [AXftFont] -> String -> IO XGlyphInfo
xftTxtExtents' Display
dpy [AXftFont]
fonts String
s
AXftDraw
-> AXftColor -> Position -> Position -> Int -> Position -> IO ()
forall a3 a2 a1 a.
(Integral a3, Integral a2, Integral a1, Integral a) =>
AXftDraw -> AXftColor -> a -> a1 -> a2 -> a3 -> IO ()
drawXftRect AXftDraw
draw AXftColor
bc' Position
x (Position
y Position -> Position -> Position
forall a. Num a => a -> a -> a
- Position
a) (1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ XGlyphInfo -> Int
xglyphinfo_xOff XGlyphInfo
gi) (Position
a Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
d Position -> Position -> Position
forall a. Num a => a -> a -> a
+ 2)
AXftDraw
-> AXftColor -> [AXftFont] -> Integer -> Integer -> String -> IO ()
drawXftString' AXftDraw
draw AXftColor
fc' [AXftFont]
fonts (Position -> Integer
forall a. Integral a => a -> Integer
toInteger Position
x) (Position -> Integer
forall a. Integral a => a -> Integer
toInteger Position
y) String
s
#endif
printStrings :: Drawable -> GC -> NE.NonEmpty XFont -> [Int] -> Position
-> Align -> [(Widget, String, Int, Position)] -> X ()
printStrings :: Dimension
-> GC
-> NonEmpty XFont
-> [Int]
-> Position
-> Align
-> [(Widget, String, Int, Position)]
-> X ()
printStrings _ _ _ _ _ _ [] = () -> X ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
printStrings dr :: Dimension
dr gc :: GC
gc fontlist :: NonEmpty XFont
fontlist voffs :: [Int]
voffs offs :: Position
offs a :: Align
a sl :: [(Widget, String, Int, Position)]
sl@((s :: Widget
s,c :: String
c,i :: Int
i,l :: Position
l):xs :: [(Widget, String, Int, Position)]
xs) = do
XConf
r <- ReaderT XConf IO XConf
forall r (m :: * -> *). MonadReader r m => m r
ask
let (conf :: Config
conf,d :: Display
d) = (XConf -> Config
config (XConf -> Config)
-> (XConf -> Display) -> XConf -> (Config, Display)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& XConf -> Display
display) XConf
r
alph :: Int
alph = Config -> Int
alpha Config
conf
Rectangle _ _ wid :: Dimension
wid ht :: Dimension
ht = XConf -> Rectangle
rect XConf
r
totSLen :: Position
totSLen = ((Widget, String, Int, Position) -> Position -> Position)
-> Position -> [(Widget, String, Int, Position)] -> Position
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(_,_,_,len :: Position
len) -> Position -> Position -> Position
forall a. Num a => a -> a -> a
(+) Position
len) 0 [(Widget, String, Int, Position)]
sl
remWidth :: Position
remWidth = Dimension -> Position
forall a b. (Integral a, Num b) => a -> b
fi Dimension
wid Position -> Position -> Position
forall a. Num a => a -> a -> a
- Position -> Position
forall a b. (Integral a, Num b) => a -> b
fi Position
totSLen
fontst :: XFont
fontst = NonEmpty XFont -> Int -> XFont
forall a. NonEmpty a -> Int -> a
safeIndex NonEmpty XFont
fontlist Int
i
offset :: Position
offset = case Align
a of
C -> (Position
remWidth Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
offs) Position -> Position -> Position
forall a. Integral a => a -> a -> a
`div` 2
R -> Position
remWidth
L -> Position
offs
(fc :: String
fc,bc :: String
bc) = case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==',') String
c of
(f :: String
f,',':b :: String
b) -> (String
f, String
b )
(f :: String
f, _) -> (String
f, Config -> String
bgColor Config
conf)
Position
valign <- Dimension
-> Widget -> XFont -> Int -> Config -> ReaderT XConf IO Position
forall b a (m :: * -> *).
(Integral b, Integral a, MonadIO m) =>
a -> Widget -> XFont -> Int -> Config -> m b
verticalOffset Dimension
ht Widget
s (NonEmpty XFont -> XFont
forall a. NonEmpty a -> a
NE.head NonEmpty XFont
fontlist) ([Int]
voffs [Int] -> Int -> Int
forall a. [a] -> Int -> a
!! Int
i) Config
conf
case Widget
s of
(Text t :: String
t) -> IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ Display
-> Dimension
-> XFont
-> GC
-> String
-> String
-> Position
-> Position
-> String
-> Int
-> IO ()
printString Display
d Dimension
dr XFont
fontst GC
gc String
fc String
bc Position
offset Position
valign String
t Int
alph
(Icon p :: String
p) -> IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$ IO () -> (Bitmap -> IO ()) -> Maybe Bitmap -> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
(Display
-> Dimension
-> GC
-> String
-> String
-> Position
-> Position
-> Bitmap
-> IO ()
B.drawBitmap Display
d Dimension
dr GC
gc String
fc String
bc Position
offset Position
valign)
(String -> Map String Bitmap -> Maybe Bitmap
forall k a. Ord k => k -> Map k a -> Maybe a
lookup String
p (XConf -> Map String Bitmap
iconS XConf
r))
Dimension
-> GC
-> NonEmpty XFont
-> [Int]
-> Position
-> Align
-> [(Widget, String, Int, Position)]
-> X ()
printStrings Dimension
dr GC
gc NonEmpty XFont
fontlist [Int]
voffs (Position
offs Position -> Position -> Position
forall a. Num a => a -> a -> a
+ Position
l) Align
a [(Widget, String, Int, Position)]
xs