Use crossplatform filewatching library.

Former-commit-id: 7b9f72fb826176feb2709450f41c3b7045279cb1
This commit is contained in:
David 2019-03-12 15:40:44 +01:00
commit e984bab39a
4 changed files with 23 additions and 54 deletions

View file

@ -1,18 +0,0 @@
module Reanimate.FileWatch
( watchFile ) where
import Control.Concurrent
import System.Directory
watchFile :: FilePath -> IO () -> IO ()
watchFile path handler = do
t0 <- getModificationTime path
forkIO $ loop t0
return ()
where
loop lastModTime = do
t1 <- getModificationTime path
if t1 /= lastModTime
then handler >> loop t1
else threadDelay (10^3 * delay) >> loop lastModTime
delay = 1000 -- pool delay in ms.

View file

@ -32,9 +32,6 @@ Source-Repository head
Type: git
Location: git://github.com/lemmih/reanimate.git
Flag inotify
Description: Enable file watching using linux's inotify
library
hs-source-dirs: src
default-language: Haskell2010
@ -51,7 +48,6 @@ library
Reanimate.Misc
other-modules: Reanimate.Svg.NamedColors
Reanimate.Cache
Reanimate.FileWatch
Paths_reanimate
build-depends: base >=4.10 && <4.13,
time, text, unix, filepath, process, directory,
@ -59,13 +55,7 @@ library
JuicyPixels, attoparsec, parallel, diagrams, diagrams-svg,
diagrams-core, diagrams-lib, diagrams-contrib,
svg-builder, matrices, cubicbezier, palette, websockets,
hashable
if os(linux) && flag(inotify)
hs-source-dirs: unix
build-depends: hinotify
else
hs-source-dirs: posix
hashable, fsnotify
Flag server
Description: Enable rendering server

View file

@ -1,28 +1,31 @@
module Reanimate.Driver ( reanimate ) where
import Control.Concurrent (MVar, forkIO, killThread, modifyMVar_,
newEmptyMVar, putMVar)
import Control.Monad.Fix (fix)
import qualified Data.Text as T
import Control.Concurrent (MVar, forkIO, killThread, modifyMVar_,
newEmptyMVar, putMVar)
import Control.Exception (finally)
import Control.Monad.Fix (fix)
import qualified Data.Text as T
import Network.WebSockets
import Reanimate.FileWatch (watchFile)
import System.Directory (findFile, listDirectory, findExecutable)
import System.Environment (getArgs, getProgName)
import System.IO (BufferMode (..), hPutStrLn, hSetBuffering,
stderr, stdin)
import System.Directory (findExecutable, findFile, listDirectory)
import System.Environment (getArgs, getProgName)
import System.FilePath
import System.FSNotify
import System.IO (BufferMode (..), hPutStrLn, hSetBuffering,
stderr, stdin)
import Data.Maybe
import Paths_reanimate
import Reanimate.Misc (runCmd, runCmdLazy, runCmd_, withTempDir,
withTempFile)
import Reanimate.Monad (Animation)
import Reanimate.Render (renderSvgs)
import Reanimate.Misc (runCmd, runCmdLazy, runCmd_, withTempDir,
withTempFile)
import Reanimate.Monad (Animation)
import Reanimate.Render (renderSvgs)
opts = defaultConnectionOptions
{ connectionCompressionOptions = PermessageDeflateCompression defaultPermessageDeflate }
reanimate :: Animation -> IO ()
reanimate animation = do
watch <- startManager
args <- getArgs
hSetBuffering stdin NoBuffering
case args of
@ -67,13 +70,17 @@ reanimate animation = do
loop (frame : acc)
return tid
putStrLn "Found self. Listening."
watchFile self handler
stop <- watchFile watch self handler
putMVar slave =<< forkIO (return ())
let loop = do
fps <- receiveData conn :: IO T.Text
handler
loop
loop
loop `finally` stop
watchFile watch file action = watchDir watch (takeDirectory file) check (const action)
where
check event = takeFileName (eventPath event) == takeFileName file
ghcOptions :: FilePath -> [String]
ghcOptions tmpDir =

View file

@ -1,10 +0,0 @@
module Reanimate.FileWatch
( watchFile ) where
import System.INotify
watchFile :: FilePath -> IO () -> IO ()
watchFile path handler = do
notify <- initINotify
addWatch notify [Modify] path (const handler)
return ()