diff --git a/lib/ace/keyboard/keybinding.js b/lib/ace/keyboard/keybinding.js index 9caa76da..e1ab4faf 100644 --- a/lib/ace/keyboard/keybinding.js +++ b/lib/ace/keyboard/keybinding.js @@ -39,6 +39,7 @@ define(function(require, exports, module) { +var useragent = require("../lib/useragent"); var keyUtil = require("../lib/keys"); var event = require("../lib/event"); require("../commands/default_commands"); @@ -75,9 +76,8 @@ var KeyBinding = function(editor) { }; this.$callKeyboardHandlers = function (hashId, keyString, keyCode, e) { - var toExecute; for (var i = this.$handlers.length; i--;) { - toExecute = this.$handlers[i].handleKeyboard( + var toExecute = this.$handlers[i].handleKeyboard( this.$data, hashId, keyString, keyCode, e ); if (toExecute && toExecute.command) @@ -97,13 +97,13 @@ var KeyBinding = function(editor) { if (success && e) event.stopEvent(e); - return success; + return success }; this.handleKeyboard = function(data, hashId, keyString) { return { command: this.$editor.commands.findKeyCommand(hashId, keyString) - }; + } }; this.onCommandKey = function(e, hashId, keyCode) { diff --git a/lib/ace/keyboard/state_handler.js b/lib/ace/keyboard/state_handler.js index 15d17c8c..a5bc7fbf 100644 --- a/lib/ace/keyboard/state_handler.js +++ b/lib/ace/keyboard/state_handler.js @@ -73,7 +73,7 @@ StateHandler.prototype = { }); }, - $composeBuffer: function(data, hashId, key) { + $composeBuffer: function(data, hashId, key, e) { // Initialize the data object. if (data.state == null || data.buffer == null) { data.state = "start"; @@ -102,17 +102,23 @@ StateHandler.prototype = { data.buffer = bufferToUse; } - return { - bufferToUse: bufferToUse, - symbolicName: symbolicName + var bufferObj = { + bufferToUse: bufferToUse, + symbolicName: symbolicName, }; + + if (e) { + bufferObj.keyIdentifier = e.keyIdentifier + } + + return bufferObj; }, - $find: function(data, buffer, symbolicName, hashId, key) { + $find: function(data, buffer, symbolicName, hashId, key, keyIdentifier) { // Holds the command to execute and the args if a command matched. var result = {}; - // Loop over all the bindings of the keymapp until a match is found. + // Loop over all the bindings of the keymap until a match is found. this.keymapping[data.state].some(function(binding) { var match; @@ -127,7 +133,7 @@ StateHandler.prototype = { } // Check if the match function matches. - if (binding.match && !binding.match(buffer, hashId, key, symbolicName)) { + if (binding.match && !binding.match(buffer, hashId, key, symbolicName, keyIdentifier)) { return false; } @@ -194,20 +200,21 @@ StateHandler.prototype = { /** * This function is called by keyBinding. */ - handleKeyboard: function(data, hashId, key) { + handleKeyboard: function(data, hashId, key, keyCode, e) { // If we pressed any command key but no other key, then ignore the input. // Otherwise "shift-" is added to the buffer, and later on "shift-g" - // which results in "shift-shift-g" which doesn't make senese. + // which results in "shift-shift-g" which doesn't make sense. if (hashId != 0 && (key == "" || key == String.fromCharCode(0))) { return null; } // Compute the current value of the keyboard input buffer. - var r = this.$composeBuffer(data, hashId, key); + var r = this.$composeBuffer(data, hashId, key, e); var buffer = r.bufferToUse; var symbolicName = r.symbolicName; + var keyId = r.keyIdentifier; - r = this.$find(data, buffer, symbolicName, hashId, key); + r = this.$find(data, buffer, symbolicName, hashId, key, keyId); if (DEBUG) { console.log("KeyboardStateMapper#match", buffer, symbolicName, r); }