Skip to content

Commit

Permalink
Merge pull request madrobby#54 from clvrobj/master
Browse files Browse the repository at this point in the history
Modifiers reset issue
  • Loading branch information
madrobby committed Feb 13, 2013
2 parents e235689 + 91daac4 commit 64fc7e5
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 9 deletions.
11 changes: 11 additions & 0 deletions keymaster.js
Expand Up @@ -43,6 +43,16 @@
return -1;
}

var modifierMap = {
16:'shiftKey',
18:'altKey',
17:'ctrlKey',
91:'metaKey'
};
function updateModifierKey(event) {
for(k in _mods) _mods[k] = event[modifierMap[k]];
};

// handle keydown event
function dispatch(event, scope){
var key, handler, k, i, modifiersMatch;
Expand All @@ -60,6 +70,7 @@
for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;
return;
}
updateModifierKey(event);

// see if we need to ignore the keypress (filter() can can be overridden)
// by default ignore key presses if a select, textarea, or input is focused
Expand Down
27 changes: 18 additions & 9 deletions test/keymaster.html
Expand Up @@ -21,14 +21,23 @@ <h1>Keymaster unit tests</h1>
return document.getElementById(id);
}

var modifierMap = {
16:'shiftKey',
18:'altKey',
17:'ctrlKey',
91:'metaKey'
};

// because the DOM is retarded,
// and browsers don't really care about the DOM API anyway
// (IE, Firefox, WebKit are all using different event generators),
// we'll just simulate events roughly
function keydown(code, el){
function keydown(code, modifiers, el){
var event = document.createEvent('Event');
event.initEvent('keydown', true, true);
event.keyCode = code;
if (modifiers && modifiers.length > 0)
for(i in modifiers) event[modifierMap[modifiers[i]]] = true;
(el||document).dispatchEvent(event);
}

Expand Down Expand Up @@ -73,22 +82,22 @@ <h1>Keymaster unit tests</h1>
t.assertEqual(0, cntCommandCtrlShiftA);
t.assertEqual(0, cntCommandCtrlAltShiftA);

keydown(KEYS.shift); keydown(65); keyup(65); keyup(KEYS.shift);
keydown(KEYS.shift); keydown(65, [16]); keyup(65); keyup(KEYS.shift);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
t.assertEqual(0, cntCtrlShiftA);
t.assertEqual(0, cntCommandCtrlShiftA);
t.assertEqual(0, cntCommandCtrlAltShiftA);

keydown(KEYS.shift); keydown(KEYS.ctrl); keydown(65); keyup(65); keyup(KEYS.shift); keyup(KEYS.ctrl);
keydown(KEYS.shift); keydown(KEYS.ctrl); keydown(65, [16, 17]); keyup(65); keyup(KEYS.shift); keyup(KEYS.ctrl);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
t.assertEqual(1, cntCtrlShiftA);
t.assertEqual(0, cntCommandCtrlShiftA);
t.assertEqual(0, cntCommandCtrlAltShiftA);

keydown(KEYS.command); keydown(KEYS.shift); keydown(KEYS.ctrl);
keydown(65); keyup(65);
keydown(65, [91, 16, 17]); keyup(65);
keyup(KEYS.shift); keyup(KEYS.ctrl); keyup(KEYS.command);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
Expand All @@ -97,7 +106,7 @@ <h1>Keymaster unit tests</h1>
t.assertEqual(0, cntCommandCtrlAltShiftA);

keydown(KEYS.alt); keydown(KEYS.command); keydown(KEYS.shift); keydown(KEYS.ctrl);
keydown(65); keyup(65);
keydown(65, [18, 91, 16, 17]); keyup(65);
keyup(KEYS.shift); keyup(KEYS.ctrl); keyup(KEYS.command); keyup(KEYS.alt);
t.assertEqual(1, cntA);
t.assertEqual(1, cntShiftA);
Expand All @@ -113,10 +122,10 @@ <h1>Keymaster unit tests</h1>
key('⇧+c', function(){ sequence += 'c' });
key('⌘+d', function(){ sequence += 'd' });

keydown(KEYS.ctrl); keydown(65); keyup(65); keyup(KEYS.ctrl);
keydown(KEYS.option); keydown(66); keyup(66); keyup(KEYS.option);
keydown(KEYS.shift); keydown(67); keyup(67); keyup(KEYS.shift);
keydown(KEYS.command); keydown(68); keyup(68); keyup(KEYS.command);
keydown(KEYS.ctrl); keydown(65, [17]); keyup(65); keyup(KEYS.ctrl);
keydown(KEYS.option); keydown(66, [18]); keyup(66); keyup(KEYS.option);
keydown(KEYS.shift); keydown(67, [16]); keyup(67); keyup(KEYS.shift);
keydown(KEYS.command); keydown(68, [91]); keyup(68); keyup(KEYS.command);

t.assertEqual('abcd', sequence);
},
Expand Down

0 comments on commit 64fc7e5

Please sign in to comment.