summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xmobar')
-rw-r--r--src/Xmobar/App/Main.hs56
-rw-r--r--src/Xmobar/Run/Template.hs3
2 files changed, 58 insertions, 1 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
diff --git a/src/Xmobar/Run/Template.hs b/src/Xmobar/Run/Template.hs
index a544724..5b1e2f2 100644
--- a/src/Xmobar/Run/Template.hs
+++ b/src/Xmobar/Run/Template.hs
@@ -46,7 +46,8 @@ templateCommandParser sepChar =
templateParser :: String -> Parser [(String,String,String)]
templateParser s = many $ templateStringParser s
--- | Actually runs the template parsers
+-- | Actually runs the template parsers over a (segment of) a template
+-- string, returning a list of runnables with their prefix and suffix.
parseTemplate :: [Runnable] -> String -> String -> IO [(Runnable,String,String)]
parseTemplate c sepChar s =
do str <- case parse (templateParser sepChar) "" s of