This commit is contained in:
Araq 2020-04-12 00:22:46 +02:00
commit d7da2a5bd5

View file

@ -78,6 +78,24 @@ template keyeventBody() =
# Do not call redraw() here! That is already done # Do not call redraw() here! That is already done
# by ``karax.addEventHandler``. # by ``karax.addEventHandler``.
proc karaxEvents(d: Node): JSeq[(cstring, NativeEventHandler)] {.importcpp: "#.karaxEvents".}
proc `karaxEvents=`(d: Node; value: JSeq[(cstring, NativeEventHandler)]) {.importcpp: "#.karaxEvents = #".}
proc addEventShell(d: Node; name: cstring; h: NativeEventHandler) =
# The DOM is such a pathetic piece of junk that it doesn't
# offer 'removeAllEventHandlers()'. Hence we store the event
# handler twice in 'd' so that we can emulate this properly.
# This is required to fix bug #139.
d.addEventListener(name, h)
if d.karaxEvents == nil:
d.karaxEvents = newJSeq[(cstring, NativeEventHandler)]()
d.karaxEvents.add((name, h))
proc removeAllEventHandlers(d: Node) =
if d.karaxEvents != nil:
for i in 0..<d.karaxEvents.len:
d.removeEventListener(d.karaxEvents[i][0], d.karaxEvents[i][1])
proc wrapEvent(d: Node; n: VNode; k: EventKind; proc wrapEvent(d: Node; n: VNode; k: EventKind;
action: EventHandler): NativeEventHandler = action: EventHandler): NativeEventHandler =
proc stdWrapper(): NativeEventHandler = proc stdWrapper(): NativeEventHandler =
@ -106,13 +124,13 @@ proc wrapEvent(d: Node; n: VNode; k: EventKind;
case k case k
of EventKind.onkeyuplater: of EventKind.onkeyuplater:
result = laterWrapper() result = laterWrapper()
d.addEventListener("keyup", result) d.addEventShell("keyup", result)
of EventKind.onkeyupenter: of EventKind.onkeyupenter:
result = enterWrapper() result = enterWrapper()
d.addEventListener("keyup", result) d.addEventShell("keyup", result)
else: else:
result = stdWrapper() result = stdWrapper()
d.addEventListener(toEventName[k], result) d.addEventShell(toEventName[k], result)
# --------------------- DOM diff ----------------------------------------- # --------------------- DOM diff -----------------------------------------
@ -312,12 +330,14 @@ proc updateAttributes(newNode, oldNode: VNode) =
proc mergeEvents(newNode, oldNode: VNode; kxi: KaraxInstance) = proc mergeEvents(newNode, oldNode: VNode; kxi: KaraxInstance) =
let d = oldNode.dom let d = oldNode.dom
if d != nil: if d != nil:
for i in 0..<oldNode.events.len: removeAllEventHandlers(d)
let k = oldNode.events[i][0] when false:
let name = case k for i in 0..<oldNode.events.len:
of EventKind.onkeyuplater, EventKind.onkeyupenter: cstring"keyup" let k = oldNode.events[i][0]
else: toEventName[k] let name = case k
d.removeEventListener(name, oldNode.events[i][2]) of EventKind.onkeyuplater, EventKind.onkeyupenter: cstring"keyup"
else: toEventName[k]
d.removeEventListener(name, oldNode.events[i][2])
shallowCopy(oldNode.events, newNode.events) shallowCopy(oldNode.events, newNode.events)
applyEvents(oldNode) applyEvents(oldNode)