2013-02-22 23:19:40 +00:00
|
|
|
|
2013-03-24 01:22:25 +00:00
|
|
|
Elm.Native.Keyboard = function(elm) {
|
2013-02-21 08:40:41 +00:00
|
|
|
'use strict';
|
2013-03-09 04:17:01 +00:00
|
|
|
elm.Native = elm.Native || {};
|
2013-03-24 01:22:25 +00:00
|
|
|
if (elm.Native.Keyboard) return elm.Native.Keyboard;
|
2013-03-09 04:17:01 +00:00
|
|
|
|
|
|
|
var Signal = Elm.Signal(elm);
|
2013-03-11 17:38:52 +00:00
|
|
|
var NList = Elm.Native.List(elm);
|
|
|
|
|
|
|
|
var keysDown = Signal.constant(NList.Nil);
|
2013-05-06 00:49:28 +00:00
|
|
|
var lastKey = Signal.constant('\0');
|
2013-03-11 17:38:52 +00:00
|
|
|
|
2013-06-03 06:46:02 +00:00
|
|
|
elm.addListener([keysDown.id], document, 'keydown', function down(e) {
|
|
|
|
if (NList.member(e.keyCode)(keysDown.value)) return;
|
|
|
|
elm.notify(keysDown.id, NList.Cons(e.keyCode, keysDown.value));
|
|
|
|
});
|
|
|
|
elm.addListener([keysDown.id], document, 'keyup', function up(e) {
|
|
|
|
function notEq(kc) { return kc !== e.keyCode; }
|
|
|
|
elm.notify(keysDown.id, NList.filter(notEq)(keysDown.value));
|
|
|
|
});
|
|
|
|
elm.addListener([keysDown.id], document, 'blur', function blur(e) {
|
|
|
|
elm.notify(keysDown.id, NList.Nil);
|
|
|
|
});
|
|
|
|
elm.addListener([lastKey.id], document, 'keypress', function press(e) {
|
|
|
|
elm.notify(lastKey.id, e.charCode || e.keyCode);
|
|
|
|
});
|
2013-02-21 08:40:41 +00:00
|
|
|
|
2013-02-20 22:36:16 +00:00
|
|
|
function keySignal(f) {
|
2013-06-16 21:20:15 +00:00
|
|
|
var signal = Signal.dropRepeats(A2(Signal.lift, f, keysDown));
|
2013-03-11 17:38:52 +00:00
|
|
|
keysDown.defaultNumberOfKids += 1;
|
2013-02-20 22:36:16 +00:00
|
|
|
signal.defaultNumberOfKids = 0;
|
|
|
|
return signal;
|
|
|
|
}
|
|
|
|
|
2013-03-02 17:18:36 +00:00
|
|
|
function dir(up, down, left, right) {
|
2013-02-20 22:36:16 +00:00
|
|
|
function f(ks) {
|
|
|
|
var x = 0, y = 0;
|
2013-06-21 04:25:10 +00:00
|
|
|
while (ks.ctor === "::") {
|
2013-05-11 20:42:45 +00:00
|
|
|
switch (ks._0) {
|
|
|
|
case left : --x; break;
|
|
|
|
case right: ++x; break;
|
|
|
|
case up : ++y; break;
|
|
|
|
case down : --y; break;
|
|
|
|
}
|
|
|
|
ks = ks._1;
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
2013-02-21 08:40:41 +00:00
|
|
|
return { _:{}, x:x, y:y };
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
|
|
|
return keySignal(f);
|
|
|
|
}
|
|
|
|
|
2013-03-11 17:38:52 +00:00
|
|
|
function is(key) { return keySignal(NList.member(key)); }
|
2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-24 01:22:25 +00:00
|
|
|
return elm.Native.Keyboard = {
|
2013-03-11 17:38:52 +00:00
|
|
|
isDown:is,
|
|
|
|
directions:F4(dir),
|
2013-03-24 01:22:25 +00:00
|
|
|
keysDown:keysDown,
|
2013-05-16 20:10:50 +00:00
|
|
|
lastPressed:lastKey
|
2013-03-11 17:38:52 +00:00
|
|
|
};
|
2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-09 04:17:01 +00:00
|
|
|
};
|