Skip to content

Instantly share code, notes, and snippets.

@ta2edchimp
Created May 10, 2010 16:29
Show Gist options
  • Select an option

  • Save ta2edchimp/396238 to your computer and use it in GitHub Desktop.

Select an option

Save ta2edchimp/396238 to your computer and use it in GitHub Desktop.
/**
* Kee'nput - a basic shortcut delegation module
* (c) 2010 Andreas Windt aka. ta2edchimp, MIT Style License
* demo temporarily at: http://jsbin.com/axisa3/3
*
* Uses big portions of the basic Listener implementation
* (c) 2010 Andrea Giammarchi, MIT Style License
* see http://webreflection.blogspot.com/2010/05/event-driven-application-and-most-basic.html
* ------------------------------------------------------------------------------------------
* USAGE:
*
* Keenput.addShortcut( shortcut, callback );
* > lets function 'callback' listen to 'shortcut', see "Shortcut(s)" for details.
*
* Keenput.removeShortcut( shortcut [, callback ]);
* > removes function 'callback' from listening to 'shortcut'.
* if not specified, nothing will listen to 'shortcut' anymore.
*
* Keenput.fireShortcut( shortcut );
* > simulates a 'shortcut'.
*
* Shortcut(s)
* > an object of the following kind:
* shortcut = { shift: true|false,
* ctrl: true|false,
* alt: true|false,
* key: Keenput.KEY_* };
* 'shift', 'ctrl' and 'alt' are optional (default is false),
* 'key' must be specified (can be any key-code), e.g. Keenput.KEY_T, Keenput.KEY_PAGE_UP etc.
*
* Keycode(s)
* > the following key codes are predefined. i think they're self-explanatory:
* KEY_[A-Z], KEY_[0-9], KEY_BACKSPACE, KEY_TAB, KEY_ENTER, KEY_PAUSE, KEY_CAPSLOCK,
* KEY_ESCAPE, KEY_PAGE_[UP|DOWN], KEY_END, KEY_HOME, KEY_ARROW_[LEFT|UP|RIGHT|DOWN],
* KEY_INSERT, KEY_DELETE, KEY_NUMPAD_[0-9], KEY_PLUS, KEY_MINUS, KEY_PERIOD, KEY_SLASH,
* KEY_BACKSLASH, KEY_EQUALS, KEY_COMMA, KEY_F[1-12]
*
* Example
* var test = function() { alert("shift+t is mine ;)"); };
* Keenput({ shift:true, key:Keenput.KEY_T }, test);
* > lets function 'test' yell when the user hits shift + t
*
*/
/**** ONLY FOR DEBUGGING ****/
if (typeof(console) == "undefined")
var console = { debugString: "", log: function(s) { this.debugString += s + "\n"; } };
var Keenput = (function(){
/**** "private" properties ****/
var _SHIFT_DOWN = false,
_CTRL_DOWN = false,
_ALT_DOWN = false,
_listeners = {},
// if not present, use Array.indexOf implementation by Andrea Giammarchi
indexOf = Array.prototype.indexOf || function (callback) {
for (var i = this.length; i-- && this[i] !== callback;) {}
return i;
};
/**** "private" methods ****/
function _get( key ) {
return _listeners[key] || _set(key);
}
function _set( key, callback ) {
if (!_listeners[key])
(_listeners[key] = []).indexOf = indexOf;
if (!!callback && _listeners[key].indexOf(callback) == -1)
_listeners[key].push(callback);
return _listeners[key];
}
function _remove( key, callback ) {
var index;
if (!_listeners[key])
return;
if (!callback)
(_listeners[key] = []).indexOf = indexOf;
else if ((index = _listeners[key].indexOf(callback)) > -1)
_listeners[key].splice(index, 1);
}
function _callShortcutCallbacks( shortcut ) {
if (!shortcut || !shortcut.key || shortcut.key == 0)
return false;
shortcut.shift = shortcut.shift || false;
shortcut.ctrl = shortcut.ctrl || false;
shortcut.alt = shortcut.alt || false;
console.log("Kee'nput :: fireing shortcut: \""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key+"\"");
for(var callback = _get(""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key),
len = callback.length,
i = 0,
result = len > 0;
i < len; i++)
if (typeof(callback[i]) == "function")
callback[i]();
return result;
}
function _handleKeyUp( event ) {
var keycode = event.which || window.event.keyCode;
console.log("Kee'nput :: 'key up' registered: " + keycode);
switch(keycode) {
case 16:
_SHIFT_DOWN = false;
break;
case 17:
_CTRL_DOWN = false;
break;
case 18:
_ALT_DOWN = false;
break;
default:
break;
}
}
function _handleKeyDown( event ) {
var keycode = event.which || window.event.keyCode;
console.log("Kee'nput :: 'key down' registered: " + (_SHIFT_DOWN?"shift-":"") + (_CTRL_DOWN?"ctrl-":"") + (_ALT_DOWN?"alt-":"") + keycode);
switch(keycode) {
case 16:
_SHIFT_DOWN = true;
break;
case 17:
_CTRL_DOWN = true;
break;
case 18:
_ALT_DOWN = true;
break;
default:
if (_callShortcutCallbacks({ shift: _SHIFT_DOWN, ctrl: _CTRL_DOWN, alt: _ALT_DOWN, key: keycode }))
_SHIFT_DOWN = _CTRL_DOWN = _ALT_DOWN = false;
break;
}
}
/**** "constructor" ****/
console.log("Kee'nput :: initializing Kee'nput");
if (document.addEventListener) {
document.addEventListener("keydown", _handleKeyDown, false);
document.addEventListener("keyup", _handleKeyUp, false);
} else {
document.attachEvent("onkeydown", _handleKeyDown);
document.attachEvent("onkeyup", _handleKeyUp);
}
return {
/**** public constants ****/
KEY_BACKSPACE: 8,
KEY_TAB: 9,
KEY_ENTER: 13,
//KEY_SHIFT: 16,
//KEY_CTRL: 17,
//KEY_ALT: 18,
KEY_PAUSE: 19,
KEY_CAPSLOCK: 20,
KEY_ESCAPE: 27,
KEY_PAGE_UP: 33,
KEY_PAGE_DOWN: 34,
KEY_END: 35,
KEY_HOME: 36,
KEY_ARROW_LEFT: 37,
KEY_ARROW_UP: 38,
KEY_ARROW_RIGHT: 39,
KEY_ARROW_DOWN: 40,
KEY_INSERT: 45,
KEY_DELETE: 46,
KEY_0: 48,
KEY_1: 49,
KEY_2: 50,
KEY_3: 51,
KEY_4: 52,
KEY_5: 53,
KEY_6: 54,
KEY_7: 55,
KEY_8: 56,
KEY_9: 57,
KEY_A: 65,
KEY_B: 66,
KEY_C: 67,
KEY_D: 68,
KEY_E: 69,
KEY_F: 70,
KEY_G: 71,
KEY_H: 72,
KEY_I: 73,
KEY_J: 74,
KEY_K: 75,
KEY_L: 76,
KEY_M: 77,
KEY_N: 78,
KEY_O: 79,
KEY_P: 80,
KEY_Q: 81,
KEY_R: 82,
KEY_S: 83,
KEY_T: 84,
KEY_U: 85,
KEY_V: 86,
KEY_W: 87,
KEY_X: 88,
KEY_Y: 89,
KEY_Z: 90,
KEY_NUMPAD_0: 96,
KEY_NUMPAD_1: 97,
KEY_NUMPAD_2: 98,
KEY_NUMPAD_3: 99,
KEY_NUMPAD_4: 100,
KEY_NUMPAD_5: 101,
KEY_NUMPAD_6: 102,
KEY_NUMPAD_7: 103,
KEY_NUMPAD_8: 104,
KEY_NUMPAD_9: 105,
KEY_ASTERISK: 106,
KEY_PLUS: 107,
KEY_MINUS: 109,
KEY_PERIOD: 110,
KEY_SLASH: 111,
KEY_F1: 112,
KEY_F2: 113,
KEY_F3: 114,
KEY_F4: 115,
KEY_F5: 116,
KEY_F6: 117,
KEY_F7: 118,
KEY_F8: 119,
KEY_F9: 120,
KEY_F10: 121,
KEY_F11: 122,
KEY_F12: 123,
KEY_EQUALS: 187,
KEY_COMMA: 188,
//KEY_SLASH: 191,
KEY_BACKSLASH: 220,
/**** "public" methods ****/
addShortcut: function( shortcut, callback ) {
if (!shortcut || !shortcut.key || shortcut.key == 0 || !callback || typeof(callback) != "function")
return;
shortcut.shift = shortcut.shift || false;
shortcut.ctrl = shortcut.ctrl || false;
shortcut.alt = shortcut.alt || false;
console.log("adding: "+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key);
_set(""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key, callback);
},
removeShortcut: function( shortcut, callback ) {
if (!shortcut || !shortcut.key || shortcut.key == 0)
return;
shortcut.shift = shortcut.shift || false;
shortcut.ctrl = shortcut.ctrl || false;
shortcut.alt = shortcut.alt || false;
console.log("removing: "+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key);
_remove(""+(shortcut.shift?"shift-":"")+(shortcut.ctrl?"ctrl-":"")+(shortcut.alt?"alt-":"")+shortcut.key, callback);
},
fireShortcut: function( shortcut ) {
_callShortcutCallbacks( shortcut );
}
};
}());
@ta2edchimp
Copy link
Author

This has to be considered as 'not yet final'.
Feel free to improve . . . ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment