Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 7f93063

Browse files
author
Max Brunsfeld
authored
Merge pull request #236 from atom/fb-mdt-fix-arpeggios
Fix broken arpeggios with meta/ctrl keys
2 parents ca51879 + 16b5b59 commit 7f93063

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

spec/keymap-manager-spec.coffee

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,41 @@ describe "KeymapManager", ->
301301
getFakeClock().tick(keymapManager.getPartialMatchTimeout())
302302
assert.deepEqual(events, ['viv'])
303303

304+
it "disables partially-matching bindings and replays the queued keystrokes if the ::partialMatchTimeout expires, even when the exact match contains the control or meta key", ->
305+
keymapManager.add 'test',
306+
'.workspace':
307+
'ctrl-d o g': 'control-dog'
308+
'ctrl-d': 'control-d'
309+
workspace.addEventListener 'control-dog', -> events.push('control-dog')
310+
workspace.addEventListener 'control-d', -> events.push('control-d')
311+
keymapManager.handleKeyboardEvent(buildKeydownEvent(key: 'd', ctrlKey: true, target: editor))
312+
assert.deepEqual(events, [])
313+
getFakeClock().tick(keymapManager.getPartialMatchTimeout())
314+
assert.deepEqual(events, ['control-d'])
315+
316+
# Also make sure we canceled the arpeggio.
317+
keymapManager.handleKeyboardEvent(buildKeydownEvent(key: 'o', target: editor))
318+
keymapManager.handleKeyboardEvent(buildKeydownEvent(key: 'g', target: editor))
319+
getFakeClock().tick(keymapManager.getPartialMatchTimeout())
320+
assert.deepEqual(events, ['control-d'])
321+
322+
# Alright, now let's just double check with meta instead of control.
323+
events = []
324+
keymapManager.add 'test',
325+
'.workspace':
326+
'cmd-d o g': 'meta-dog'
327+
'cmd-d': 'meta-d'
328+
workspace.addEventListener 'meta-dog', -> events.push('meta-dog')
329+
workspace.addEventListener 'meta-d', -> events.push('meta-d')
330+
keymapManager.handleKeyboardEvent(buildKeydownEvent(key: 'd', metaKey: true, target: editor))
331+
assert.deepEqual(events, [])
332+
getFakeClock().tick(keymapManager.getPartialMatchTimeout())
333+
assert.deepEqual(events, ['meta-d'])
334+
keymapManager.handleKeyboardEvent(buildKeydownEvent(key: 'o', target: editor))
335+
keymapManager.handleKeyboardEvent(buildKeydownEvent(key: 'g', target: editor))
336+
getFakeClock().tick(keymapManager.getPartialMatchTimeout())
337+
assert.deepEqual(events, ['meta-d'])
338+
304339
it "does not enter a pending state or prevent the default action if the matching binding's command is 'native!'", ->
305340
keymapManager.add 'test', '.workspace': 'v': 'native!'
306341
event = buildKeydownEvent(key: 'v', target: editor)

src/keymap-manager.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ class KeymapManager
633633
if hasPartialMatches and shouldUsePartialMatches
634634
enableTimeout = (
635635
@pendingStateTimeoutHandle? or
636-
dispatchedExactMatch? or
636+
exactMatchCandidate? or
637637
characterForKeyboardEvent(@queuedKeyboardEvents[0])?
638638
)
639639
enableTimeout = false if replay

0 commit comments

Comments
 (0)