------------------------------------------------------------------------------ -- | -- Module: Xmobar.Text.Loop -- Copyright: (c) 2022, 2025 Jose Antonio Ortega Ruiz -- License: BSD3-style (see LICENSE) -- -- Maintainer: jao@gnu.org -- Stability: unstable -- Portability: unportable -- Created: Fri Jan 28, 2022 01:21 -- -- -- Text-only event loop -- ------------------------------------------------------------------------------ module Xmobar.Text.Loop (textLoop) where import Prelude hiding (lookup) import System.IO (hSetBuffering, stdin, stdout, BufferMode(LineBuffering)) import Control.Concurrent.STM import Xmobar.System.Signal import Xmobar.Config.Types (Config) import Xmobar.Run.Loop (loop) import Xmobar.Run.Runnable (Runnable) import Xmobar.Text.Output (initLoop, format) -- | Starts the main event loop and threads textLoop :: Config -> IO () textLoop conf = do hSetBuffering stdin LineBuffering hSetBuffering stdout LineBuffering initLoop conf loop conf (eventLoop conf) -- | Continuously wait for a signal from a thread or a interrupt handler eventLoop :: Config -> [Runnable] -> TMVar SignalType -> TVar [String] -> IO () eventLoop cfg rs signal tv = do typ <- atomically $ takeTMVar signal case typ of Wakeup -> updateString cfg tv >>= putStrLn >> eventLoop cfg rs signal tv _ -> eventLoop cfg rs signal tv updateString :: Config -> TVar [String] -> IO String updateString conf v = do s <- readTVarIO v return $ format conf (concat s)