[Xmonad] X Events in a Status Bar

Andrea Rossato mailing_list at istitutocolli.org
Tue Jul 17 09:09:35 EDT 2007


On Tue, Jul 17, 2007 at 02:12:15PM +0200, Robert Manea wrote:
>   - Have all the X stuff in a separate thread which can block
>   - Use some signaling to inform the thread there is new data

I did a mix of the two: before blocking the main thread with
XNextEvent I create a background thread. This will wait for the
configured interval and then will send an expose event to the window,
which will unblock XNextEvent.

Since the window's event_mask includes only Expose, I'm not even
capturing the Event.

Sound hackish, too hackish, but I did not find a quicker way.

What do you think?

thanks for your help.

andrea

the code just for reference

-- | The event loop
eventLoop :: Xbar ()
eventLoop =
    do c <- ask
       s <- get
       io $ forkIO $ sendUpdateMsg (display s) (window s) (refresh c)
       action <- io $ allocaXEvent $ \e ->
                 do nextEvent (display s) e -- just wait...
                    return updateWin -- ok, it's time
       action
       eventLoop

sendUpdateMsg :: Display -> Window -> Int -> IO ()
sendUpdateMsg dpy w d = 
    do tenthSeconds d
       allocaXEvent $ \e -> do
         setEventType e expose
         sendEvent dpy w False noEventMask e 
       sync dpy False


More information about the Xmonad mailing list