fixes #139
This commit is contained in:
parent
c00d7dc340
commit
d7da2a5bd5
1 changed files with 29 additions and 9 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue