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.
This commit is contained in:
Daniel Imms
2017-06-20 11:17:12 -07:00
parent ef1e2ab9e2
commit 63d63c27e7
3 changed files with 25 additions and 13 deletions
+4 -2
View File
@@ -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);
+18 -8
View File
@@ -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();
}
+3 -3
View File
@@ -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);
});
}