diff options
author | Andrea Rossato <andrea.rossato@ing.unitn.it> | 2007-07-09 00:48:54 +0200 |
---|---|---|
committer | Andrea Rossato <andrea.rossato@ing.unitn.it> | 2007-07-09 00:48:54 +0200 |
commit | b70f7796a04a92c581d81c426c4c3d236b76ee03 (patch) | |
tree | 0d3e84f79ff43339c046d39d0995625959b30f3c | |
parent | 3f06ce7dcfea44dd1cea52ec30840610b6a7eb33 (diff) | |
download | xmobar-b70f7796a04a92c581d81c426c4c3d236b76ee03.tar.gz xmobar-b70f7796a04a92c581d81c426c4c3d236b76ee03.tar.bz2 |
This should fix the flickering problem on window's updates
darcs-hash:20070708224854-d6583-0300fb2f09da07c975b49c7ed75080ad29f2492a.gz
-rw-r--r-- | XMobar.hs | 43 |
1 files changed, 29 insertions, 14 deletions
@@ -111,28 +111,40 @@ drawInWin str = --let's get the fonts fontst <- io $ loadQueryFont dpy (font config) io $ setFont dpy gc (fontFromFontStruct fontst) - - -- set window background + -- create a pixmap to write to and fill it with a rectangle: + p <- io $ createPixmap dpy win + (fromIntegral (width config)) + (fromIntegral (height config)) + (defaultDepthOfScreen (defaultScreenOfDisplay dpy)) io $ setForeground dpy gc bgcolor - io $ fillRectangle dpy win gc 0 0 + io $ fillRectangle dpy p gc 0 0 (fromIntegral $ width config) (fromIntegral $ height config) - -- write + -- write to the pixmap the new string: let strWithLenth = map (\(s,c) -> (s,c,textWidth fontst s)) str - printStrings gc fontst 1 strWithLenth - -- free everything + p' <- printStrings p gc fontst 1 strWithLenth + -- copy the pixmap with the new string to the window. + io $ copyArea dpy p' win gc + (fromIntegral (xPos config)) + (fromIntegral (yPos config)) + (fromIntegral (width config)) + (fromIntegral (height config)) 0 0 + -- free up everything (we do not want to leak memory!) io $ freeFont dpy fontst io $ freeGC dpy gc + io $ freePixmap dpy p' + -- resync io $ sync dpy True -- | An easy way to print the stuff we need to print -printStrings :: GC +printStrings :: Drawable + -> GC -> FontStruct -> Position -> [(String, String, Position)] - -> Xbar () -printStrings _ _ _ [] = return () -printStrings gc fontst offs sl@((s,c,l):xs) = + -> Xbar Pixmap --() +printStrings p _ _ _ [] = return p --() +printStrings p gc fontst offs sl@((s,c,l):xs) = do config <- ask st <- get let (_,asc,_,_) = textExtents fontst s @@ -144,10 +156,13 @@ printStrings gc fontst offs sl@((s,c,l):xs) = "right" -> remWidth - 1 "left" -> offs _ -> offs - color <- io $ initColor (display st) c - io $ setForeground (display st) gc color - io $ drawString (display st) (window st) gc offset valign s - printStrings gc fontst (offs + l) xs + fgcolor <- io $ initColor (display st) c + bgcolor <- io $ initColor (display st) (bgColor config) + io $ setForeground (display st) gc fgcolor + io $ setBackground (display st) gc bgcolor + io $ drawImageString (display st) p gc offset valign s + p' <- printStrings p gc fontst (offs + l) xs + return p' -- $commands |