diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/MinXft.hsc | 45 | ||||
| -rw-r--r-- | src/XUtil.hsc | 6 | 
2 files changed, 29 insertions, 22 deletions
| diff --git a/src/MinXft.hsc b/src/MinXft.hsc index 3d3aadf..b2299af 100644 --- a/src/MinXft.hsc +++ b/src/MinXft.hsc @@ -2,7 +2,7 @@  ------------------------------------------------------------------------------  -- |  -- Module: MinXft --- Copyright: (c) 2012 Jose Antonio Ortega Ruiz +-- Copyright: (c) 2012, 2014 Jose Antonio Ortega Ruiz  --            (c) Clemens Fruhwirth <clemens@endorphin.org> 2007  -- License: BSD3-style (see LICENSE)  -- @@ -106,7 +106,7 @@ xftTxtExtents d f string =        peek cglyph  xftTxtExtents' :: Display -> [AXftFont] -> String -> IO XGlyphInfo -xftTxtExtents' d fs string = do   +xftTxtExtents' d fs string = do      chunks <- getChunks d fs string      let (_, _, gi, _, _) = last chunks      return gi @@ -162,47 +162,54 @@ drawXftString d c f x y string =      withArrayLen (map fi (UTF8.encode string))        (\len ptr -> cXftDrawStringUtf8 d c f (fi x) (fi y) ptr (fi len)) -drawXftString' :: (Integral a1, Integral a) => -                  AXftDraw -> AXftColor -> [AXftFont] -> a -> a1 -> String -> IO () +drawXftString' :: AXftDraw -> +                  AXftColor -> +                  [AXftFont] -> +                  Integer -> +                  Integer -> +                  String -> IO ()  drawXftString' d c fs x y string = do      display <- c_xftDrawDisplay d      chunks <- getChunks display fs string -    mapM_ (\(f, s, gi, xo, yo) -> drawXftString d c f (x+xo) (y+yo) s) chunks +    mapM_ (\(f, s, _, xo, yo) -> drawXftString d c f (x+xo) (y+yo) s) chunks  -- Split string and determine fonts/offsets for individual parts +getChunks :: Display -> [AXftFont] -> [Char] -> +             IO [(AXftFont, String, XGlyphInfo, Integer, Integer)]  getChunks disp fts str = do      chunks <- getFonts disp fts str -    getOffsets disp (XGlyphInfo 0 0 0 0 0 0) chunks +    getOffsets (XGlyphInfo 0 0 0 0 0 0) chunks    where      -- Split string and determine fonts for individual parts      getFonts _ [] _ = return []      getFonts _ _ [] = return [] -    getFonts _ [ft] str = return [(ft, str)] -    getFonts disp fonts@(ft:fts) str = do +    getFonts _ [ft] s = return [(ft, s)] +    getFonts d fonts@(ft:_) s = do          -- Determine which glyph can be rendered by current font -        glyphs <- mapM (xftCharExists disp ft) str +        glyphs <- mapM (xftCharExists d ft) s          -- Split string into parts that can/cannot be rendered -        let splits = split (runs glyphs) str +        let splits = split (runs glyphs) s          -- Determine which font to render each chunk with -        concat `fmap` mapM (getFont disp fonts) splits +        concat `fmap` mapM (getFont d fonts) splits      -- Determine fonts for substrings -    getFont _ [ft] (_, str) = return [(ft, str)] -- Last font, use it -    getFont _ (ft:fts) (True, str) = return [(ft, str)] -- Current font can render this substring -    getFont disp (ft:fts) (False, str) = getFonts disp fts str -- Fallback to next font +    getFont _ [] _ = return [] +    getFont _ [ft] (_, s) = return [(ft, s)] -- Last font, use it +    getFont _ (ft:_) (True, s) = return [(ft, s)] -- Current font can render this substring +    getFont d (_:fs) (False, s) = getFonts d fs s -- Fallback to next font      -- Helpers      runs [] = []      runs (x:xs) = let (h, t) = span (==x) xs in (x, length h + 1) : runs t      split [] _ = [] -    split ((x, c):xs) str = let (h, t) = splitAt c str in (x, h) : split xs t +    split ((x, c):xs) s = let (h, t) = splitAt c s in (x, h) : split xs t      -- Determine coordinates for chunks using extents -    getOffsets disp _ [] = return [] -    getOffsets disp (XGlyphInfo w h x y xo yo) ((f, s):chunks) = do -        (XGlyphInfo w' h' x' y' xo' yo') <- xftTxtExtents disp f s +    getOffsets _ [] = return [] +    getOffsets (XGlyphInfo _ _ x y xo yo) ((f, s):chunks) = do +        (XGlyphInfo w' h' _ _ xo' yo') <- xftTxtExtents disp f s          let gi = XGlyphInfo (xo+w') (yo+h') x y (xo+xo') (yo+yo') -        rest <- getOffsets disp gi chunks +        rest <- getOffsets gi chunks          return $ (f, s, gi, fromIntegral xo, fromIntegral yo) : rest  foreign import ccall "XftDrawRect" diff --git a/src/XUtil.hsc b/src/XUtil.hsc index b1611d6..1217452 100644 --- a/src/XUtil.hsc +++ b/src/XUtil.hsc @@ -2,7 +2,7 @@  -----------------------------------------------------------------------------  -- |  -- Module      :  XUtil --- Copyright   :  (C) 2011, 2012, 2013 Jose Antonio Ortega Ruiz +-- Copyright   :  (C) 2011, 2012, 2013, 2014 Jose Antonio Ortega Ruiz  --                (C) 2007 Andrea Rossato  -- License     :  BSD3  -- @@ -124,7 +124,7 @@ initXftFont d s = do    let fontNames = wordsBy (== ',') (drop 4 s)    fonts <- mapM openFont fontNames    return fonts -  where  +  where      openFont fontName = do          f <- openAXftFont d (defaultScreenOfDisplay d) fontName          addFinalizer f (closeAXftFont d f) @@ -185,7 +185,7 @@ printString dpy drw fs@(Xft fonts) _ fc bc x y s = do                            (y - (a + d) + 1)                            (xglyphinfo_xOff gi)                            (a + d)) >> -    (drawXftString' draw fc' fonts x (y - 2) s) +    (drawXftString' draw fc' fonts (toInteger x) (toInteger (y - 2)) s)  #endif | 
