diff options
-rw-r--r-- | Xmobar.hs | 130 |
1 files changed, 65 insertions, 65 deletions
@@ -110,83 +110,83 @@ startCommand (com,s,ss) -- | The function to create the initial window createWin :: Config -> IO (Display, Window) -createWin conf = - do dpy <- openDisplay "" - let dflt = defaultScreen dpy - rootw <- rootWindow dpy dflt - win <- mkUnmanagedWindow dpy (defaultScreenOfDisplay dpy) rootw - (fi $ xPos conf) - (fi $ yPos conf) - (fi $ width conf) - (fi $ height conf) - selectInput dpy win exposureMask - mapWindow dpy win - return (dpy,win) +createWin conf = do + dpy <- openDisplay "" + let dflt = defaultScreen dpy + rootw <- rootWindow dpy dflt + win <- mkUnmanagedWindow dpy (defaultScreenOfDisplay dpy) rootw + (fi $ xPos conf) + (fi $ yPos conf) + (fi $ width conf) + (fi $ height conf) + selectInput dpy win exposureMask + mapWindow dpy win + return (dpy,win) updateWin :: TVar String -> X () -updateWin v = - do c <- asks config - i <- io $ atomically $ readTVar v - ps <- io $ parseString c i - drawInWin ps +updateWin v = do + c <- asks config + i <- io $ atomically $ readTVar v + ps <- io $ parseString c i + drawInWin ps -- $print -- | Draws in and updates the window drawInWin :: [(String, String)] -> X () -drawInWin str = - do r <- ask - let (conf,(d,w)) = (config &&& display &&& window) r - bgcolor <- io $ initColor d $ bgColor conf - gc <- io $ createGC d w - --let's get the fonts - let lf c = loadQueryFont d (font c) - fontst <- io $ catch (lf conf) (const $ lf defaultConfig) - io $ setFont d gc (fontFromFontStruct fontst) - -- create a pixmap to write to and fill it with a rectangle - p <- io $ createPixmap d w - (fi (width conf)) - (fi (height conf)) - (defaultDepthOfScreen (defaultScreenOfDisplay d)) - -- the fgcolor of the rectangle will be the bgcolor of the window - io $ setForeground d gc bgcolor - io $ fillRectangle d p gc 0 0 - (fi $ width conf) - (fi $ height conf) - -- write to the pixmap the new string - let strWithLenth = map (\(s,c) -> (s,c,textWidth fontst s)) str - printStrings p gc fontst 1 strWithLenth - -- copy the pixmap with the new string to the window - io $ copyArea d p w gc 0 0 (fi (width conf)) (fi (height conf)) 0 0 - -- free up everything (we do not want to leak memory!) - io $ freeFont d fontst - io $ freeGC d gc - io $ freePixmap d p - -- resync - io $ sync d True +drawInWin str = do + r <- ask + let (conf,(d,w)) = (config &&& display &&& window) r + bgcolor <- io $ initColor d $ bgColor conf + gc <- io $ createGC d w + --let's get the fonts + let lf c = loadQueryFont d (font c) + fontst <- io $ catch (lf conf) (const $ lf defaultConfig) + io $ setFont d gc (fontFromFontStruct fontst) + -- create a pixmap to write to and fill it with a rectangle + p <- io $ createPixmap d w + (fi (width conf)) + (fi (height conf)) + (defaultDepthOfScreen (defaultScreenOfDisplay d)) + -- the fgcolor of the rectangle will be the bgcolor of the window + io $ setForeground d gc bgcolor + io $ fillRectangle d p gc 0 0 + (fi $ width conf) + (fi $ height conf) + -- write to the pixmap the new string + let strWithLenth = map (\(s,c) -> (s,c,textWidth fontst s)) str + printStrings p gc fontst 1 strWithLenth + -- copy the pixmap with the new string to the window + io $ copyArea d p w gc 0 0 (fi (width conf)) (fi (height conf)) 0 0 + -- free up everything (we do not want to leak memory!) + io $ freeFont d fontst + io $ freeGC d gc + io $ freePixmap d p + -- resync + io $ sync d True -- | An easy way to print the stuff we need to print printStrings :: Drawable -> GC -> FontStruct -> Position -> [(String, String, Position)] -> X () printStrings _ _ _ _ [] = return () -printStrings dr gc fontst offs sl@((s,c,l):xs) = - do r <- ask - let (conf,d) = (config &&& display) r - (_,asc,_,_) = textExtents fontst s - totSLen = foldr (\(_,_,len) -> (+) len) 0 sl - valign = (fi (height conf) + fi asc) `div` 2 - remWidth = fi (width conf) - fi totSLen - offset = case (align conf) of - "center" -> (remWidth + offs) `div` 2 - "right" -> remWidth - 1 - "left" -> offs - _ -> offs - fgcolor <- io $ initColor d c - bgcolor <- io $ initColor d (bgColor conf) - io $ setForeground d gc fgcolor - io $ setBackground d gc bgcolor - io $ drawImageString d dr gc offset valign s - printStrings dr gc fontst (offs + l) xs +printStrings dr gc fontst offs sl@((s,c,l):xs) = do + r <- ask + let (conf,d) = (config &&& display) r + (_,asc,_,_) = textExtents fontst s + totSLen = foldr (\(_,_,len) -> (+) len) 0 sl + valign = (fi (height conf) + fi asc) `div` 2 + remWidth = fi (width conf) - fi totSLen + offset = case (align conf) of + "center" -> (remWidth + offs) `div` 2 + "right" -> remWidth - 1 + "left" -> offs + _ -> offs + fgcolor <- io $ initColor d c + bgcolor <- io $ initColor d (bgColor conf) + io $ setForeground d gc fgcolor + io $ setBackground d gc bgcolor + io $ drawImageString d dr gc offset valign s + printStrings dr gc fontst (offs + l) xs {- $unmanwin |