@@ -208,20 +208,27 @@ runImmediateDomBuilderT
208 -> ImmediateDomBuilderEnv t
208 -> ImmediateDomBuilderEnv t
209 -> Chan [DSum (EventTriggerRef t) TriggerInvocation]
209 -> Chan [DSum (EventTriggerRef t) TriggerInvocation]
211−runImmediateDomBuilderT (ImmediateDomBuilderT a) env eventChan = flip runTriggerEventT eventChan $ do
211+runImmediateDomBuilderT (ImmediateDomBuilderT a) env eventChan = do
212+ handlersMVar <- liftIO $ newMVar []
213+ flip runTriggerEventT eventChan $ do
212− win <- DOM.currentWindowUnchecked
214+ win <- DOM.currentWindowUnchecked
213− rec (x, req) <- runRequesterT (runReaderT a env) rsp
215+ rec (x, req) <- runRequesterT (runReaderT a env) rsp
214− rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame win f $
216+ rsp <- performEventAsync $ ffor req $ \rm f -> liftJSM $ runInAnimationFrame handlersMVar win f $
215− DMap.traverseWithKey (\_ r -> Identity <$> r) rm
217+ DMap.traverseWithKey (\_ r -> Identity <$> r) rm
216− return x
218+ return x
218− runInAnimationFrame win f x = do
220+ runInAnimationFrame handlersMVar win f x = do
221+ handlers <- liftIO $ takeMVar handlersMVar
222+ when (null handlers) $ do
219− rec cb <- newRequestAnimationFrameCallbackSync $ \_ -> do
223+ rec cb <- newRequestAnimationFrameCallbackSync $ \_ -> do
220− v <- synchronously x
222− freeRequestAnimationFrameCallback cb
224+ freeRequestAnimationFrameCallback cb
225+ handlersToRun <- liftIO $ takeMVar handlersMVar
226+ liftIO $ putMVar handlersMVar []
227+ sequence_ (reverse handlersToRun)
223− _ <- Window.requestAnimationFrame win cb
228+ void $ Window.requestAnimationFrame win cb
224− return ()
229+ liftIO $ putMVar handlersMVar ((do
230+ v <- synchronously x
231+ void . liftIO $ f v) : handlers)
226class Monad m => HasDocument m where
233class Monad m => HasDocument m where
227 askDocument :: m Document
234 askDocument :: m Document
@@ -471,14 +478,14 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
471 inputElement cfg = do
478 inputElement cfg = do
472 ((e, _), domElement) <- makeElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
479 ((e, _), domElement) <- makeElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
473 let domInputElement = uncheckedCastTo DOM.HTMLInputElement domElement
480 let domInputElement = uncheckedCastTo DOM.HTMLInputElement domElement
474− Input.setValue domInputElement $ Just (cfg ^. inputElementConfig_initialValue)
481+ Input.setValue domInputElement $ cfg ^. inputElementConfig_initialValue
475− v0 <- Input.getValueUnchecked domInputElement
482+ v0 <- Input.getValue domInputElement
476− let getMyValue = fromMaybe "" <$> Input.getValue domInputElement
483+ let getMyValue = Input.getValue domInputElement
477 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
484 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
478 valueChangedBySetValue <- case _inputElementConfig_setValue cfg of
485 valueChangedBySetValue <- case _inputElementConfig_setValue cfg of
479 Nothing -> return never
486 Nothing -> return never
480 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
487 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
481− Input.setValue domInputElement $ Just v'
488+ Input.setValue domInputElement v'
482 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
489 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
483 v <- holdDyn v0 $ leftmost
490 v <- holdDyn v0 $ leftmost
484 [ valueChangedBySetValue
491 [ valueChangedBySetValue
@@ -523,14 +530,14 @@ instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t
523 textAreaElement cfg = do --TODO
530 textAreaElement cfg = do --TODO
524 ((e, _), domElement) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
531 ((e, _), domElement) <- makeElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
525 let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
532 let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
526− TextArea.setValue domTextAreaElement $ Just (cfg ^. textAreaElementConfig_initialValue)
533+ TextArea.setValue domTextAreaElement $ cfg ^. textAreaElementConfig_initialValue
527− v0 <- TextArea.getValueUnchecked domTextAreaElement
534+ v0 <- TextArea.getValue domTextAreaElement
528− let getMyValue = fromMaybe "" <$> TextArea.getValue domTextAreaElement
535+ let getMyValue = TextArea.getValue domTextAreaElement
529 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
536 valueChangedByUI <- requestDomAction $ liftJSM getMyValue <$ Reflex.select (_element_events e) (WrapArg Input)
530 valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
537 valueChangedBySetValue <- case _textAreaElementConfig_setValue cfg of
531 Nothing -> return never
538 Nothing -> return never
532 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
539 Just eSetValue -> requestDomAction $ ffor eSetValue $ \v' -> do
533− TextArea.setValue domTextAreaElement $ Just v'
540+ TextArea.setValue domTextAreaElement v'
534 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
541 getMyValue -- We get the value after setting it in case the browser has mucked with it somehow
535 v <- holdDyn v0 $ leftmost
542 v <- holdDyn v0 $ leftmost
536 [ valueChangedBySetValue
543 [ valueChangedBySetValue