40 lines
No EOL
1.4 KiB
JavaScript
40 lines
No EOL
1.4 KiB
JavaScript
/*
|
|
import Signal
|
|
import List
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
var keysDown = Elm.Signal.constant(Elm.Native.List.Nil);
|
|
var charPressed = Elm.Signal.constant(Elm.Maybe.Nothing);
|
|
|
|
Value.addListener(document, 'keydown', function(e) {
|
|
if (Elm.List.member(e.keyCode)(keysDown.value)) return;
|
|
var list = Elm.Native.List.Cons(e.keyCode, keysDown.value);
|
|
var hasListener = Dispatcher.notify(keysDown.id, list);
|
|
if (!hasListener)
|
|
this.removeEventListener('keydown',arguments.callee,false);
|
|
});
|
|
Value.addListener(document, 'keyup', function(e) {
|
|
function notEq(kc) { return kc !== e.keyCode; }
|
|
var codes = Elm.List.filter(notEq)(keysDown.value);
|
|
var hasListener = Dispatcher.notify(keysDown.id, codes);
|
|
if (!hasListener)
|
|
this.removeEventListener('keyup',arguments.callee,false);
|
|
});
|
|
Value.addListener(window, 'blur', function(e) {
|
|
var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
|
|
if (!hasListener)
|
|
this.removeEventListener('blur',arguments.callee,false);
|
|
});
|
|
Value.addListener(document, 'keypress', function(e) {
|
|
var next = Elm.Maybe.Just(e.charCode || e.keyCode);
|
|
var hasListener = Dispatcher.notify(charPressed.id, next);
|
|
Dispatcher.notify(charPressed.id, Elm.Maybe.Nothing);
|
|
if (!hasListener)
|
|
this.removeEventListener('keypress',arguments.callee,false);
|
|
});
|
|
|
|
Elm.Native.Keyboard.Raw = {keysDown:keysDown, charPressed:charPressed};
|
|
}()); |