summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xmobar.hs')
-rw-r--r--src/Xmobar.hs106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/Xmobar.hs b/src/Xmobar.hs
new file mode 100644
index 0000000..b4543f6
--- /dev/null
+++ b/src/Xmobar.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE CPP #-}
+
+-----------------------------------------------------------------------------
+-- |
+-- Module : Xmobar
+-- Copyright : (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018 Jose Antonio Ortega Ruiz
+-- (c) 2007 Andrea Rossato
+-- License : BSD-style (see LICENSE)
+--
+-- Maintainer : Jose A. Ortega Ruiz <jao@gnu.org>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- A status bar for the Xmonad Window Manager
+--
+-----------------------------------------------------------------------------
+
+module Xmobar (xmobar
+ , Runnable (..)
+ , module Xmobar.Config
+ , module Xmobar.Plugins.BufferedPipeReader
+ , module Xmobar.Plugins.CommandReader
+ , module Xmobar.Plugins.Date
+#ifdef DATEZONE
+ , module Xmobar.Plugins.DateZone
+#endif
+ , module Xmobar.Plugins.EWMH
+ , module Xmobar.Plugins.Kbd
+ , module Xmobar.Plugins.Locks
+#ifdef INOTIFY
+ , module Xmobar.Plugins.Mail
+ , module Xmobar.Plugins.MBox
+#endif
+ , module Xmobar.Plugins.Monitors
+ , module Xmobar.Plugins.PipeReader
+ , module Xmobar.Plugins.StdinReader
+ , 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.Run.EventLoop (startLoop, startCommand)
+import Xmobar.System.Signal (setupSignalHandler, withDeferSignals)
+import Xmobar.X11.Types
+import Xmobar.X11.XUtil
+import Xmobar.X11.Window
+import Xmobar.Plugins.BufferedPipeReader
+import Xmobar.Plugins.CommandReader
+import Xmobar.Plugins.Date
+#ifdef DATEZONE
+import Xmobar.Plugins.DateZone
+#endif
+import Xmobar.Plugins.EWMH
+import Xmobar.Plugins.Kbd
+import Xmobar.Plugins.Locks
+#ifdef INOTIFY
+import Xmobar.Plugins.Mail
+import Xmobar.Plugins.MBox
+#endif
+import Xmobar.Plugins.Monitors
+import Xmobar.Plugins.PipeReader
+import Xmobar.Plugins.StdinReader
+import Xmobar.Plugins.XMonadLog
+
+
+splitTemplate :: Config -> [String]
+splitTemplate conf =
+ case break (==l) t of
+ (le,_:re) -> case break (==r) re of
+ (ce,_:ri) -> [le, ce, ri]
+ _ -> def
+ _ -> def
+ where [l, r] = alignSep
+ (if length (alignSep conf) == 2 then conf else defaultConfig)
+ t = template conf
+ def = [t, "", ""]
+
+xmobar :: Config -> IO ()
+xmobar conf = withDeferSignals $ do
+ initThreads
+ d <- openDisplay ""
+ fs <- initFont d (font conf)
+ fl <- mapM (initFont d) (additionalFonts conf)
+ cls <- mapM (parseCommands conf) (splitTemplate 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