mouse support inside terminal
authorKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 21 Mar 2015 02:21:49 +0000 (22:21 -0400)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 21 Mar 2015 02:21:49 +0000 (22:21 -0400)
README.md
src/jexer/io/AWTTerminal.java
src/jexer/tterminal/ECMA48.java

index 746b1686b171904fea0def6e1652015e9561ad60..1a4190834056c6a0c03bcd50f66d88b9b46f390e 100644 (file)
--- a/README.md
+++ b/README.md
@@ -136,14 +136,11 @@ Many tasks remain before calling this version 1.0:
 
 - TWindow
   - "Smart placement" for new windows
-- ECMATerminal
-  - Mouse 1006 mode parsing
 
 Wishlist features (2.0):
 
 - TTerminal
   - Handle resize events (pass to child process)
-  - xterm mouse handling
 - Screen
   - Allow complex characters in putCharXY() and detect them in putStrXY().
 - TComboBox
index 783cffd4ec5f1fba6e6cd2397dd70a37d380a2a5..38f6734b96fcea4c8aac2c97cb5e774c636a7caa 100644 (file)
@@ -96,6 +96,16 @@ public final class AWTTerminal implements ComponentListener, KeyListener,
      */
     private Thread readerThread;
 
+    /**
+     * The last reported mouse X position.
+     */
+    private int oldMouseX = -1;
+
+    /**
+     * The last reported mouse Y position.
+     */
+    private int oldMouseY = -1;
+
     /**
      * true if mouse1 was down.  Used to report mouse1 on the release event.
      */
@@ -566,6 +576,13 @@ public final class AWTTerminal implements ComponentListener, KeyListener,
     public void mouseMoved(final MouseEvent mouse) {
         int x = screen.textColumn(mouse.getX());
         int y = screen.textRow(mouse.getY());
+        if ((x == oldMouseX) && (y == oldMouseY)) {
+            // Bail out, we've moved some pixels but not a whole text cell.
+            return;
+        }
+        oldMouseX = x;
+        oldMouseY = y;
+
         TMouseEvent mouseEvent = new TMouseEvent(TMouseEvent.Type.MOUSE_MOTION,
             x, y, x, y, mouse1, mouse2, mouse3, false, false);
 
index df157cf4af9bbdee13e7dcd245e45a1a12c1f767..017c3c7f1df6b6b347f1f862d9151de06231ce35 100644 (file)
@@ -1096,25 +1096,18 @@ public class ECMA48 implements Runnable {
      * @param mouse mouse event received from the local user
      */
     public void mouse(final TMouseEvent mouse) {
+
         /*
-         * TODO:
-         *
-         * - Parse the mouse requests from the remote side regarding protocol
-         *   + encoding
-         *
-         * - Send mouse events to the other side.
-         *
-         *  - Handle the cursor (double invert).
+        System.err.printf("mouse(): protocol %s encoding %s mouse %s\n",
+            mouseProtocol, mouseEncoding, mouse);
          */
 
-        // System.err.printf("Mouse: %s\n", mouse);
-
-        /*
         if (mouseEncoding != MouseEncoding.UTF8) {
-            // We only support UTF8 encoding, bail out now.
-            return;
+            // We will support X10 but only for (160,94) and smaller.
+            if ((mouse.getX() >= 160) || (mouse.getY() >= 94)) {
+                return;
+            }
         }
-         */
 
         switch (mouseProtocol) {
 
@@ -1165,7 +1158,9 @@ public class ECMA48 implements Runnable {
         sb.append((char) 0x1B);
         sb.append('[');
         sb.append('M');
-        if (mouse.getMouse1()) {
+        if (mouse.getType() == TMouseEvent.Type.MOUSE_UP) {
+            sb.append((char) (0x03 + 32));
+        } else if (mouse.getMouse1()) {
             sb.append((char) (0x00 + 32));
         } else if (mouse.getMouse2()) {
             sb.append((char) (0x01 + 32));