]> git.proxmox.com Git - mirror_xterm.js.git/commitdiff
Ensure outside selection pastes are respected
authorDaniel Imms <daimms@microsoft.com>
Tue, 20 Jun 2017 18:17:12 +0000 (11:17 -0700)
committerDaniel Imms <daimms@microsoft.com>
Tue, 20 Jun 2017 18:17:12 +0000 (11:17 -0700)
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
src/handlers/Clipboard.ts
src/xterm.js

index 8c05cd7c4b59e9398122c2ebceef61bddc1b0d8c..3138048af6362923183fd7c4f734abd3c504bd47 100644 (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);
index 9594508865949f02099bf65f1097040bfd256840..aa1c1400d7aed46b24cab67c195a8ca32af7d360 100644 (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();
+}
index efcdd5242543caf167cb2966879b7bb5abcf6f9f..478c6856e020c7bc03b98f1612160850666e0f38 100644 (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);
     });
   }