From 6e72627e9ed3ce07ee2c6516d6e5953396632c00 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 30 Jul 2014 11:26:15 -0600 Subject: [PATCH 1/4] Stop propagation of keydown/textInput events to prevent React handler React's global synthetic event handler is somewhat expensive. This prevents it from being invoked on every keystroke, saving ~1ms. --- src/editor-component.coffee | 9 ++++++--- src/window-event-handler.coffee | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/editor-component.coffee b/src/editor-component.coffee index 577c9db0d..7c365af6f 100644 --- a/src/editor-component.coffee +++ b/src/editor-component.coffee @@ -524,6 +524,12 @@ EditorComponent = React.createClass @refs.input.focus() onTextInput: (event) -> + event.stopPropagation() + + # If we prevent the insertion of a space character, then the browser + # interprets the spacebar keypress as a page-down command. + event.preventDefault() unless event.data is ' ' + return unless @isInputEnabled() {editor} = @props @@ -539,9 +545,6 @@ EditorComponent = React.createClass editor.insertText(event.data) inputNode.value = event.data - # If we prevent the insertion of a space character, then the browser - # interprets the spacebar keypress as a page-down command. - event.preventDefault() unless event.data is ' ' onInputFocused: -> @setState(focused: true) diff --git a/src/window-event-handler.coffee b/src/window-event-handler.coffee index 4e29717c1..6669a185c 100644 --- a/src/window-event-handler.coffee +++ b/src/window-event-handler.coffee @@ -57,8 +57,7 @@ class WindowEventHandler @subscribeToCommand $(document), 'core:focus-previous', @focusPrevious - @subscribe $(document), 'keydown', (event) -> - atom.keymaps.handleKeyboardEvent(event.originalEvent) + document.addEventListener 'keydown', @onKeydown @subscribe $(document), 'drop', (e) -> e.preventDefault() @@ -95,6 +94,10 @@ class WindowEventHandler bindCommandToAction('core:redo', 'redo:') bindCommandToAction('core:select-all', 'selectAll:') + onKeydown: (event) -> + atom.keymaps.handleKeyboardEvent(event) + event.stopImmediatePropagation() + openLink: ({target, currentTarget}) -> location = target?.getAttribute('href') or currentTarget?.getAttribute('href') if location and location[0] isnt '#' and /^https?:\/\//.test(location) From db243936b4e60e3fac1aa0aa72030194c0cc8686 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 30 Jul 2014 22:45:53 -0600 Subject: [PATCH 2/4] Update emissary for Emitter::emit optimization --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bd9662e3a..1e77d3f2e 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "coffee-script": "1.7.0", "coffeestack": "0.7.0", "delegato": "^1", - "emissary": "^1.2.1", + "emissary": "^1.2.2", "first-mate": "^2.0.1", "fs-plus": "^2.2.6", "fstream": "0.1.24", From 6c72b13adc3c96c42ae99e9b828ecb091d1ed8cf Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 31 Jul 2014 15:21:37 -0600 Subject: [PATCH 3/4] Upgrade keymap to avoid temp objects in keystrokeForKeyboardEvent --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e77d3f2e..cd1bd3a99 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "atomShellVersion": "0.15.1", "dependencies": { "async": "0.2.6", - "atom-keymap": "^1.0.0", + "atom-keymap": "^1.0.2", "bootstrap": "git+https://github.com/atom/bootstrap.git#6af81906189f1747fd6c93479e3d998ebe041372", "clear-cut": "0.4.0", "coffee-script": "1.7.0", From 1c3720c1604aee3e028010e9f3040171b548ee8d Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 31 Jul 2014 15:23:58 -0600 Subject: [PATCH 4/4] Upgrade keybinding-resolver for spec fix --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd1bd3a99..9f7922df6 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "grammar-selector": "0.27.0", "image-view": "0.36.0", "incompatible-packages": "0.5.0", - "keybinding-resolver": "0.18.0", + "keybinding-resolver": "0.19.0", "link": "0.25.0", "markdown-preview": "0.94.0", "metrics": "0.33.0",