diff options
author | zlbruce <zhangleibruce@gmail.com> | 2013-05-13 16:45:09 +0800 |
---|---|---|
committer | zlbruce <zhangleibruce@gmail.com> | 2013-05-13 16:45:09 +0800 |
commit | 2e228c10e7ca6551820c319ca1f1e575c1e72ee1 (patch) | |
tree | 7ba57a89ce117f3242d379f027fe3c8f1da5fca3 | |
parent | d16ba9573a9c1ed37e6b30ba331f63507c90439b (diff) | |
download | xmobar-2e228c10e7ca6551820c319ca1f1e575c1e72ee1.tar.gz xmobar-2e228c10e7ca6551820c319ca1f1e575c1e72ee1.tar.bz2 |
add a checkPipe loop for waiting the pipe file
-rw-r--r-- | src/Plugins/PipeReader.hs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/Plugins/PipeReader.hs b/src/Plugins/PipeReader.hs index 42ae500..7efea60 100644 --- a/src/Plugins/PipeReader.hs +++ b/src/Plugins/PipeReader.hs @@ -16,6 +16,10 @@ module Plugins.PipeReader where import System.IO import Plugins +import System.Posix.Files +import Control.Concurrent(threadDelay) +import Control.Exception +import Control.Monad(when) data PipeReader = PipeReader String String deriving (Read, Show) @@ -24,11 +28,21 @@ instance Exec PipeReader where alias (PipeReader _ a) = a start (PipeReader p _) cb = do let (def, pipe) = split ':' p + when (not $ null def) (cb def) + checkPipe pipe h <- openFile pipe ReadWriteMode - cb def forever (hGetLineSafe h >>= cb) where forever a = a >> forever a split c xs | c `elem` xs = let (pre, post) = span ((/=) c) xs in (pre, dropWhile ((==) c) post) | otherwise = ([], xs) + +checkPipe :: FilePath -> IO () +checkPipe file = do + handle (\(SomeException _) -> waitForPipe) $ do + status <- getFileStatus file + if isNamedPipe status + then return () + else waitForPipe + where waitForPipe = threadDelay 1000 >> checkPipe file |