diff options
-rw-r--r-- | Xmobar.hs | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -71,20 +71,22 @@ runX c d w f = runReaderT f (XConf d w c) -- | The event loop eventLoop :: Config -> [(Maybe ThreadId, TVar String)] -> Display -> Window -> IO () eventLoop c v d w = do + b <- newEmptyMVar tv <- atomically $ newTVar [] - t <- forkIO (block $ go tv) - checker t tv + t <- forkIO (block $ do putMVar b (); go tv) + takeMVar b + checker t tv "" where -- interrupt the drawing thread every time a var is updated - checker t tvar = do + checker t tvar ov = do nval <- atomically $ do - ov <- readTVar tvar - nv <- mapM readTVar (map snd v) - if concat nv == ov then retry else return (concat nv) - atomically $ writeTVar tvar nval - threadDelay 1000 + nv <- fmap concat $ mapM readTVar (map snd v) + guard (nv /= ov) + writeTVar tvar nv + return nv throwTo t (ErrorCall "Xmobar.eventLoop: yield") - checker t tvar + checker t tvar nval + -- Continuously wait for a timer interrupt or an expose event go tvar = do runX c d w (updateWin tvar) |