]> git.proxmox.com Git - mirror_xterm.js.git/commitdiff
Fix right-click paste
authorParis Kasidiaris <paris@sourcelair.com>
Thu, 29 Sep 2016 07:50:21 +0000 (10:50 +0300)
committerParis Kasidiaris <paris@sourcelair.com>
Thu, 29 Sep 2016 07:50:21 +0000 (10:50 +0300)
Fix #202

src/xterm.css
src/xterm.js

index 8295eb653ad19013d12789526dbf5fc26e250eea..061ace9de08a17f6957b713418b73f715a7f363d 100644 (file)
 }
 
 .terminal .xterm-helper-textarea {
-    position: absolute;
     /*
      * HACK: to fix IE's blinking cursor
      * Move textarea out of the screen to the far left, so that the cursor is not visible.
      */
-    left: -9999em;
+    position: absolute;
     opacity: 0;
+    left: -9999em;
     width: 0;
     height: 0;
     z-index: -10;
index 3ccc99e5a9ec08644b05cc4a7ab5eeaf029ffacf..ba790b3dc06c8a884c7c1573edc78e9eee5caecc 100644 (file)
@@ -967,6 +967,57 @@ Terminal.prototype.bindMouse = function() {
     };
   }
 
+  // Handle right-click
+  on(el, 'contextmenu', function (ev) {
+    var s = document.getSelection(),
+        sText = Terminal.prepareCopiedTextForClipboard(s.toString()),
+        r = s.getRangeAt(0);
+
+    var x = ev.clientX,
+        y = ev.clientY;
+
+    var cr = r.getClientRects(),
+        clickIsOnSelection = false,
+        i, rect;
+
+    for (i=0; i<cr.length; i++) {
+      rect = cr[i];
+      clickIsOnSelection = (
+        (x > rect.left) && (x < rect.right) &&
+        (y > rect.top) && (y < rect.bottom)
+      )
+      // If we clicked on selection and selection is not a single space,
+      // then mark the right click as copy-only. We check for the single
+      // space selection, as this can happen when clicking on an &nbsp;
+      // and there is not much pointing in copying a single space.
+      // Single space is char
+      if (clickIsOnSelection && (sText !== ' ')) {
+        break;
+      }
+    }
+
+    // Bring textarea at the cursor position
+    if (!clickIsOnSelection) {
+      term.textarea.style.position = 'fixed';
+      term.textarea.style.width = '10px';
+      term.textarea.style.height = '10px';
+      term.textarea.style.left = x + 'px';
+      term.textarea.style.top = y + 'px';
+      term.textarea.style.zIndex = 1000;
+      term.textarea.focus();
+
+      // Reset the terminal textarea's styling
+      setTimeout(function () {
+        term.textarea.style.position = null;
+        term.textarea.style.width = null;
+        term.textarea.style.height = null;
+        term.textarea.style.left = null;
+        term.textarea.style.top = null;
+        term.textarea.style.zIndex = null;
+      }, 1);
+    }
+  });
+
   on(el, 'mousedown', function(ev) {
     if (!self.mouseEvents) return;