summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Main.hs7
-rw-r--r--src/Window.hs1
-rw-r--r--src/Xmobar.hs14
3 files changed, 13 insertions, 9 deletions
diff --git a/src/Main.hs b/src/Main.hs
index 4c3f351..c7045b5 100644
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -36,6 +36,8 @@ import System.Environment
import System.Posix.Files
import Control.Monad (unless)
+import Signal (setupSignalHandler, SignalType(..))
+
-- $main
-- | The main entry point
@@ -55,9 +57,10 @@ main = do
conf <- doOpts c o
fs <- initFont d (font conf)
cls <- mapM (parseTemplate conf) (splitTemplate conf)
- vars <- mapM (mapM startCommand) cls
+ sig <- setupSignalHandler
+ vars <- mapM (mapM $ startCommand sig) cls
(r,w) <- createWin d fs conf
- startLoop (XConf d r w fs conf) vars
+ startLoop (XConf d r w fs conf) sig vars
-- | Splits the template in its parts
splitTemplate :: Config -> [String]
diff --git a/src/Window.hs b/src/Window.hs
index 34ecbf4..4917f57 100644
--- a/src/Window.hs
+++ b/src/Window.hs
@@ -25,7 +25,6 @@ createWin d fs c = do
(r,o) = setPosition (position c) srs (fi ht)
win <- newWindow d (defaultScreenOfDisplay d) rootw r o
setProperties r c d win srs
- when (lowerOnStart c) (lowerWindow d win)
mapWindow d win
return (r,win)
diff --git a/src/Xmobar.hs b/src/Xmobar.hs
index 6c2965c..1b58352 100644
--- a/src/Xmobar.hs
+++ b/src/Xmobar.hs
@@ -71,10 +71,10 @@ runX :: XConf -> X () -> IO ()
runX xc f = runReaderT f xc
-- | Starts the main event loop and threads
-startLoop :: XConf -> [[(Maybe ThreadId, TVar String)]] -> IO ()
-startLoop xcfg@(XConf _ _ w _ _) vs = do
+startLoop :: XConf -> MVar SignalType -> [[(Maybe ThreadId, TVar String)]] -> IO ()
+startLoop xcfg@(XConf _ _ w _ conf) sig vs = do
tv <- atomically $ newTVar []
- sig <- setupSignalHandler
+ when (lowerOnStart conf) $ putMVar sig Hide
_ <- forkIO (checker tv [] vs sig `catch`
\(SomeException _) -> void (putStrLn "Thread checker failed"))
#ifdef THREADED_RUNTIME
@@ -156,19 +156,21 @@ eventLoop tv xc@(XConf d _ w fs cfg) signal = do
o ->
return (ocfg {position = OnScreen 1 o})
-
-- $command
-- | Runs a command as an independent thread and returns its thread id
-- and the TVar the command will be writing to.
-startCommand :: (Runnable,String,String) -> IO (Maybe ThreadId, TVar String)
-startCommand (com,s,ss)
+startCommand :: MVar SignalType
+ -> (Runnable,String,String)
+ -> IO (Maybe ThreadId, TVar String)
+startCommand sig (com,s,ss)
| alias com == "" = do var <- atomically $ newTVar is
atomically $ writeTVar var (s ++ ss)
return (Nothing,var)
| otherwise = do var <- atomically $ newTVar is
let cb str = atomically $ writeTVar var (s ++ str ++ ss)
h <- forkIO $ start com cb
+ _ <- forkIO $ trigger com ( maybe (return ()) (putMVar sig) )
return (Just h,var)
where is = s ++ "Updating..." ++ ss