diff options
author | jao <jao@gnu.org> | 2018-11-25 22:24:39 +0000 |
---|---|---|
committer | jao <jao@gnu.org> | 2018-11-25 22:24:39 +0000 |
commit | dba5bb8d946deca0872a17d98e3f1753c2160163 (patch) | |
tree | 8cd1ea8b9ca1376deb47176ca162459fd990bd7c /src/Xmobar/App | |
parent | d1fa2bd306cf847311b3cf02e8f2de8bab8ee115 (diff) | |
download | xmobar-dba5bb8d946deca0872a17d98e3f1753c2160163.tar.gz xmobar-dba5bb8d946deca0872a17d98e3f1753c2160163.tar.bz2 |
Xmobar.App.Main
Diffstat (limited to 'src/Xmobar/App')
-rw-r--r-- | src/Xmobar/App/Main.hs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/Xmobar/App/Main.hs b/src/Xmobar/App/Main.hs new file mode 100644 index 0000000..329a4b5 --- /dev/null +++ b/src/Xmobar/App/Main.hs @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------ +-- | +-- Module: Xmobar.App.Main +-- Copyright: (c) 2018 Jose Antonio Ortega Ruiz +-- License: BSD3-style (see LICENSE) +-- +-- Maintainer: jao@gnu.org +-- Stability: unstable +-- Portability: portable +-- Created: Sun Nov 25, 2018 21:53 +-- +-- +-- Support for creating executable main functions +-- +------------------------------------------------------------------------------ + + +module Xmobar.App.Main (xmobar) where + +import Data.Foldable (for_) +import qualified Data.Map as Map + +import Graphics.X11.Xlib +import Control.Concurrent.Async (Async, cancel) +import Control.Exception (bracket) + +import Xmobar.Config +import Xmobar.System.Signal (setupSignalHandler, withDeferSignals) +import Xmobar.Run.Template +import Xmobar.X11.Types +import Xmobar.X11.XUtil +import Xmobar.X11.Window +import Xmobar.App.EventLoop (startLoop, startCommand) + +xmobar :: Config -> IO () +xmobar conf = withDeferSignals $ do + initThreads + d <- openDisplay "" + fs <- initFont d (font conf) + fl <- mapM (initFont d) (additionalFonts conf) + cls <- mapM (parseTemplate (commands conf) (sepChar conf)) + (splitTemplate (alignSep conf) (template conf)) + sig <- setupSignalHandler + bracket (mapM (mapM $ startCommand sig) cls) + cleanupThreads + $ \vars -> do + (r,w) <- createWin d fs conf + let ic = Map.empty + to = textOffset conf + ts = textOffsets conf ++ replicate (length fl) (-1) + startLoop (XConf d r w (fs:fl) (to:ts) ic conf) sig vars + +cleanupThreads :: [[([Async ()], a)]] -> IO () +cleanupThreads vars = + for_ (concat vars) $ \(asyncs, _) -> + for_ asyncs cancel |