Created
January 8, 2013 00:47
-
-
Save guybrush/4480063 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var EE2 = require('eventemitter2').EventEmitter2 | |
, _ = require('lodash') | |
exports = module.exports = input | |
exports.keyTable = keyTable | |
function input(opts) { | |
if (!(this instanceof input)) return new input(opts) | |
EE2.call(this,{wildcard:true,delimiter:'::',maxListeners: 20}) | |
var self = this | |
opts = opts || {} | |
self.el = opts.el || window | |
self.data = | |
{ mouse_x:0, mouse_y:0 | |
, mouse_down:false, mouse_down_x:0, mouse_down_y:0, mouse_wheel_delta:0 | |
, mouse_right:false, mouse_left:false, mouse_middle:false | |
, wheel_delta:0 } | |
self._stopPropagation = opts.stopPropagation | |
self._preventDefault = opts.preventDefault | |
self.keyTable = keyTable | |
self._activated = false | |
self.patterns = {} | |
self.patterns_defined = {} | |
// self.handlers = | |
// [ { handler: onContextmenu , listeners: [ 'contextmenu' ] , method: 'oncontextmenu' } | |
// , { handler: onMouseWheel , listeners: [ 'mousewheel' | |
// , 'DOMMouseScroll' ] , method: 'onmousewheel' } | |
// , { handler: onMouseDown , listeners: [ 'onMouseDown' ] , method: 'onmousedown' } | |
// , { handler: onMouseMove , listeners: [ 'onMouseMove' ] , method: 'onmousemove' } | |
// , { handler: onMouseUp , listeners: [ 'onMouseUp' ] , method: 'onmouseup' } | |
// , { handler: onKeyDown , listeners: [ 'onKeyDown' ] , method: 'onmousewheel' } | |
// , { handler: onKeyUp , listeners: [ 'onKeyUp' ] , method: false } | |
// ] | |
self.listeners = | |
{ 'contextmenu' : onContextmenu | |
, 'mousewheel' : onMouseWheel | |
, 'mousedown' : onMouseDown | |
, 'mousemove' : onMouseMove | |
, 'mouseup' : onMouseUp | |
, 'keydown' : onKeyDown | |
, 'keyup' : onKeyUp } | |
self.activate() | |
Object.keys(self.keyTable).forEach(function(x,i){ | |
self.data[self.keyTable[x]] = false | |
}) | |
this.last_input = _.extend({},self.data) | |
function handleBubbling(e) { | |
if (self._preventDefault) e.preventDefault() | |
if (self._stopPropagation) e.stopPropagation() | |
if (self._stopPropagation) return false | |
} | |
function onContextmenu(e) { | |
e.preventDefault() | |
return false | |
self.emit('event::contextmenu',e) | |
return handleBubbling(e) | |
} | |
function onMouseMove(e){ | |
self.set('mouse_x',e.clientX - (window.innerWidth/2)) | |
self.set('mouse_y',e.clientY - (window.innerHeight/2)) | |
self.emit('event::mouse::move',e) | |
return handleBubbling(e) | |
} | |
function onMouseWheel(e){ | |
self.set('mouse_wheel_delta',e.wheelDelta) | |
self.emit('event::mouse::wheel',e) | |
return handleBubbling(e) | |
} | |
function onMouseDown(e){ | |
if (e.button === 0) self.set('mouse_left',true) | |
if (e.button === 1) self.set('mouse_middle',true) | |
if (e.button === 2) self.set('mouse_right',true) | |
var x = e.clientX - (window.innerWidth/2) | |
var y = e.clientY - (window.innerHeight/2) | |
self.set('mouse_down_x',x) | |
self.set('mouse_down_y',y) | |
self.set('mouse_down',true) | |
self.emit('event::mouse::down',e) | |
return handleBubbling(e) | |
} | |
function onMouseUp(e){ | |
if (e.button == 0) self.set('mouse_left',false) | |
if (e.button == 1) self.set('mouse_middle',false) | |
if (e.button == 2) self.set('mouse_right',false) | |
self.set('mouse_down',false) | |
// set('mouse_down_x',false) | |
// set('mouse_down_y',false) | |
var x = e.clientX - self.data.mouse_down_x | |
var y = e.clientY - self.data.mouse_down_y | |
self.set('mouse_down_x',x) | |
self.set('mouse_down_y',y) | |
self.set('mouse_x',x) | |
self.set('mouse_y',y) | |
self.emit('event::mouse::up',e) | |
return handleBubbling(e) | |
} | |
function onKeyDown(e){ | |
self.emit('keydown',e) | |
self.set(self.keyTable[e.keyCode],true) | |
self.checkKeyChange() | |
self.emit('event::key::down',e) | |
return handleBubbling(e) | |
} | |
function onKeyUp(e){ | |
self.emit('keyup',e) | |
self.set(self.keyTable[e.keyCode],false) | |
self.checkKeyChange() | |
self.emit('event::key::up',e) | |
return handleBubbling(e) | |
} | |
} | |
input.prototype = EE2.prototype | |
input.prototype.set = function(k,v){ | |
if (!k) return | |
if (!~Object.keys(this.data).indexOf(k)) return | |
v = v || false | |
this.data[k] = v | |
this.emit('set::'+k,v) | |
} | |
input.prototype.activate = function(active){ | |
var self = this | |
Object.keys(self.listeners).forEach(function(x){ | |
window.addEventListener(x, self.listeners[x], false) | |
}) | |
self._activated = true | |
self.emit('activate') | |
} | |
input.prototype.deactive = function(){ | |
var self = this | |
Object.keys(self.listeners).forEach(function(x){ | |
window.RemoveEventListener(x, self.listeners[x], false) | |
}) | |
self._activated = false | |
self.emit('deactivate') | |
} | |
input.prototype.stopPropagation = function() { | |
this._stopPropagation = true | |
} | |
input.prototype.unstopPropagation = function() { | |
this._stopPropagation = false | |
} | |
input.prototype.preventDefault = function() { | |
this._preventDefault = true | |
} | |
input.prototype.unpreventDefault = function() { | |
this._preventDefault = false | |
} | |
input.prototype.definePattern = function(name,pattern){ | |
var obj = {} | |
for(var i = 0, len = pattern.length; i < len; i++){ | |
obj[pattern[i]] = false | |
} | |
this.patterns_defined[name]=pattern | |
this.patterns[name] = obj | |
} | |
input.prototype.watchPatterns = function(diff){ | |
var self = this | |
_.each(this.patterns_defined,function(p,n){ | |
var k = Object.keys(diff) | |
for(var i = 0, len = k.length; i < len; i++){ | |
if(p.indexOf(k[i]) != -1){ | |
self.patterns[n][k[i]]=diff[k[i]] | |
self.emit('pchange::'+n,_.extend({},self.patterns[n]),n) | |
} | |
} | |
}) | |
} | |
var keyTable = | |
{ 8 : 'backspace' | |
, 9 : 'tab' | |
, 13 : 'enter' | |
, 16 : 'shift' | |
, 17 : 'ctrl' | |
, 18 : 'alt' | |
, 19 : 'pausebreak' | |
, 20 : 'capslock' | |
, 27 : 'esc' | |
, 32 : 'spacebar' | |
, 33 : 'pageup' | |
, 34 : 'pagedown' | |
, 35 : 'end' | |
, 36 : 'home' | |
, 37 : 'left' | |
, 38 : 'up' | |
, 39 : 'right' | |
, 40 : 'down' | |
, 45 : 'ins' | |
, 46 : 'del' | |
, 48 : '0' | |
, 49 : '1' | |
, 50 : '2' | |
, 51 : '3' | |
, 52 : '4' | |
, 53 : '5' | |
, 54 : '6' | |
, 55 : '7' | |
, 56 : '8' | |
, 57 : '9' | |
, 65 : 'a' | |
, 66 : 'b' | |
, 67 : 'c' | |
, 68 : 'd' | |
, 69 : 'e' | |
, 70 : 'f' | |
, 71 : 'g' | |
, 72 : 'h' | |
, 73 : 'i' | |
, 74 : 'j' | |
, 75 : 'k' | |
, 76 : 'l' | |
, 77 : 'm' | |
, 78 : 'n' | |
, 79 : 'o' | |
, 80 : 'p' | |
, 81 : 'q' | |
, 82 : 'r' | |
, 83 : 's' | |
, 84 : 't' | |
, 85 : 'u' | |
, 86 : 'v' | |
, 87 : 'w' | |
, 88 : 'x' | |
, 89 : 'y' | |
, 90 : 'z' | |
, 93 : 'select' | |
, 96 : 'num_0' | |
, 97 : 'num_1' | |
, 98 : 'num_2' | |
, 99 : 'num_3' | |
, 100 : 'num_4' | |
, 101 : 'num_5' | |
, 102 : 'num_6' | |
, 103 : 'num_7' | |
, 104 : 'num_8' | |
, 105 : 'num_9' | |
, 106 : 'multiply' | |
, 107 : 'add' | |
, 109 : 'subtract' | |
, 110 : 'decimalpoint' | |
, 111 : 'divide' | |
, 112 : 'f1' | |
, 113 : 'f2' | |
, 114 : 'f3' | |
, 115 : 'f4' | |
, 116 : 'f5' | |
, 117 : 'f6' | |
, 118 : 'f7' | |
, 119 : 'f8' | |
, 120 : 'f9' | |
, 121 : 'f10' | |
, 122 : 'f11' | |
, 123 : 'f12' | |
, 144 : 'numlock' | |
, 145 : 'scrolllock' | |
, 186 : 'semicolon' | |
, 187 : 'equalsign' | |
, 188 : 'comma' | |
, 189 : 'dash' | |
, 190 : 'period' | |
, 191 : 'forwardslash' | |
, 192 : 'graveaccent' | |
, 219 : 'openbracket' | |
, 220 : 'backslash' | |
, 221 : 'closebraket' | |
, 222 : 'singlequote' | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment