@@ -21,12 +21,12 @@ import Control.Monad.Reader hiding (mapM, mapM_, forM, forM_, sequence, sequence
2121import Control.Monad.State hiding (state, mapM, mapM_, forM, forM_, sequence, sequence_)
2222import GHCJS.DOM.Node
2323import GHCJS.DOM.UIEvent
24−import GHCJS.DOM.EventM (event, EventM, stopPropagation)
24+import GHCJS.DOM.EventM (on, event, EventM, stopPropagation)
2525import GHCJS.DOM.Document
26−import GHCJS.DOM.Element
27−import GHCJS.DOM.HTMLElement
28−import GHCJS.DOM.Types hiding (Widget (..), unWidget, Event)
29−import GHCJS.DOM.NamedNodeMap
26+import GHCJS.DOM.Element as E
27+import GHCJS.DOM.Types hiding (Event)
28+import qualified GHCJS.DOM.Types as DOM (Event)
29+import GHCJS.DOM.NamedNodeMap as NNM
3030import Control.Lens hiding (element, children)
3131import Data.These
3232import Data.Align
@@ -60,27 +60,27 @@ class Attributes m a where
6060 addAttributes :: IsElement e => a -> e -> m ()
6161
6262instance MonadIO m => Attributes m AttributeMap where
63− addAttributes curAttrs e = liftIO $ imapM_ (elementSetAttribute e) curAttrs
63+ addAttributes curAttrs e = imapM_ (setAttribute e) curAttrs
6464
6565instance MonadWidget t m => Attributes m (Dynamic t AttributeMap) where
6666 addAttributes attrs e = do
6767 schedulePostBuild $ do
6868 curAttrs <- sample $ current attrs
69− liftIO $ imapM_ (elementSetAttribute e) curAttrs
69+ imapM_ (setAttribute e) curAttrs
7070 addVoidAction $ flip fmap (updated attrs) $ \newAttrs -> liftIO $ do
71− oldAttrs <- maybe (return Set.empty) namedNodeMapGetNames =<< elementGetAttributes e
72− forM_ (Set.toList $ oldAttrs `Set.difference` Map.keysSet newAttrs) $ elementRemoveAttribute e
73− imapM_ (elementSetAttribute e) newAttrs --TODO: avoid re-setting unchanged attributes; possibly do the compare using Align in haskell
71+ oldAttrs <- maybe (return Set.empty) namedNodeMapGetNames =<< getAttributes e
72+ forM_ (Set.toList $ oldAttrs `Set.difference` Map.keysSet newAttrs) $ removeAttribute e
73+ imapM_ (setAttribute e) newAttrs --TODO: avoid re-setting unchanged attributes; possibly do the compare using Align in haskell
7474
7575buildEmptyElementNS :: (MonadWidget t m, Attributes m attrs) => Maybe String -> String -> attrs -> m Element
7676buildEmptyElementNS mns elementTag attrs = do
7777 doc <- askDocument
7878 p <- askParent
7979 Just e <- liftIO $ case mns of
80− Nothing -> documentCreateElement doc elementTag
81− Just ns -> documentCreateElementNS doc ns elementTag
80+ Nothing -> createElement doc (Just elementTag)
81+ Just ns -> createElementNS doc (Just ns) (Just elementTag)
8282 addAttributes attrs e
83− _ <- liftIO $ nodeAppendChild p $ Just e
83+ _ <- appendChild p $ Just e
8484 return $ castToElement e
8585
8686buildEmptyElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m Element
@@ -96,13 +96,13 @@ buildElementNS mns elementTag attrs child = do
9696buildElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m a -> m (Element, a)
9797buildElement = buildElementNS Nothing
9898
99−namedNodeMapGetNames :: IsNamedNodeMap self => self -> IO (Set String)
99+namedNodeMapGetNames :: NamedNodeMap -> IO (Set String)
100100namedNodeMapGetNames self = do
101− l <- namedNodeMapGetLength self
101+ l <- NNM.getLength self
102102 let locations = if l == 0 then [] else [0..l-1] -- Can't use 0..l-1 if l is 0 because l is unsigned and will wrap around
103− liftM Set.fromList $ forM locations $ \i -> do
104− Just n <- namedNodeMapItem self i
105− nodeGetNodeName n
103+ liftM (Set.fromList . catMaybes) $ forM locations $ \i -> do
104+ Just n <- NNM.item self i
105+ getNodeName n
106106
107107text :: MonadWidget t m => String -> m ()
108108text = void . text'
@@ -112,8 +112,8 @@ text' :: MonadWidget t m => String -> m Text
112112text' s = do
113113 doc <- askDocument
114114 p <- askParent
115− Just n <- liftIO $ documentCreateTextNode doc s
116− _ <- liftIO $ nodeAppendChild p $ Just n
115+ Just n <- createTextNode doc s
116+ _ <- appendChild p $ Just n
117117 return n
118118
119119dynText :: MonadWidget t m => Dynamic t String -> m ()
@@ -121,8 +121,8 @@ dynText s = do
121121 n <- text' ""
122122 schedulePostBuild $ do
123123 curS <- sample $ current s
124− liftIO $ nodeSetNodeValue n curS
125− addVoidAction $ fmap (liftIO . nodeSetNodeValue n) $ updated s
124+ setNodeValue n $ Just curS
125+ addVoidAction $ fmap (setNodeValue n . Just) $ updated s
126126
127127display :: (MonadWidget t m, Show a) => Dynamic t a -> m ()
128128display a = dynText =<< mapDyn show a
@@ -159,12 +159,12 @@ widgetHoldInternal child0 newChild = do
159159 doc <- askDocument
160160 runWidget <- getRunWidget
161161 let build c = do
162− Just df <- liftIO $ documentCreateDocumentFragment doc
162+ Just df <- createDocumentFragment doc
163163 (result, postBuild, voidActions) <- runWidget df c
164164 runFrameWithTriggerRef newChildBuiltTriggerRef (result, voidActions)
165165 postBuild
166− mp' <- liftIO $ nodeGetParentNode endPlaceholder
167− forM_ mp' $ \p' -> liftIO $ nodeInsertBefore p' (Just df) (Just endPlaceholder)
166+ mp' <- getParentNode endPlaceholder
167+ forM_ mp' $ \p' -> insertBefore p' (Just df) (Just endPlaceholder)
168168 return ()
169169 addVoidAction $ ffor newChild $ \c -> do
170170 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
@@ -209,7 +209,7 @@ listWithKeyShallowDiff initialVals valsChanged mkChild = do
209209 Nothing -> Just Nothing -- Even if we let a Nothing through when the element doesn't already exist, this doesn't cause a problem because it is ignored
210210 Just _ -> Nothing -- We don't want to let spurious re-creations of items through
211211 listHoldWithKey initialVals (attachWith (flip (Map.differenceWith relevantDiff)) (current sentVals) valsChanged) $ \k v ->
212− mkChild k v $ select childValChangedSelector $ Const2 k
212+ mkChild k v $ Reflex.select childValChangedSelector $ Const2 k
213213
214214-- | Display the given map of items using the builder function provided, and update it with the given event. 'Nothing' entries will delete the corresponding children, and 'Just' entries will create or replace them. Since child events do not take any signal arguments, they are always rebuilt. To update a child without rebuilding, either embed signals in the map's values, or refer to them directly in the builder function.
215215listHoldWithKey :: (Ord k, MonadWidget t m) => Map k v -> Event t (Map k (Maybe v)) -> (k -> v -> m a) -> m (Dynamic t (Map k a))
@@ -225,13 +225,13 @@ listHoldWithKey initialVals valsChanged mkChild = do
225225 result <- mkChild k v
226226 childEnd <- text' ""
227227 return (result, (childStart, childEnd))
228− Just dfOrig <- liftIO $ documentCreateDocumentFragment doc
228+ Just dfOrig <- createDocumentFragment doc
229229 initialState <- iforM initialVals $ \k v -> subWidgetWithVoidActions (toNode dfOrig) $ wrapChild k v --Note: we have to use subWidgetWithVoidActions rather than runWidget here, because running post-build actions during build can cause not-yet-constructed values to be read
230230 stateRef <- liftIO $ newIORef initialState
231231 children <- holdDyn initialState newChildren
232232 addVoidAction $ switch $ fmap (mergeWith (>>) . map snd . Map.elems) $ current children
233− mpOrig <- liftIO $ nodeGetParentNode endPlaceholder
234− forM_ mpOrig $ \pOrig -> liftIO $ nodeInsertBefore pOrig (Just dfOrig) (Just endPlaceholder)
233+ mpOrig <- getParentNode endPlaceholder
234+ forM_ mpOrig $ \pOrig -> insertBefore pOrig (Just dfOrig) (Just endPlaceholder)
235235 addVoidAction $ flip fmap valsChanged $ \newVals -> do
236236 curState <- liftIO $ readIORef stateRef
237237 --TODO: Should we remove the parent from the DOM first to avoid reflows?
@@ -241,24 +241,24 @@ listHoldWithKey initialVals valsChanged mkChild = do
241241 return Nothing
242242 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
243243 liftIO $ deleteBetweenExclusive start end
244− Just df <- liftIO $ documentCreateDocumentFragment doc
244+ Just df <- createDocumentFragment doc
245245 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
246246 let s = (childResult, childVoidAction)
247247 modify (>>childPostBuild)
248− mp <- liftIO $ nodeGetParentNode end
249− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just end)
248+ mp <- getParentNode end
249+ forM_ mp $ \p -> insertBefore p (Just df) (Just end)
250250 return $ Just s
251251 That Nothing -> return Nothing -- Deleting non-existent child
252252 That (Just v) -> do -- Creating new child
253− Just df <- liftIO $ documentCreateDocumentFragment doc
253+ Just df <- createDocumentFragment doc
254254 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
255255 let s = (childResult, childVoidAction)
256256 modify (>>childPostBuild)
257257 let placeholder = case Map.lookupGT k curState of
258258 Nothing -> endPlaceholder
259259 Just (_, ((_, (start, _)), _)) -> start
260− mp <- liftIO $ nodeGetParentNode placeholder
261− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just placeholder)
260+ mp <- getParentNode placeholder
261+ forM_ mp $ \p -> insertBefore p (Just df) (Just placeholder)
262262 return $ Just s
263263 This state -> do -- No change
264264 return $ Just state
@@ -304,40 +304,40 @@ selectViewListWithKey_ selection vals mkChild = liftM (fmap fst) $ selectViewLis
304304-- | s and e must both be children of the same node and s must precede e
305305deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
306306deleteBetweenExclusive s e = do
307− mCurrentParent <- nodeGetParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
307+ mCurrentParent <- getParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
308308 case mCurrentParent of
309309 Nothing -> return () --TODO: Is this the right behavior?
310310 Just currentParent -> do
311311 let go = do
312− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
312+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
313313 when (toNode s /= toNode x) $ do
314− _ <- nodeRemoveChild currentParent $ Just x
314+ _ <- removeChild currentParent $ Just x
315315 go
316316 go
317317
318318-- | s and e must both be children of the same node and s must precede e
319319deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
320320deleteBetweenInclusive s e = do
321− mCurrentParent <- nodeGetParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
321+ mCurrentParent <- getParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
322322 case mCurrentParent of
323323 Nothing -> return () --TODO: Is this the right behavior?
324324 Just currentParent -> do
325325 let go = do
326− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
327− _ <- nodeRemoveChild currentParent $ Just x
326+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
327+ _ <- removeChild currentParent $ Just x
328328 when (toNode s /= toNode x) go
329329 go
330− _ <- nodeRemoveChild currentParent $ Just e
330+ _ <- removeChild currentParent $ Just e
331331 return ()
332332
333333--------------------------------------------------------------------------------
334334-- Adapters
335335--------------------------------------------------------------------------------
336336
337−wrapDomEvent :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM event e () -> IO (IO ())) -> EventM event e a -> m (Event t a)
337+wrapDomEvent :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM e event () -> IO (IO ())) -> EventM e event a -> m (Event t a)
338338wrapDomEvent element elementOnevent getValue = wrapDomEventMaybe element elementOnevent $ liftM Just getValue
339339
340−wrapDomEventMaybe :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM event e () -> IO (IO ())) -> EventM event e (Maybe a) -> m (Event t a)
340+wrapDomEventMaybe :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM e event () -> IO (IO ())) -> EventM e event (Maybe a) -> m (Event t a)
341341wrapDomEventMaybe element elementOnevent getValue = do
342342 postGui <- askPostGui
343343 runWithActions <- askRunWithActions
@@ -378,11 +378,11 @@ data EventTag
378378 | MouseoutTag
379379 | MouseoverTag
380380 | MouseupTag
381−-- | MousewheelTag -- webkitgtk only provides elementOnmousewheel (not elementOnwheel), but firefox does not support the mousewheel event; we should provide wheel (the equivalent, standard event), but we will need to make sure webkitgtk supports it first
381+ | MousewheelTag
382382 | ScrollTag
383383 | SelectTag
384384 | SubmitTag
385−-- | WheelTag -- See MousewheelTag
385+ | WheelTag
386386 | BeforecutTag
387387 | CutTag
388388 | BeforecopyTag
@@ -426,11 +426,11 @@ data EventName :: EventTag -> * where
426426 Mouseout :: EventName 'MouseoutTag
427427 Mouseover :: EventName 'MouseoverTag
428428 Mouseup :: EventName 'MouseupTag
429− --Mousewheel :: EventName 'MousewheelTag
429+ Mousewheel :: EventName 'MousewheelTag
430430 Scroll :: EventName 'ScrollTag
431431 Select :: EventName 'SelectTag
432432 Submit :: EventName 'SubmitTag
433− --Wheel :: EventName 'WheelTag
433+ Wheel :: EventName 'WheelTag
434434 Beforecut :: EventName 'BeforecutTag
435435 Cut :: EventName 'CutTag
436436 Beforecopy :: EventName 'BeforecopyTag
@@ -447,8 +447,8 @@ data EventName :: EventTag -> * where
447447
448448type family EventType en where
449449 EventType 'AbortTag = UIEvent
450− EventType 'BlurTag = UIEvent
451− EventType 'ChangeTag = UIEvent
450+ EventType 'BlurTag = FocusEvent
451+ EventType 'ChangeTag = DOM.Event
452452 EventType 'ClickTag = MouseEvent
453453 EventType 'ContextmenuTag = MouseEvent
454454 EventType 'DblclickTag = MouseEvent
@@ -460,87 +460,87 @@ type family EventType en where
460460 EventType 'DragstartTag = MouseEvent
461461 EventType 'DropTag = MouseEvent
462462 EventType 'ErrorTag = UIEvent
463− EventType 'FocusTag = UIEvent
464− EventType 'InputTag = UIEvent
465− EventType 'InvalidTag = UIEvent
466− EventType 'KeydownTag = UIEvent
467− EventType 'KeypressTag = UIEvent
468− EventType 'KeyupTag = UIEvent
463+ EventType 'FocusTag = FocusEvent
464+ EventType 'InputTag = DOM.Event
465+ EventType 'InvalidTag = DOM.Event
466+ EventType 'KeydownTag = KeyboardEvent
467+ EventType 'KeypressTag = KeyboardEvent
468+ EventType 'KeyupTag = KeyboardEvent
469469 EventType 'LoadTag = UIEvent
470470 EventType 'MousedownTag = MouseEvent
471− EventType 'MouseenterTag = UIEvent
472− EventType 'MouseleaveTag = UIEvent
471+ EventType 'MouseenterTag = MouseEvent
472+ EventType 'MouseleaveTag = MouseEvent
473473 EventType 'MousemoveTag = MouseEvent
474474 EventType 'MouseoutTag = MouseEvent
475475 EventType 'MouseoverTag = MouseEvent
476476 EventType 'MouseupTag = MouseEvent
477− --EventType 'MousewheelTag = MouseEvent
477+ EventType 'MousewheelTag = MouseEvent
478478 EventType 'ScrollTag = UIEvent
479479 EventType 'SelectTag = UIEvent
480− EventType 'SubmitTag = UIEvent
481− --EventType 'WheelTag = UIEvent
482− EventType 'BeforecutTag = UIEvent
483− EventType 'CutTag = UIEvent
484− EventType 'BeforecopyTag = UIEvent
485− EventType 'CopyTag = UIEvent
486− EventType 'BeforepasteTag = UIEvent
487− EventType 'PasteTag = UIEvent
488− EventType 'ResetTag = UIEvent
489− EventType 'SearchTag = UIEvent
490− EventType 'SelectstartTag = UIEvent
491− EventType 'TouchstartTag = UIEvent
492− EventType 'TouchmoveTag = UIEvent
493− EventType 'TouchendTag = UIEvent
494− EventType 'TouchcancelTag = UIEvent
495−
496−onEventName :: IsElement e => EventName en -> e -> EventM (EventType en) e () -> IO (IO ())
497−onEventName en = case en of
498− Abort -> elementOnabort
499− Blur -> elementOnblur
500− Change -> elementOnchange
501− Click -> elementOnclick
502− Contextmenu -> elementOncontextmenu
503− Dblclick -> elementOndblclick
504− Drag -> elementOndrag
505− Dragend -> elementOndragend
506− Dragenter -> elementOndragenter
507− Dragleave -> elementOndragleave
508− Dragover -> elementOndragover
509− Dragstart -> elementOndragstart
510− Drop -> elementOndrop
511− Error -> elementOnerror
512− Focus -> elementOnfocus
513− Input -> elementOninput
514− Invalid -> elementOninvalid
515− Keydown -> elementOnkeydown
516− Keypress -> elementOnkeypress
517− Keyup -> elementOnkeyup
518− Load -> elementOnload
519− Mousedown -> elementOnmousedown
520− Mouseenter -> elementOnmouseenter
521− Mouseleave -> elementOnmouseleave
522− Mousemove -> elementOnmousemove
523− Mouseout -> elementOnmouseout
524− Mouseover -> elementOnmouseover
525− Mouseup -> elementOnmouseup
526− --Mousewheel -> elementOnmousewheel
527− Scroll -> elementOnscroll
528− Select -> elementOnselect
529− Submit -> elementOnsubmit
530− --Wheel -> elementOnwheel
531− Beforecut -> elementOnbeforecut
532− Cut -> elementOncut
533− Beforecopy -> elementOnbeforecopy
534− Copy -> elementOncopy
535− Beforepaste -> elementOnbeforepaste
536− Paste -> elementOnpaste
537− Reset -> elementOnreset
538− Search -> elementOnsearch
539− Selectstart -> elementOnselectstart
540− Touchstart -> elementOntouchstart
541− Touchmove -> elementOntouchmove
542− Touchend -> elementOntouchend
543− Touchcancel -> elementOntouchcancel
480+ EventType 'SubmitTag = DOM.Event
481+ EventType 'WheelTag = WheelEvent
482+ EventType 'BeforecutTag = DOM.Event
483+ EventType 'CutTag = DOM.Event
484+ EventType 'BeforecopyTag = DOM.Event
485+ EventType 'CopyTag = DOM.Event
486+ EventType 'BeforepasteTag = DOM.Event
487+ EventType 'PasteTag = DOM.Event
488+ EventType 'ResetTag = DOM.Event
489+ EventType 'SearchTag = DOM.Event
490+ EventType 'SelectstartTag = DOM.Event
491+ EventType 'TouchstartTag = TouchEvent
492+ EventType 'TouchmoveTag = TouchEvent
493+ EventType 'TouchendTag = TouchEvent
494+ EventType 'TouchcancelTag = TouchEvent
495+
496+onEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
497+onEventName en e = case en of
498+ Abort -> on e E.abort
499+ Blur -> on e E.blurEvent
500+ Change -> on e E.change
501+ Click -> on e E.click
502+ Contextmenu -> on e E.contextMenu
503+ Dblclick -> on e E.dblClick
504+ Drag -> on e E.drag
505+ Dragend -> on e E.dragEnd
506+ Dragenter -> on e E.dragEnter
507+ Dragleave -> on e E.dragLeave
508+ Dragover -> on e E.dragOver
509+ Dragstart -> on e E.dragStart
510+ Drop -> on e E.drop
511+ Error -> on e E.error
512+ Focus -> on e E.focusEvent
513+ Input -> on e E.input
514+ Invalid -> on e E.invalid
515+ Keydown -> on e E.keyDown
516+ Keypress -> on e E.keyPress
517+ Keyup -> on e E.keyUp
518+ Load -> on e E.load
519+ Mousedown -> on e E.mouseDown
520+ Mouseenter -> on e E.mouseEnter
521+ Mouseleave -> on e E.mouseLeave
522+ Mousemove -> on e E.mouseMove
523+ Mouseout -> on e E.mouseOut
524+ Mouseover -> on e E.mouseOver
525+ Mouseup -> on e E.mouseUp
526+ Mousewheel -> on e E.mouseWheel
527+ Scroll -> on e E.scroll
528+ Select -> on e E.select
529+ Submit -> on e E.submit
530+ Wheel -> on e E.wheel
531+ Beforecut -> on e E.beforeCut
532+ Cut -> on e E.cut
533+ Beforecopy -> on e E.beforeCopy
534+ Copy -> on e E.copy
535+ Beforepaste -> on e E.beforePaste
536+ Paste -> on e E.paste
537+ Reset -> on e E.reset
538+ Search -> on e E.search
539+ Selectstart -> on e E.selectStart
540+ Touchstart -> on e E.touchStart
541+ Touchmove -> on e E.touchMove
542+ Touchend -> on e E.touchEnd
543+ Touchcancel -> on e E.touchCancel
544544
545545newtype EventResult en = EventResult { unEventResult :: EventResultType en }
546546
@@ -590,41 +590,40 @@ type family EventResultType (en :: EventTag) :: * where
590590 EventResultType 'TouchendTag = ()
591591 EventResultType 'TouchcancelTag = ()
592592
593−wrapDomEventsMaybe :: (Functor (Event t), IsElement e, MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (forall en. EventName en -> EventM (EventType en) e (Maybe (f en))) -> m (EventSelector t (WrapArg f EventName))
593+wrapDomEventsMaybe :: (Functor (Event t), IsElement e, MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (forall en. EventName en -> EventM e (EventType en) (Maybe (f en))) -> m (EventSelector t (WrapArg f EventName))
594594wrapDomEventsMaybe element handlers = do
595595 postGui <- askPostGui
596596 runWithActions <- askRunWithActions
597597 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
598− unsubscribe <- liftIO $ (onEventName en) element $ do
598+ unsubscribe <- onEventName en element $ do
599599 mv <- handlers en
600600 forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
601601 return $ liftIO $ do
602602 unsubscribe
603603 return $! e
604604
605−getKeyEvent :: EventM UIEvent e Int
605+getKeyEvent :: EventM e KeyboardEvent Int
606606getKeyEvent = do
607607 e <- event
608− liftIO $ do
609− which <- uiEventGetWhich e
610− if which /= 0 then return which else do
611− charCode <- uiEventGetCharCode e
612− if charCode /= 0 then return charCode else
613− uiEventGetKeyCode e
614−
615−getMouseEventCoords :: EventM MouseEvent e (Int, Int)
608+ which <- getWhich e
609+ if which /= 0 then return which else do
610+ charCode <- getCharCode e
611+ if charCode /= 0 then return charCode else
612+ getKeyCode e
613+
614+getMouseEventCoords :: EventM e MouseEvent (Int, Int)
616615getMouseEventCoords = do
617616 e <- event
618− liftIO $ bisequence (mouseEventGetClientX e, mouseEventGetClientY e)
617+ bisequence (getX e, getY e)
619618
620−defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM (EventType en) e (Maybe (EventResult en))
619+defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
621620defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
622621 Click -> return ()
623622 Dblclick -> return ()
624623 Keypress -> getKeyEvent
624+ Scroll -> getScrollTop e
625625 Keydown -> getKeyEvent
626626 Keyup -> getKeyEvent
627− Scroll -> liftIO $ elementGetScrollTop e
628627 Mousemove -> getMouseEventCoords
629628 Mouseup -> getMouseEventCoords
630629 Mousedown -> getMouseEventCoords
@@ -664,7 +663,7 @@ defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
664663 Touchend -> return ()
665664 Touchcancel -> return ()
666665
667−wrapElement :: forall t h m. (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => (forall en. Element -> EventName en -> EventM (EventType en) Element (Maybe (EventResult en))) -> Element -> m (El t)
666+wrapElement :: forall t h m. (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => (forall en. Element -> EventName en -> EventM Element (EventType en) (Maybe (EventResult en))) -> Element -> m (El t)
668667wrapElement eh e = do
669668 es <- wrapDomEventsMaybe e $ eh e
670669 return $ El e es
@@ -749,17 +748,15 @@ simpleList xs mkChild = mapDyn (map snd . Map.toList) =<< flip list mkChild =<<
749748elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
750749elDynHtml' elementTag html = do
751750 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
752− let h = castToHTMLElement e
753− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
754− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
751+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
752+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
755753 wrapElement defaultDomEventHandler e
756754
757755elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
758756elDynHtmlAttr' elementTag attrs html = do
759757 e <- buildEmptyElement elementTag attrs
760− let h = castToHTMLElement e
761− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
762− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
758+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
759+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
763760 wrapElement defaultDomEventHandler e
764761
765762data Link t
@@ -784,7 +781,7 @@ class HasDomEvent t a where
784781 domEvent :: EventName en -> a -> Event t (EventResultType en)
785782
786783instance Reflex t => HasDomEvent t (El t) where
787− domEvent en e = fmap unEventResult $ select (_el_events e) (WrapArg en)
784+ domEvent en e = fmap unEventResult $ Reflex.select (_el_events e) (WrapArg en)
788785
789786linkClass :: MonadWidget t m => String -> String -> m (Link t)
790787linkClass s c = do
@@ -859,7 +856,7 @@ tabDisplay ulClass activeClass tabItems = do
859856 _ <- listWithKey dTabs (\k dTab -> do
860857 dAttrs <- mapDyn (\sel -> do
861858 let t1 = listToMaybe $ Map.keys tabItems
862− if sel == Just k || (sel == Nothing && t1 == Just k) then Map.empty else Map.singleton "style" "display:none;") dCurrentTab
859+ if sel == Just k || (sel == Nothing && t1 == Just k) then Map.empty else Map.singleton "style" "display:none;") dCurrentTab
863860 elDynAttr "div" dAttrs $ dyn =<< mapDyn snd dTab)
864861 return ()
865862 where
@@ -874,7 +871,7 @@ tabDisplay ulClass activeClass tabItems = do
874871unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
875872unsafePlaceElement e = do
876873 p <- askParent
877− _ <- liftIO $ nodeAppendChild p $ Just e
874+ _ <- appendChild p $ Just e
878875 wrapElement defaultDomEventHandler e
879876
880877deriveGEq ''EventName