diff --git a/posix/Reanimate/FileWatch.hs b/posix/Reanimate/FileWatch.hs deleted file mode 100644 index e259f06..0000000 --- a/posix/Reanimate/FileWatch.hs +++ /dev/null @@ -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. diff --git a/reanimate.cabal b/reanimate.cabal index c10211b..65af163 100644 --- a/reanimate.cabal +++ b/reanimate.cabal @@ -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 diff --git a/src/Reanimate/Driver.hs b/src/Reanimate/Driver.hs index 8b010da..38cfe98 100644 --- a/src/Reanimate/Driver.hs +++ b/src/Reanimate/Driver.hs @@ -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 = diff --git a/unix/Reanimate/FileWatch.hs b/unix/Reanimate/FileWatch.hs deleted file mode 100644 index b9ba747..0000000 --- a/unix/Reanimate/FileWatch.hs +++ /dev/null @@ -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 ()