@@ -5,12 +5,43 @@ Elm.Native.Keyboard = function(elm) {
5 if (elm.Native.Keyboard) return elm.Native.Keyboard;
5 if (elm.Native.Keyboard) return elm.Native.Keyboard;
7 var Signal = Elm.Signal(elm);
7 var Signal = Elm.Signal(elm);
8− var KR = Elm.Keyboard.Raw(elm);
8+ var NList = Elm.Native.List(elm);
9− var List = Elm.List(elm);
9+ var Maybe = Elm.Maybe(elm);
11+ var keysDown = Signal.constant(NList.Nil);
12+ var charPressed = Signal.constant(Maybe.Nothing);
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);
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);
27+ var hasListener = elm.notify(keysDown.id, NList.Nil);
28+ if (!hasListener) elm.node.removeEventListener('blur', blur);
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);
37+ elm.node.addEventListener('keydown' , down );
38+ elm.node.addEventListener('keyup' , up );
39+ elm.node.addEventListener('blur' , blur );
40+ elm.node.addEventListener('keypress', press);
11 function keySignal(f) {
42 function keySignal(f) {
12 var signal = A2( Signal.lift, f, elm.Keyboard.Raw.keysDown );
43 var signal = A2( Signal.lift, f, elm.Keyboard.Raw.keysDown );
13− KR.keysDown.defaultNumberOfKids += 1;
44+ keysDown.defaultNumberOfKids += 1;
14 signal.defaultNumberOfKids = 0;
45 signal.defaultNumberOfKids = 0;
15 return signal;
46 return signal;
@@ -32,8 +63,13 @@ Elm.Native.Keyboard = function(elm) {
32 return keySignal(f);
63 return keySignal(f);
35− function is(key) { return keySignal(List.member(key)); }
66+ function is(key) { return keySignal(NList.member(key)); }
37− return elm.Native.Keyboard = { isDown:is, directions:F4(dir) };
68+ return elm.Native.Keyboard = {
72+ charPressed:charPressed