on master help sign in
fixed wierd keyboard stuff by factoring out keypress events
b9abf86John P Mayer Jr
libraries/Native/Signal/Keyboard.js+71−22
@@ -4,29 +4,76 @@ Elm.Native.Keyboard = function(elm) {
4 elm.Native = elm.Native || {};
4 elm.Native = elm.Native || {};
5 if (elm.Native.Keyboard) return elm.Native.Keyboard;
5 if (elm.Native.Keyboard) return elm.Native.Keyboard;
6
6
7+ // Duplicated from Native.Signal
8+ function send(node, timestep, changed) {
9+ var kids = node.kids;
10+ for (var i = kids.length; i--; ) {
11+ kids[i].recv(timestep, changed, node.id);
12+ }
13+ }
14+
7 var Signal = Elm.Signal(elm);
15 var Signal = Elm.Signal(elm);
8 var NList = Elm.Native.List(elm);
16 var NList = Elm.Native.List(elm);
17+ var Utils = Elm.Native.Utils(elm);
18+
19+ var downEvents = Signal.constant(0);
20+ var upEvents = Signal.constant(0);
21+ var blurEvents = Signal.constant(0);
22+
23+ elm.addListener([downEvents.id], document, 'keydown', function down(e) {
24+ elm.notify(downEvents.id, e.keyCode);
25+ });
26+
27+ elm.addListener([upEvents.id], document, 'keyup', function up(e) {
28+ elm.notify(upEvents.id, e.keyCode);
29+ });
30+
31+ elm.addListener([blurEvents.id], document, 'blur', function blur(e) {
32+ elm.notify(blurEvents.id, NList.Nil);
33+ });
34+
35+ function KeyMerge(down, up, blur) {
36+ var args = [down,up,blur];
37+ this.id = Utils.guid();
38+ // Ignore starting values here
39+ this.value = NList.Nil
40+ this.kids = [];
41+
42+ var n = args.length;
43+ var count = 0;
44+ var isChanged = false;
9
45
10− var keysDown = Signal.constant(NList.Nil);
46+ this.recv = function(timestep, changed, parentID) {
11− var lastKey = Signal.constant('\0');
47+ ++count;
12−
48+ if (changed) {
13− elm.addListener([keysDown.id], document, 'keydown', function down(e) {
49+ isChanged = true;
50+ // We know that a change must only be one of the following cases
14− if (NList.member(e.keyCode)(keysDown.value)) return;
51+ if (parentID = down.id && !(NList.member(down.value)(this.value))) {
15− elm.notify(keysDown.id, NList.Cons(e.keyCode, keysDown.value));
52+ this.value = NList.Cons(down.value, this.value);
16− });
53+ } else if (parentID = up.id) {
17− elm.addListener([keysDown.id], document, 'keyup', function up(e) {
18− function notEq(kc) { return kc !== e.keyCode; }
54+ var notEq = function(kc) { return kc !== up.value };
19− elm.notify(keysDown.id, NList.filter(notEq)(keysDown.value));
55+ this.value = NList.filter(notEq)(this.value);
20− });
56+ } else if (parentID = blur.id) {
21− elm.addListener([keysDown.id], document, 'blur', function blur(e) {
57+ this.value = NList.Nil;
22− elm.notify(keysDown.id, NList.Nil);
58+ }
23− });
59+ }
24− elm.addListener([lastKey.id], document, 'keypress', function press(e) {
60+ if (count == n) {
25− elm.notify(lastKey.id, e.charCode || e.keyCode);
61+ console.log(this.value);
62+ send(this, timestep, isChanged);
63+ isChanged = false;
64+ count = 0;
65+ }
66+ };
67+
68+ for (var i = n; i--; ) { args[i].kids.push(this); }
69+
26− });
70+ }
71+
72+ var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));
27
73
28 function keySignal(f) {
74 function keySignal(f) {
29− var signal = Signal.dropRepeats(A2(Signal.lift, f, keysDown));
75+ var signal = A2(Signal.lift, f, keysDown);
76+ // what's the significance of these two following lines? -jpm
30 keysDown.defaultNumberOfKids += 1;
77 keysDown.defaultNumberOfKids += 1;
31 signal.defaultNumberOfKids = 0;
78 signal.defaultNumberOfKids = 0;
32 return signal;
79 return signal;
@@ -51,11 +98,13 @@ Elm.Native.Keyboard = function(elm) {
51
98
52 function is(key) { return keySignal(NList.member(key)); }
99 function is(key) { return keySignal(NList.member(key)); }
53
100
101+ var lastPressed = Signal.dropRepeats(downEvents);
102+
54 return elm.Native.Keyboard = {
103 return elm.Native.Keyboard = {
55− isDown:is,
104+ isDown:is,
56− directions:F4(dir),
105+ directions:F4(dir),
57− keysDown:keysDown,
106+ keysDown:keysDown,
58− lastPressed:lastKey
107+ lastPressed:lastPressed
59 };
108 };
60
109
61};
110};