Send X message batched

This commit is contained in:
Matthias Schiffer 2011-10-07 05:31:23 +02:00
parent 5cb4744d4f
commit 579552b29b
2 changed files with 24 additions and 3 deletions

View file

@ -7,6 +7,7 @@ module Phi.Phi ( Phi
, initPhi
, dupPhi
, sendMessage
, sendMessages
, receiveMessage
, messageAvailable
) where
@ -36,6 +37,9 @@ dupPhi (Phi chan) = liftM Phi $ liftIO $ atomically $ dupTChan chan
sendMessage :: (MonadIO m, Typeable a, Show a) => Phi -> a -> m ()
sendMessage (Phi chan) = liftIO . atomically . writeTChan chan . Message
sendMessages :: (MonadIO m, Typeable a, Show a) => Phi -> [a] -> m ()
sendMessages (Phi chan) = liftIO . atomically . mapM_ (writeTChan chan . Message)
receiveMessage :: MonadIO m => Phi -> m Message
receiveMessage (Phi chan) = liftIO $ atomically $ readTChan chan

View file

@ -179,7 +179,7 @@ runPhi xconfig config widget = do
forever $ do
available <- messageAvailable phi
repaint <- gets phiRepaint
when (not available && repaint) $ liftIO $ threadDelay 20000
when (not available && repaint) $ liftIO $ threadDelay 30000
available <- messageAvailable phi
when (not available && repaint) $ do
@ -296,9 +296,26 @@ handleConfigureNotifyEvent MkConfigureNotifyEvent { window_ConfigureNotifyEvent
sendMessage phi $ UpdateScreens $ map (panelScreenArea &&& panelWindow) panels'
sendMessage phi Repaint
maybeReceiveEvents' :: Connection -> IO [XEvent]
maybeReceiveEvents' conn = do
yield
mevent <- pollForEvent conn
case mevent of
Just event ->
liftM2 (:) (return . XEvent $ event) (maybeReceiveEvents' conn)
Nothing ->
return []
receiveEvents' :: Connection -> IO [XEvent]
receiveEvents' conn = do
liftM2 (:) (liftM XEvent $ waitForEvent conn) (maybeReceiveEvents' conn)
receiveEvents :: Phi -> Connection -> IO ()
receiveEvents phi conn = do
forever $ waitForEvent conn >>= sendMessage phi . XEvent
receiveEvents phi conn =
forever $ receiveEvents' conn >>= sendMessages phi
updatePanels :: (Widget w s c X11) => PhiX w s c ()
updatePanels = do