From 63d63c27e74a1302f6b09d6a667d6ddb946867f7 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 20 Jun 2017 11:17:12 -0700 Subject: [PATCH] Ensure outside selection pastes are respected We were resetting the selection on every auxclick, meaning outside selections could not be pasted in when the terminal had a current selection. --- src/SelectionManager.ts | 6 ++++-- src/handlers/Clipboard.ts | 26 ++++++++++++++++++-------- src/xterm.js | 6 +++--- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/SelectionManager.ts b/src/SelectionManager.ts index 8c05cd7c..3138048a 100644 --- a/src/SelectionManager.ts +++ b/src/SelectionManager.ts @@ -293,8 +293,10 @@ export class SelectionManager extends EventEmitter { /** * Queues a refresh, redrawing the selection on the next opportunity. + * @param isNewSelection Whether the selection should be registered as a new + * selection on Linux. */ - public refresh(fromMouseEvent?: boolean): void { + public refresh(isNewSelection?: boolean): void { // Queue the refresh for the renderer if (!this._refreshAnimationFrame) { this._refreshAnimationFrame = window.requestAnimationFrame(() => this._refresh()); @@ -302,7 +304,7 @@ export class SelectionManager extends EventEmitter { // If the platform is Linux and the refresh call comes from a mouse event, // we need to update the selection for middle click to paste selection. - if (Browser.isLinux && fromMouseEvent) { + if (Browser.isLinux && isNewSelection) { const selectionText = this.selectionText; if (selectionText.length) { this.emit('newselection', this.selectionText); diff --git a/src/handlers/Clipboard.ts b/src/handlers/Clipboard.ts index 95945088..aa1c1400 100644 --- a/src/handlers/Clipboard.ts +++ b/src/handlers/Clipboard.ts @@ -75,12 +75,11 @@ export function pasteHandler(ev: ClipboardEvent, term: ITerminal) { } /** - * Bind to right-click event and allow right-click copy and paste. - * @param ev The original right click event to be handled - * @param term The terminal on which to apply the handled paste event - * @param selectionManager The terminal's selection manager. + * Moves the textarea under the mouse cursor and focuses it. + * @param ev The original right click event to be handled. + * @param textarea The terminal's textarea. */ -export function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, selectionManager: ISelectionManager) { +export function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement) { // Bring textarea at the cursor position textarea.style.position = 'fixed'; textarea.style.width = '20px'; @@ -89,10 +88,7 @@ export function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextA textarea.style.top = (ev.clientY - 10) + 'px'; textarea.style.zIndex = '1000'; - // Get textarea ready to copy from the context menu - textarea.value = selectionManager.selectionText; textarea.focus(); - textarea.select(); // Reset the terminal textarea's styling setTimeout(function () { @@ -104,3 +100,17 @@ export function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextA textarea.style.zIndex = null; }, 4); } + +/** + * Bind to right-click event and allow right-click copy and paste. + * @param ev The original right click event to be handled. + * @param textarea The terminal's textarea. + * @param selectionManager The terminal's selection manager. + */ +export function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, selectionManager: ISelectionManager) { + moveTextAreaUnderMouseCursor(ev, textarea); + + // Get textarea ready to copy from the context menu + textarea.value = selectionManager.selectionText; + textarea.select(); +} diff --git a/src/xterm.js b/src/xterm.js index efcdd524..478c6856 100644 --- a/src/xterm.js +++ b/src/xterm.js @@ -13,7 +13,7 @@ import { CompositionHelper } from './CompositionHelper'; import { EventEmitter } from './EventEmitter'; import { Viewport } from './Viewport'; -import { moveTextAreaUnderMouseCursor, pasteHandler, copyHandler } from './handlers/Clipboard'; +import { rightClickHandler, moveTextAreaUnderMouseCursor, pasteHandler, copyHandler } from './handlers/Clipboard'; import { CircularList } from './utils/CircularList'; import { C0 } from './EscapeSequences'; import { InputHandler } from './InputHandler'; @@ -541,12 +541,12 @@ Terminal.prototype.initGlobal = function() { if (term.browser.isFirefox) { on(this.element, 'mousedown', event => { if (ev.button == 2) { - moveTextAreaUnderMouseCursor(event, this.textarea, this.selectionManager); + rightClickHandler(event, this.textarea, this.selectionManager); } }); } else { on(this.element, 'contextmenu', event => { - moveTextAreaUnderMouseCursor(event, this.textarea, this.selectionManager); + rightClickHandler(event, this.textarea, this.selectionManager); }); }