summaryrefslogtreecommitdiffstats
path: root/XMonad/Stockholm/Font.hs
blob: ed801cc6faa25ff2df9f8206293bafed9f02afaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
{-# LANGUAGE CPP #-}

module XMonad.Stockholm.Font
    ( printStringCentered
    , printStringXMF'
    ) where

import XMonad
import XMonad.Util.Font


printStringCentered :: (Functor m, MonadIO m)
                    => Display -> Drawable -> XMonadFont
                    -> GC -> Rectangle -> String
                    -> m ()
printStringCentered d p xmf gc r s = do
    let x = rect_x r
        y = rect_y r
        w = rect_width r
        h = rect_height r

    text_w <- textWidthXMF d xmf s
    (text_ascent, _) <- textExtentsXMF xmf s

    let text_x = x + round ((fi w - fi text_w) / (2 :: Double))
        text_y = y + round ((fi h + fi text_h) / (2 :: Double))
        text_h = text_ascent

    printStringXMF' d p xmf gc "" "" text_x text_y s


-- from xmonad-contrib's XMonad.Util.Font, (c) 2007 Andrea Rossato and Spencer Janssen
printStringXMF' :: (Functor m, MonadIO m) => Display -> Drawable -> XMonadFont -> GC -> String -> String
            -> Position -> Position -> String  -> m ()
printStringXMF' d p (Core fs) gc _fc _bc x y s = io $ do
    setFont d gc $ fontFromFontStruct fs
    --tv [fc',bc'] <- mapM (stringToPixel d) [fc,bc]
    --tv setForeground d gc fc'
    --tv setBackground d gc bc'
    drawImageString d p gc x y s
printStringXMF' d p (Utf8 fs) gc _fc _bc x y s = io $ do
    --tv [fc',bc'] <- mapM (stringToPixel d) [fc,bc]
    --tv setForeground d gc fc'
    --tv setBackground d gc bc'
    io $ wcDrawImageString d p fs gc x y s
#ifdef XFT
printStringXMF' dpy drw fs@(Xft font) gc fc bc x y s = do
  let screen   = defaultScreenOfDisplay dpy
      colormap = defaultColormapOfScreen screen
      visual   = defaultVisualOfScreen screen
  --tv bcolor <- stringToPixel dpy bc
  (a,d)  <- textExtentsXMF fs s
  gi <- io $ xftTextExtents dpy font s
  --tv io $ setForeground dpy gc bcolor
  io $ fillRectangle dpy drw gc (x - fi (xglyphinfo_x gi))
                                (y - fi a)
                                (fi $ xglyphinfo_xOff gi)
                                (fi $ a + d)
  io $ withXftDraw dpy drw visual colormap $
         \draw -> withXftColorName dpy visual colormap fc $
                   \color -> xftDrawString draw color font x y s
#else
printStringXMF' _ _ (Xft _) _ _ _ _ _ _ = undefined
#endif





-- --my_printStringXMF :: (Functor m, MonadIO m) => Display -> Drawable -> XMonadFont -> GC -> String -> String
-- --            -> Position -> Position -> String  -> m ()
-- my_printStringXMF (Core fs) d p gc x y s = do
--     setFont d gc $ fontFromFontStruct fs
--     -- [fc',bc'] <- mapM (stringToPixel d) [fc,bc]
--     -- setForeground d gc fc'
--     -- setBackground d gc bc'
--     drawImageString d p gc x y s
-- my_printStringXMF (Utf8 fs) d p gc x y s = do
--     -- [fc',bc'] <- mapM (stringToPixel d) [fc,bc]
--     -- setForeground d gc fc'
--     -- setBackground d gc bc'
--     wcDrawImageString d p fs gc x y s
-- #ifdef XFT
-- my_printStringXMF dpy drw fs@(Xft font) gc fc bc x y s = do
--   let screen   = defaultScreenOfDisplay dpy
--       colormap = defaultColormapOfScreen screen
--       visual   = defaultVisualOfScreen screen
--   bcolor <- stringToPixel dpy bc
--   (a,d)  <- textExtentsXMF fs s
--   gi <- io $ xftTextExtents dpy font s
--   io $ setForeground dpy gc bcolor
--   io $ fillRectangle dpy drw gc (x - fromIntegral (xglyphinfo_x gi))
--                                 (y - fromIntegral a)
--                                 (fromIntegral $ xglyphinfo_xOff gi)
--                                 (fromIntegral $ a + d)
--   io $ withXftDraw dpy drw visual colormap $
--          \draw -> withXftColorName dpy visual colormap fc $
--                    \color -> xftDrawString draw color font x y s
-- #endif



-- --textWidthXMF :: MonadIO m => Display -> XMonadFont -> String -> m Int
-- my_textWidthXMF _   (Utf8 fs) s = return $ fromIntegral $ wcTextEscapement fs s
-- my_textWidthXMF _   (Core fs) s = return $ fromIntegral $ textWidth fs s
-- #ifdef XFT
-- my_TextWidthXMF dpy (Xft xftdraw) s = liftIO $ do
--     gi <- xftTextExtents dpy xftdraw s
--     return $ xglyphinfo_xOff gi
-- #endif
-- 
-- my_textExtentsXMF :: MonadIO m => XMonadFont -> String -> m (Int32,Int32)
-- my_textExtentsXMF (Utf8 fs) s = do
--   let (_,rl)  = wcTextExtents fs s
--       ascent  = fromIntegral $ - (rect_y rl)
--       descent = fromIntegral $ rect_height rl + (fromIntegral $ rect_y rl)
--   return (ascent, descent)
-- my_textExtentsXMF (Core fs) s = do
--   let (_,a,d,_) = textExtents fs s
--   return (a,d)
-- #ifdef XFT
-- my_textExtentsXMF (Xft xftfont) _ = io $ do
--   ascent  <- fromIntegral `fmap` xftfont_ascent  xftfont
--   descent <- fromIntegral `fmap` xftfont_descent xftfont
--   return (ascent, descent)
-- #endif