summaryrefslogtreecommitdiffstats
path: root/XMonad/Stockholm/Font.hs
blob: 40bb332561653a502b57fe2ad257a5e3b66f6075 (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
127
128
129
130
{-# LANGUAGE CPP #-}

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

#ifdef XFT
import Graphics.X11.Xft
import Graphics.X11.Xrender
#endif
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