@@ -5,12 +5,43 @@ Elm.Native.Keyboard = function(elm) {
55 if (elm.Native.Keyboard) return elm.Native.Keyboard;
66
77 var Signal = Elm.Signal(elm);
8− var KR = Elm.Keyboard.Raw(elm);
9− var List = Elm.List(elm);
8+ var NList = Elm.Native.List(elm);
9+ var Maybe = Elm.Maybe(elm);
10+
11+ var keysDown = Signal.constant(NList.Nil);
12+ var charPressed = Signal.constant(Maybe.Nothing);
13+
14+ function down(e) {
15+ if (NList.member(e.keyCode)(keysDown.value)) return;
16+ var list = NList.Cons(e.keyCode, keysDown.value);
17+ var hasListener = elm.notify(keysDown.id, list);
18+ if (!hasListener) elm.node.removeEventListener('keydown', down);
19+ }
20+ function up(e) {
21+ function notEq(kc) { return kc !== e.keyCode; }
22+ var codes = NList.filter(notEq)(keysDown.value);
23+ var hasListener = elm.notify(keysDown.id, codes);
24+ if (!hasListener) elm.node.removeEventListener('keyup', up);
25+ }
26+ function blur(e) {
27+ var hasListener = elm.notify(keysDown.id, NList.Nil);
28+ if (!hasListener) elm.node.removeEventListener('blur', blur);
29+ }
30+ function press(e) {
31+ var next = Maybe.Just(e.charCode || e.keyCode);
32+ var hasListener = elm.notify(charPressed.id, next);
33+ elm.notify(charPressed.id, Maybe.Nothing);
34+ if (!hasListener) elm.node.removeEventListener('keypress', press);
35+ }
36+
37+ elm.node.addEventListener('keydown' , down );
38+ elm.node.addEventListener('keyup' , up );
39+ elm.node.addEventListener('blur' , blur );
40+ elm.node.addEventListener('keypress', press);
1041
1142 function keySignal(f) {
1243 var signal = A2( Signal.lift, f, elm.Keyboard.Raw.keysDown );
13− KR.keysDown.defaultNumberOfKids += 1;
44+ keysDown.defaultNumberOfKids += 1;
1445 signal.defaultNumberOfKids = 0;
1546 return signal;
1647 }
@@ -32,8 +63,13 @@ Elm.Native.Keyboard = function(elm) {
3263 return keySignal(f);
3364 }
3465
35− function is(key) { return keySignal(List.member(key)); }
66+ function is(key) { return keySignal(NList.member(key)); }
3667
37− return elm.Native.Keyboard = { isDown:is, directions:F4(dir) };
68+ return elm.Native.Keyboard = {
69+ isDown:is,
70+ directions:F4(dir),
71+ keysDown:keysDown,
72+ charPressed:charPressed
73+ };
3874
3975};