diff options
| -rw-r--r-- | src/Xmobar.hs | 40 | ||||
| -rw-r--r-- | src/Xmobar/App/Main.hs | 56 | ||||
| -rw-r--r-- | src/Xmobar/Run/Template.hs | 3 | ||||
| -rw-r--r-- | xmobar.cabal | 9 | 
4 files changed, 67 insertions, 41 deletions
| 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, | 
