@@ -83,7 +83,7 @@ mainWidgetWithHead' widgets = runWebGUI $ \webView -> withWebViewSingletonMono w
8383 Just headFragment <- createDocumentFragment doc
8484 Just bodyElement <- getBody doc
8585 Just bodyFragment <- createDocumentFragment doc
86− _ <- attachWidget'' $ \events -> do
86+ (events, fc) <- attachWidget'' $ \events -> do
8787 let (headWidget, bodyWidget) = widgets
8888 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
8989 let go :: forall c. Widget () c -> DOM.DocumentFragment -> PerformEventT Spider (SpiderHost Global) c
@@ -96,9 +96,10 @@ mainWidgetWithHead' widgets = runWebGUI $ \webView -> withWebViewSingletonMono w
9696 runWithWebView (runImmediateDomBuilderT (runPostBuildT w postBuild) builderEnv) wv
9797 rec b <- go (headWidget a) headFragment
9898 a <- go (bodyWidget b) bodyFragment
99− return ((), postBuildTriggerRef)
99+ return (events, postBuildTriggerRef)
100100 liftIO $ replaceElementContents headElement headFragment
101101 liftIO $ replaceElementContents bodyElement bodyFragment
102+ processAsyncEvents events fc
102103
103104replaceElementContents :: DOM.IsElement e => e -> DOM.DocumentFragment -> IO ()
104105replaceElementContents e df = do
@@ -111,7 +112,7 @@ attachWidget' :: DOM.IsElement e => e -> WebViewSingleton x -> Widget x a -> IO
111112attachWidget' rootElement wv w = do
112113 Just doc <- getOwnerDocument rootElement
113114 Just df <- createDocumentFragment doc
114− result <- attachWidget'' $ \events -> do
115+ ((a, events), fc) <- attachWidget'' $ \events -> do
115116 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
116117 let builderEnv = ImmediateDomBuilderEnv
117118 { _immediateDomBuilderEnv_document = toDocument doc
@@ -119,9 +120,10 @@ attachWidget' rootElement wv w = do
119120 , _immediateDomBuilderEnv_events = events
120121 }
121122 a <- runWithWebView (runImmediateDomBuilderT (runPostBuildT w postBuild) builderEnv) wv
122− return (a, postBuildTriggerRef)
123+ return ((a, events), postBuildTriggerRef)
123124 replaceElementContents rootElement df
124− return result
125+ processAsyncEvents events fc
126+ return (a, fc)
125127
126128type EventChannel = Chan [DSum (TriggerRef Spider) TriggerInvocation]
127129
@@ -129,22 +131,25 @@ type EventChannel = Chan [DSum (TriggerRef Spider) TriggerInvocation]
129131attachWidget'' :: (EventChannel -> PerformEventT Spider (SpiderHost Global) (a, IORef (Maybe (EventTrigger Spider ())))) -> IO (a, FireCommand Spider (SpiderHost Global))
130132attachWidget'' w = do
131133 events <- newChan
132− (result, fc@(FireCommand fire)) <- runSpiderHost $ do
134+ (result, fc) <- runSpiderHost $ do
133135 ((result, postBuildTriggerRef), fc@(FireCommand fire)) <- hostPerformEventT $ w events
134136 mPostBuildTrigger <- readRef postBuildTriggerRef
135137 forM_ mPostBuildTrigger $ \postBuildTrigger -> fire [postBuildTrigger :=> Identity ()] $ return ()
136138 return (result, fc)
137− void $ forkIO $ forever $ do
138− ers <- readChan events
139− _ <- postGUISync $ runSpiderHost $ do
140− mes <- liftIO $ forM ers $ \(TriggerRef er :=> TriggerInvocation a _) -> do
141− me <- readIORef er
142− return $ fmap (\e -> e :=> Identity a) me
143− _ <- fire (catMaybes mes) $ return ()
144− liftIO $ forM_ ers $ \(_ :=> TriggerInvocation _ cb) -> cb
145− return ()
146139 return (result, fc)
147140
141+processAsyncEvents :: EventChannel -> FireCommand Spider (SpiderHost Global) -> IO ()
142+processAsyncEvents events (FireCommand fire) = void $ forkIO $ forever $ do
143+ ers <- readChan events
144+ _ <- postGUISync $ runSpiderHost $ do
145+ mes <- liftIO $ forM ers $ \(TriggerRef er :=> TriggerInvocation a _) -> do
146+ me <- readIORef er
147+ return $ fmap (\e -> e :=> Identity a) me
148+ _ <- fire (catMaybes mes) $ return ()
149+ liftIO $ forM_ ers $ \(_ :=> TriggerInvocation _ cb) -> cb
150+ return ()
151+
152+
148153-- | Run a reflex-dom application inside of an existing DOM element with the given ID
149154mainWidgetInElementById :: Text -> (forall x. Widget x ()) -> IO ()
150155mainWidgetInElementById eid w = runWebGUI $ \webView -> withWebViewSingleton webView $ \webViewSing -> do