on master help sign in
Combine Keyboard and Keyboard.Raw modules.
db44b15evancz
libraries/Keyboard.elm+3
@@ -38,3 +38,6 @@ ctrl = N.isDown 17
38-- Whether the space key is pressed.
38-- Whether the space key is pressed.
39space : Signal Bool
39space : Signal Bool
40space = N.isDown 32
40space = N.isDown 32
41+
42+keysDown : Signal [KeyCode]
43+charPressed : Signal (Maybe Char)
libraries/Keyboard/Raw.elmdeleted−9
@@ -1,9 +0,0 @@
1−
2−module Keyboard.Raw where
3−
4−import Native.Keyboard.Raw
5−
6−type KeyCode = Int
7−
8−keysDown : Signal [KeyCode]
9−charPressed : Signal (Maybe Char)
libraries/Native/Signal/Keyboard.js+41−5
@@ -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;
6
6
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);
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);
10
41
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;
16 }
47 }
@@ -32,8 +63,13 @@ Elm.Native.Keyboard = function(elm) {
32 return keySignal(f);
63 return keySignal(f);
33 }
64 }
34
65
35− function is(key) { return keySignal(List.member(key)); }
66+ function is(key) { return keySignal(NList.member(key)); }
36
67
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+ };
38
74
39};
75};
libraries/Native/Signal/KeyboardRaw.jsdeleted−46
@@ -1,46 +0,0 @@
1−
2−Elm.Native.Keyboard.Raw = function(elm) {
3− 'use strict';
4−
5− var Signal = Elm.Signal(elm);
6− var NList = Elm.Native.List(elm);
7− var List = Elm.List(elm);
8− var Maybe = Elm.Maybe(elm);
9−
10− var keysDown = Signal.constant(NList.Nil);
11− var charPressed = Signal.constant(Maybe.Nothing);
12−
13− function down(e) {
14− if (List.member(e.keyCode)(keysDown.value)) return;
15− var list = NList.Cons(e.keyCode, keysDown.value);
16− var hasListener = elm.notify(keysDown.id, list);
17− if (!hasListener) elm.node.removeEventListener('keydown', down);
18− }
19− function up(e) {
20− function notEq(kc) { return kc !== e.keyCode; }
21− var codes = List.filter(notEq)(keysDown.value);
22− var hasListener = elm.notify(keysDown.id, codes);
23− if (!hasListener) elm.node.removeEventListener('keyup', up);
24− }
25− function blur(e) {
26− var hasListener = elm.notify(keysDown.id, NList.Nil);
27− if (!hasListener) elm.node.removeEventListener('blur', blur);
28− }
29− function press(e) {
30− var next = Maybe.Just(e.charCode || e.keyCode);
31− var hasListener = elm.notify(charPressed.id, next);
32− elm.notify(charPressed.id, Maybe.Nothing);
33− if (!hasListener) elm.node.removeEventListener('keypress', press);
34− }
35−
36− elm.node.addEventListener('keydown' , down );
37− elm.node.addEventListener('keyup' , up );
38− elm.node.addEventListener('blur' , blur );
39− elm.node.addEventListener('keypress', press);
40−
41− return elm.Native.Keyboard.Raw = {
42− keysDown:keysDown,
43− charPressed:charPressed
44− };
45−
46−};