2Elm.Keyboard = { Raw : function() {
3 var keysDown = Elm.Signal.constant(["Nil"]);
4 var charPressed = Elm.Signal.constant(["Nothing"]);
6 function remove(x,xs) {
7 if (xs[0] === "Nil") return xs;
8 if (xs[1] === x) return xs[2];
9 return ["Cons", xs[1], remove(x,xs[2])];
12 while (xs[0] !== "Nil") {
13 if (xs[1] === x) return true;
18 Value.addListener(document, 'keydown', function(e) {
19 if (has(e.keyCode, keysDown.value)) return;
20 var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
22 this.removeEventListener('keydown',arguments.callee,false);
24 Value.addListener(document, 'keyup', function(e) {
25 var codes = remove(e.keyCode, keysDown.value);
26 var hasListener = Dispatcher.notify(keysDown.id, codes);
28 this.removeEventListener('keyup',arguments.callee,false);
30 Value.addListener(window, 'blur', function(e) {
31 var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
33 this.removeEventListener('blur',arguments.callee,false);
35 Value.addListener(document, 'keypress', function(e) {
36 var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
37 Dispatcher.notify(charPressed.id, ["Nothing"]);
39 this.removeEventListener('keypress',arguments.callee,false);
41 return {keysDown:keysDown,
42 charPressed:charPressed};
47These are nicely curated inputs from the keyboard. See the
48[Keyboard.Raw library](/docs/Signal/KeyboardRaw.elm) for a
49lower-level interface that will let you define more complicated behavior.
52function nativeKeyboard(elm) {
55 function keySignal(f) {
56 var signal = Elm.Signal.lift(f)(Elm.Keyboard.Raw.keysDown);
57 Elm.Keyboard.Raw.keysDown.defaultNumberOfKids += 1;
58 signal.defaultNumberOfKids = 0;
62 function dir(up) { return function(down) {
63 return function(left) { return function(right) {
66 while (ks.ctor == "Cons") {
68 case left : --x; break;
69 case right: ++x; break;
71 case down : --y; break;
75 return { _:{}, x:x, y:y };
83 while (ks.ctor == "Cons") {
84 if (key == ks._0) return true;
92 elm.Native.Keyboard = { isDown:is, dir:dir };
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list