mirror of
https://github.com/reanimate/reanimate.git
synced 2026-09-11 16:12:20 +00:00
Use crossplatform filewatching library.
Former-commit-id: 7b9f72fb826176feb2709450f41c3b7045279cb1
This commit is contained in:
parent
fb9aed29fc
commit
e984bab39a
4 changed files with 23 additions and 54 deletions
|
|
@ -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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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 ()
|
||||
Loading…
Reference in a new issue