mousetrapjs 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/lib/mousetrapjs/version.rb +1 -1
- data/vendor/assets/javascripts/mousetrap.js +118 -78
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a05b6045de34fc7a0ad351cfbde3c00199238455
|
4
|
+
data.tar.gz: 8c923714b26069877b456fffbfd66b5fbefa4485
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c147ad6eeb0ab7b660fdaa2ff6d968ef4245f3bad8fda3f0281221bb3cb44e13ca21f4585869a3e02d98ed582c34d5325d8cdde16801d17383f52be4f89cf7e
|
7
|
+
data.tar.gz: d3a340ed7919ea2731f88493e229a6815ac0ae8b861e6a087870377d39ff52a9fa49b64c5fdb207e9c0fb66fffb961e6ae7688d614f3d9cdb8d2cc2466c7622e
|
data/Gemfile
CHANGED
data/lib/mousetrapjs/version.rb
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
* Mousetrap is a simple keyboard shortcut library for Javascript with
|
18
18
|
* no external dependencies
|
19
19
|
*
|
20
|
-
* @version 1.4.
|
20
|
+
* @version 1.4.1
|
21
21
|
* @url craig.is/killing/mice
|
22
22
|
*/
|
23
23
|
(function() {
|
@@ -180,7 +180,7 @@
|
|
180
180
|
*
|
181
181
|
* @type {boolean|string}
|
182
182
|
*/
|
183
|
-
|
183
|
+
_nextExpectedAction = false;
|
184
184
|
|
185
185
|
/**
|
186
186
|
* loop through the f keys, f1 to f19 and add them to the map
|
@@ -291,7 +291,7 @@
|
|
291
291
|
}
|
292
292
|
|
293
293
|
if (!activeSequences) {
|
294
|
-
|
294
|
+
_nextExpectedAction = false;
|
295
295
|
}
|
296
296
|
}
|
297
297
|
|
@@ -302,11 +302,12 @@
|
|
302
302
|
* @param {string} character
|
303
303
|
* @param {Array} modifiers
|
304
304
|
* @param {Event|Object} e
|
305
|
-
* @param {
|
305
|
+
* @param {string=} sequenceName - name of the sequence we are looking for
|
306
306
|
* @param {string=} combination
|
307
|
+
* @param {number=} level
|
307
308
|
* @returns {Array}
|
308
309
|
*/
|
309
|
-
function _getMatches(character, modifiers, e,
|
310
|
+
function _getMatches(character, modifiers, e, sequenceName, combination, level) {
|
310
311
|
var i,
|
311
312
|
callback,
|
312
313
|
matches = [],
|
@@ -327,9 +328,9 @@
|
|
327
328
|
for (i = 0; i < _callbacks[character].length; ++i) {
|
328
329
|
callback = _callbacks[character][i];
|
329
330
|
|
330
|
-
// if
|
331
|
-
// then move onto the next match
|
332
|
-
if (callback.seq && _sequenceLevels[callback.seq] != callback.level) {
|
331
|
+
// if a sequence name is not specified, but this is a sequence at
|
332
|
+
// the wrong level then move onto the next match
|
333
|
+
if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) {
|
333
334
|
continue;
|
334
335
|
}
|
335
336
|
|
@@ -348,9 +349,14 @@
|
|
348
349
|
// firefox will fire a keypress if meta or control is down
|
349
350
|
if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) {
|
350
351
|
|
351
|
-
//
|
352
|
-
//
|
353
|
-
|
352
|
+
// when you bind a combination or sequence a second time it
|
353
|
+
// should overwrite the first one. if a sequenceName or
|
354
|
+
// combination is specified in this call it does just that
|
355
|
+
//
|
356
|
+
// @todo make deleting its own method?
|
357
|
+
var deleteCombo = !sequenceName && callback.combo == combination;
|
358
|
+
var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level;
|
359
|
+
if (deleteCombo || deleteSequence) {
|
354
360
|
_callbacks[character].splice(i, 1);
|
355
361
|
}
|
356
362
|
|
@@ -490,7 +496,7 @@
|
|
490
496
|
// modifier keys are ignored because you can have a sequence
|
491
497
|
// that contains modifiers such as "enter ctrl+space" and in most
|
492
498
|
// cases the modifier key will be pressed before the next key
|
493
|
-
if (e.type ==
|
499
|
+
if (e.type == _nextExpectedAction && !_isModifier(character)) {
|
494
500
|
_resetSequences(doNotReset);
|
495
501
|
}
|
496
502
|
}
|
@@ -611,90 +617,89 @@
|
|
611
617
|
// and setting the level to 0
|
612
618
|
_sequenceLevels[combo] = 0;
|
613
619
|
|
614
|
-
// if there is no action pick the best one for the first key
|
615
|
-
// in the sequence
|
616
|
-
if (!action) {
|
617
|
-
action = _pickBestAction(keys[0], []);
|
618
|
-
}
|
619
|
-
|
620
620
|
/**
|
621
621
|
* callback to increase the sequence level for this sequence and reset
|
622
622
|
* all other sequences that were active
|
623
623
|
*
|
624
|
-
* @param {
|
625
|
-
* @returns
|
624
|
+
* @param {string} nextAction
|
625
|
+
* @returns {Function}
|
626
626
|
*/
|
627
|
-
|
628
|
-
|
627
|
+
function _increaseSequence(nextAction) {
|
628
|
+
return function() {
|
629
|
+
_nextExpectedAction = nextAction;
|
629
630
|
++_sequenceLevels[combo];
|
630
631
|
_resetSequenceTimer();
|
631
|
-
}
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
632
|
+
};
|
633
|
+
}
|
634
|
+
|
635
|
+
/**
|
636
|
+
* wraps the specified callback inside of another function in order
|
637
|
+
* to reset all sequence counters as soon as this sequence is done
|
638
|
+
*
|
639
|
+
* @param {Event} e
|
640
|
+
* @returns void
|
641
|
+
*/
|
642
|
+
function _callbackAndReset(e) {
|
643
|
+
_fireCallback(callback, e, combo);
|
644
|
+
|
645
|
+
// we should ignore the next key up if the action is key down
|
646
|
+
// or keypress. this is so if you finish a sequence and
|
647
|
+
// release the key the final key will not trigger a keyup
|
648
|
+
if (action !== 'keyup') {
|
649
|
+
_ignoreNextKeyup = _characterFromEvent(e);
|
650
|
+
}
|
649
651
|
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
i;
|
652
|
+
// weird race condition if a sequence ends with the key
|
653
|
+
// another sequence begins with
|
654
|
+
setTimeout(_resetSequences, 10);
|
655
|
+
}
|
655
656
|
|
656
657
|
// loop through keys one at a time and bind the appropriate callback
|
657
658
|
// function. for any key leading up to the final one it should
|
658
659
|
// increase the sequence. after the final, it should reset all sequences
|
659
|
-
|
660
|
-
|
660
|
+
//
|
661
|
+
// if an action is specified in the original bind call then that will
|
662
|
+
// be used throughout. otherwise we will pass the action that the
|
663
|
+
// next key in the sequence should match. this allows a sequence
|
664
|
+
// to mix and match keypress and keydown events depending on which
|
665
|
+
// ones are better suited to the key provided
|
666
|
+
for (var i = 0; i < keys.length; ++i) {
|
667
|
+
var isFinal = i + 1 === keys.length;
|
668
|
+
var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action);
|
669
|
+
_bindSingle(keys[i], wrappedCallback, action, combo, i);
|
661
670
|
}
|
662
671
|
}
|
663
672
|
|
664
673
|
/**
|
665
|
-
*
|
674
|
+
* Converts from a string key combination to an array
|
666
675
|
*
|
667
|
-
* @param
|
668
|
-
* @
|
669
|
-
* @param {string=} action
|
670
|
-
* @param {string=} sequenceName - name of sequence if part of sequence
|
671
|
-
* @param {number=} level - what part of the sequence the command is
|
672
|
-
* @returns void
|
676
|
+
* @param {string} combination like "command+shift+l"
|
677
|
+
* @return {Array}
|
673
678
|
*/
|
674
|
-
function
|
675
|
-
|
676
|
-
|
677
|
-
|
679
|
+
function _keysFromString(combination) {
|
680
|
+
if (combination === '+') {
|
681
|
+
return ['+'];
|
682
|
+
}
|
678
683
|
|
679
|
-
|
680
|
-
|
684
|
+
return combination.split('+');
|
685
|
+
}
|
681
686
|
|
682
|
-
|
683
|
-
|
687
|
+
/**
|
688
|
+
* Gets info for a specific key combination
|
689
|
+
*
|
690
|
+
* @param {string} combination key combination ("command+s" or "a" or "*")
|
691
|
+
* @param {string=} action
|
692
|
+
* @returns {Object}
|
693
|
+
*/
|
694
|
+
function _getKeyInfo(combination, action) {
|
695
|
+
var keys,
|
684
696
|
key,
|
685
|
-
|
697
|
+
i,
|
686
698
|
modifiers = [];
|
687
699
|
|
688
|
-
// if this pattern is a sequence of keys then run through this method
|
689
|
-
// to reprocess each pattern one key at a time
|
690
|
-
if (sequence.length > 1) {
|
691
|
-
_bindSequence(combination, sequence, callback, action);
|
692
|
-
return;
|
693
|
-
}
|
694
|
-
|
695
700
|
// take the keys from this pattern and figure out what the actual
|
696
701
|
// pattern is all about
|
697
|
-
keys = combination
|
702
|
+
keys = _keysFromString(combination);
|
698
703
|
|
699
704
|
for (i = 0; i < keys.length; ++i) {
|
700
705
|
key = keys[i];
|
@@ -722,14 +727,49 @@
|
|
722
727
|
// we will try to pick the best event for it
|
723
728
|
action = _pickBestAction(key, modifiers, action);
|
724
729
|
|
730
|
+
return {
|
731
|
+
key: key,
|
732
|
+
modifiers: modifiers,
|
733
|
+
action: action
|
734
|
+
};
|
735
|
+
}
|
736
|
+
|
737
|
+
/**
|
738
|
+
* binds a single keyboard combination
|
739
|
+
*
|
740
|
+
* @param {string} combination
|
741
|
+
* @param {Function} callback
|
742
|
+
* @param {string=} action
|
743
|
+
* @param {string=} sequenceName - name of sequence if part of sequence
|
744
|
+
* @param {number=} level - what part of the sequence the command is
|
745
|
+
* @returns void
|
746
|
+
*/
|
747
|
+
function _bindSingle(combination, callback, action, sequenceName, level) {
|
748
|
+
|
749
|
+
// store a direct mapped reference for use with Mousetrap.trigger
|
750
|
+
_directMap[combination + ':' + action] = callback;
|
751
|
+
|
752
|
+
// make sure multiple spaces in a row become a single space
|
753
|
+
combination = combination.replace(/\s+/g, ' ');
|
754
|
+
|
755
|
+
var sequence = combination.split(' '),
|
756
|
+
info;
|
757
|
+
|
758
|
+
// if this pattern is a sequence of keys then run through this method
|
759
|
+
// to reprocess each pattern one key at a time
|
760
|
+
if (sequence.length > 1) {
|
761
|
+
_bindSequence(combination, sequence, callback, action);
|
762
|
+
return;
|
763
|
+
}
|
764
|
+
|
765
|
+
info = _getKeyInfo(combination, action);
|
766
|
+
|
725
767
|
// make sure to initialize array if this is the first time
|
726
768
|
// a callback is added for this key
|
727
|
-
|
728
|
-
_callbacks[key] = [];
|
729
|
-
}
|
769
|
+
_callbacks[info.key] = _callbacks[info.key] || [];
|
730
770
|
|
731
771
|
// remove an existing match if there is one
|
732
|
-
_getMatches(key, modifiers, {type: action},
|
772
|
+
_getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level);
|
733
773
|
|
734
774
|
// add this call back to the array
|
735
775
|
// if it is a sequence put it at the beginning
|
@@ -737,10 +777,10 @@
|
|
737
777
|
//
|
738
778
|
// this is important because the way these are processed expects
|
739
779
|
// the sequence ones to come first
|
740
|
-
_callbacks[key][sequenceName ? 'unshift' : 'push']({
|
780
|
+
_callbacks[info.key][sequenceName ? 'unshift' : 'push']({
|
741
781
|
callback: callback,
|
742
|
-
modifiers: modifiers,
|
743
|
-
action: action,
|
782
|
+
modifiers: info.modifiers,
|
783
|
+
action: info.action,
|
744
784
|
seq: sequenceName,
|
745
785
|
level: level,
|
746
786
|
combo: combination
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mousetrapjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luiz Eduardo Kowalski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Gem for Mousetrap, a simple library for handling keyboard shortcuts in
|
14
14
|
Javascript
|