diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index d39b13e3..d0d08351 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -281,10 +281,12 @@ var TextInput = function(parentNode, host) { if (host.renderer.$keepTextAreaAtCursor) host.renderer.$keepTextAreaAtCursor = null; - event.capture(host.container, function(e) { - text.style.left = e.clientX - 2 + "px"; - text.style.top = e.clientY - 2 + "px"; - }, onContextMenuClose); + // on windows context menu is opened after mouseup + if (useragent.isGecko && useragent.isWin) + event.capture(host.container, function(e) { + text.style.left = e.clientX - 2 + "px"; + text.style.top = e.clientY - 2 + "px"; + }, onContextMenuClose); }; function onContextMenuClose() { diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index aad5ddd4..c4fff32a 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -93,7 +93,7 @@ exports.preventDefault = function(e) { exports.getButton = function(e) { if (e.type == "dblclick") return 0; - else if (e.type == "contextmenu") + if (e.type == "contextmenu" || (e.ctrlKey && useragent.isMac)) return 2; // DOM Event diff --git a/lib/ace/mouse/default_handlers.js b/lib/ace/mouse/default_handlers.js index e5568881..497de75e 100644 --- a/lib/ace/mouse/default_handlers.js +++ b/lib/ace/mouse/default_handlers.js @@ -90,7 +90,7 @@ function DefaultHandlers(mouseHandler) { // 2: contextmenu, 1: linux paste editor.textInput.onContextMenu(ev.domEvent); - return ev.stop(); + return; // stopping event here breaks contextmenu on ff mac } // if this click caused the editor to be focused should not clear the diff --git a/lib/ace/mouse/mouse_event.js b/lib/ace/mouse/mouse_event.js index 2c813cde..59ed98fe 100644 --- a/lib/ace/mouse/mouse_event.js +++ b/lib/ace/mouse/mouse_event.js @@ -40,6 +40,7 @@ define(function(require, exports, module) { "use strict"; var event = require("../lib/event"); +var useragent = require("../lib/useragent"); /* * Custom Ace mouse event @@ -130,9 +131,9 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) { return this.domEvent.shiftKey; }; - this.getAccelKey = function() { - return this.domEvent.ctrlKey || this.domEvent.metaKey ; - }; + this.getAccelKey = useragent.isMac + ? function() { return this.domEvent.metaKey; } + : function() { return this.domEvent.ctrlKey; }; }).call(MouseEvent.prototype); diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index e1e7a2a1..f108a7dc 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -130,12 +130,12 @@ var MouseHandler = function(editor) { renderer.$keepTextAreaAtCursor = null; var self = this; - var onMouseSelection = function(e) { + var onMouseMove = function(e) { self.x = e.clientX; self.y = e.clientY; }; - var onMouseSelectionEnd = function(e) { + var onCaptureEnd = function(e) { clearInterval(timerId); self[self.state + "End"] && self[self.state + "End"](e); self.$clickSelection = null; @@ -145,12 +145,12 @@ var MouseHandler = function(editor) { } }; - var onSelectionInterval = function() { + var onCaptureInterval = function() { self[self.state] && self[self.state](); } - event.capture(this.editor.container, onMouseSelection, onMouseSelectionEnd); - var timerId = setInterval(onSelectionInterval, 20); + event.capture(this.editor.container, onMouseMove, onCaptureEnd); + var timerId = setInterval(onCaptureInterval, 20); }; }).call(MouseHandler.prototype); diff --git a/lib/ace/mouse/multi_select_handler.js b/lib/ace/mouse/multi_select_handler.js index 880bc13c..f14e8e99 100644 --- a/lib/ace/mouse/multi_select_handler.js +++ b/lib/ace/mouse/multi_select_handler.js @@ -53,18 +53,14 @@ function onMouseDown(e) { var ctrl = e.getAccelKey(); var button = e.getButton(); + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + if (!ctrl && !alt) { - if (e.editor.inMultiSelectMode) { - if (button == 0) { - e.editor.exitMultiSelectMode(); - } else if (button == 2) { - var editor = e.editor; - var selectionEmpty = editor.selection.isEmpty(); - editor.textInput.onContextMenu({x: e.clientX, y: e.clientY}, selectionEmpty); - event.capture(editor.container, function(){}, editor.textInput.onContextMenuClose); - e.stop(); - } - } + if (button == 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); return; }