key.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. define(function(require, exports, module) {
  2. var keymap = require('./keymap');
  3. var CTRL_MASK = 0x1000;
  4. var ALT_MASK = 0x2000;
  5. var SHIFT_MASK = 0x4000;
  6. function hash(unknown) {
  7. if (typeof(unknown) == 'string') {
  8. return hashKeyExpression(unknown);
  9. }
  10. return hashKeyEvent(unknown);
  11. }
  12. function is(a, b) {
  13. return a && b && hash(a) == hash(b);
  14. }
  15. exports.hash = hash;
  16. exports.is = is;
  17. function hashKeyEvent(keyEvent) {
  18. var hashCode = 0;
  19. if (keyEvent.ctrlKey || keyEvent.metaKey) {
  20. hashCode |= CTRL_MASK;
  21. }
  22. if (keyEvent.altKey) {
  23. hashCode |= ALT_MASK;
  24. }
  25. if (keyEvent.shiftKey) {
  26. hashCode |= SHIFT_MASK;
  27. }
  28. // Shift, Control, Alt KeyCode ignored.
  29. if ([16, 17, 18, 91].indexOf(keyEvent.keyCode) == -1) {
  30. hashCode |= keyEvent.keyCode;
  31. }
  32. return hashCode;
  33. }
  34. function hashKeyExpression(keyExpression) {
  35. var hashCode = 0;
  36. keyExpression.toLowerCase().split(/\s*\+\s*/).forEach(function(name) {
  37. switch(name) {
  38. case 'ctrl':
  39. case 'cmd':
  40. hashCode |= CTRL_MASK;
  41. break;
  42. case 'alt':
  43. hashCode |= ALT_MASK;
  44. break;
  45. case 'shift':
  46. hashCode |= SHIFT_MASK;
  47. break;
  48. default:
  49. hashCode |= keymap[name];
  50. }
  51. });
  52. return hashCode;
  53. }
  54. });