From dba5bb8d946deca0872a17d98e3f1753c2160163 Mon Sep 17 00:00:00 2001 From: jao Date: Sun, 25 Nov 2018 22:24:39 +0000 Subject: Xmobar.App.Main --- src/Xmobar.hs | 40 ++++----------------------------- src/Xmobar/App/Main.hs | 56 ++++++++++++++++++++++++++++++++++++++++++++++ src/Xmobar/Run/Template.hs | 3 ++- xmobar.cabal | 9 ++++---- 4 files changed, 67 insertions(+), 41 deletions(-) create mode 100644 src/Xmobar/App/Main.hs diff --git a/src/Xmobar.hs b/src/Xmobar.hs index be20dbe..2b15835 100644 --- a/src/Xmobar.hs +++ b/src/Xmobar.hs @@ -17,6 +17,7 @@ module Xmobar (xmobar , Runnable (..) + , Exec (..) , module Xmobar.Config , module Xmobar.Plugins.BufferedPipeReader , module Xmobar.Plugins.CommandReader @@ -37,20 +38,9 @@ module Xmobar (xmobar , module Xmobar.Plugins.XMonadLog ) 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.Run.Runnable -import Xmobar.Run.Template -import Xmobar.System.Signal (setupSignalHandler, withDeferSignals) -import Xmobar.X11.Types -import Xmobar.X11.XUtil -import Xmobar.X11.Window +import Xmobar.Run.Commands +import Xmobar.Config import Xmobar.Plugins.BufferedPipeReader import Xmobar.Plugins.CommandReader import Xmobar.Plugins.Date @@ -68,27 +58,5 @@ import Xmobar.Plugins.Monitors import Xmobar.Plugins.PipeReader import Xmobar.Plugins.StdinReader import Xmobar.Plugins.XMonadLog -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 +import Xmobar.App.Main (xmobar) 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 diff --git a/xmobar.cabal b/xmobar.cabal index ca19863..69f8f4d 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -95,20 +95,21 @@ library hs-source-dirs: src exposed-modules: Xmobar, - Xmobar.Config, - Xmobar.Actions, - Xmobar.Run.Commands, - Xmobar.Run.Runnable + Xmobar.Config other-modules: Xmobar.Utils, Xmobar.Run.Types, Xmobar.Run.Template, + Xmobar.Run.Commands, + Xmobar.Run.Runnable Xmobar.App.EventLoop, + Xmobar.App.Main, Xmobar.System.StatFS, Xmobar.System.Environment, Xmobar.System.Localize, Xmobar.System.Signal, Xmobar.System.Kbd, + Xmobar.X11.Actions, Xmobar.X11.Parsers, Xmobar.X11.Types, Xmobar.X11.XUtil, -- cgit v1.2.3