summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorzlbruce <zhangleibruce@gmail.com>2013-05-13 16:45:09 +0800
committerzlbruce <zhangleibruce@gmail.com>2013-05-13 16:45:09 +0800
commit2e228c10e7ca6551820c319ca1f1e575c1e72ee1 (patch)
tree7ba57a89ce117f3242d379f027fe3c8f1da5fca3 /src
parentd16ba9573a9c1ed37e6b30ba331f63507c90439b (diff)
downloadxmobar-2e228c10e7ca6551820c319ca1f1e575c1e72ee1.tar.gz
xmobar-2e228c10e7ca6551820c319ca1f1e575c1e72ee1.tar.bz2
add a checkPipe loop for waiting the pipe file
Diffstat (limited to 'src')
-rw-r--r--src/Plugins/PipeReader.hs16
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