Skip to content

Instantly share code, notes, and snippets.

@guybrush
Created January 8, 2013 00:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guybrush/4480063 to your computer and use it in GitHub Desktop.
Save guybrush/4480063 to your computer and use it in GitHub Desktop.
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