diff options
| author | Andrea Rossato <andrea.rossato@ing.unitn.it> | 2007-07-17 15:14:11 +0200 | 
|---|---|---|
| committer | Andrea Rossato <andrea.rossato@ing.unitn.it> | 2007-07-17 15:14:11 +0200 | 
| commit | df7761651e426bc874b30cb52fb4205543031a91 (patch) | |
| tree | f47293ddd5a841e798619d42fe202340efd1d1f2 | |
| parent | c2b98fd88acba773135167454422ff68c85e2f49 (diff) | |
| download | xmobar-df7761651e426bc874b30cb52fb4205543031a91.tar.gz xmobar-df7761651e426bc874b30cb52fb4205543031a91.tar.bz2 | |
XExposeEvent handling: that requires X11-extras
XExposeEvent is now properly (sort of) handled, with an hackish approch:
before nextEvent, that will block Xmobar since an Expose event is captured,
we create a background thread that will send an Expose event after the
configured refresh interval. So, either a real of a fake Expose event will
reach our window within the configured interval. Quite cool, after all.
darcs-hash:20070717131411-d6583-0d3438bdcb1d346ade3932ffb979cb998654e4d1.gz
| -rw-r--r-- | Xmobar.hs | 30 | ||||
| -rw-r--r-- | xmobar.cabal | 3 | 
2 files changed, 27 insertions, 6 deletions
| @@ -19,6 +19,8 @@ module Xmobar (-- * Main Stuff                , runXbar                , eventLoop                , createWin +              , updateWin +              , sendUpdateEvent                -- * Printing                -- $print                , drawInWin @@ -39,6 +41,8 @@ module Xmobar (-- * Main Stuff  import Graphics.X11.Xlib  import Graphics.X11.Xlib.Misc +import Graphics.X11.Xlib.Event +import Graphics.X11.Xlib.Extras  import Control.Monad.State  import Control.Monad.Reader @@ -76,11 +80,11 @@ eventLoop :: Xbar ()  eventLoop =      do c <- ask         s <- get -       i <- io $ readVariables (vars s) -       ps <- io $ parseString c i -       drawInWin ps -       -- back again: we are never ending -       io $ tenthSeconds (refresh c) +       io $ forkIO $ sendUpdateEvent (display s) (window s) (refresh c) +       action <- io $ allocaXEvent $ \e -> +                 do nextEvent (display s) e +                    return updateWin +       action         eventLoop  -- | The function to create the initial window @@ -94,9 +98,25 @@ createWin config =              (fi $ yPos config)               (fi $ width config)               (fi $ height config) +     selectInput dpy win exposureMask       mapWindow dpy win       return (dpy,win) +sendUpdateEvent :: Display -> Window -> Int -> IO () +sendUpdateEvent dpy w d =  +    do tenthSeconds d +       allocaXEvent $ \e -> do +         setEventType e expose +         sendEvent dpy w False noEventMask e  +       sync dpy False + +updateWin :: Xbar () +updateWin = +    do c <- ask +       s <- get +       i <- io $ readVariables (vars s) +       ps <- io $ parseString c i +       drawInWin ps  -- $print diff --git a/xmobar.cabal b/xmobar.cabal index 89d79c2..bc6255c 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -12,7 +12,8 @@ license:            BSD3  license-file:       LICENSE  author:             Andrea Rossato  maintainer:         andrea.rossato@unibz.it -build-depends:      base>=2.0, X11>=1.2.1, mtl>=1.0, unix>=1.0, parsec>=2.0, filepath>=1.0 +build-depends:      base>=2.0, X11>=1.2.1, mtl>=1.0, unix>=1.0, parsec>=2.0, filepath>=1.0,  +		    X11-extras>=2.0  executable:         xmobar  main-is:            Main.hs | 
