misc cleanup
[fanfix.git] / src / jexer / tterminal / ECMA48.java
index b08a18d5c3070ab207367ab3e8817eb955c1ddbe..a4197fb9f20557e31b1a9d6c8cf024244153467b 100644 (file)
@@ -302,6 +302,15 @@ public class ECMA48 implements Runnable {
      */
     private MouseEncoding mouseEncoding = MouseEncoding.X10;
 
+    /**
+     * A terminal may request that the mouse pointer be hidden using a
+     * Privacy Message containing either "hideMousePointer" or
+     * "showMousePointer".  This is currently only used within Jexer by
+     * TTerminalWindow so that only the bottom-most instance of nested
+     * Jexer's draws the mouse within its application window.
+     */
+    private boolean hideMousePointer = false;
+
     /**
      * Physical display width.  We start at 80x24, but the user can resize us
      * bigger/smaller.
@@ -1105,7 +1114,7 @@ public class ECMA48 implements Runnable {
     private void resetTabStops() {
         tabStops.clear();
         for (int i = 0; (i * 8) <= rightMargin; i++) {
-            tabStops.add(new Integer(i * 8));
+            tabStops.add(Integer.valueOf(i * 8));
         }
     }
 
@@ -1620,6 +1629,7 @@ public class ECMA48 implements Runnable {
      * @param keypress keypress received from the local user
      * @return string to transmit to the remote side
      */
+    @SuppressWarnings("fallthrough")
     private String keypressToString(final TKeypress keypress) {
 
         if ((fullDuplex == false) && (!keypress.isFnKey())) {
@@ -2358,13 +2368,13 @@ public class ECMA48 implements Runnable {
             switch (currentState.glLockshift) {
 
             case G1_GR:
-                assert (false);
+                throw new IllegalArgumentException("programming bug");
 
             case G2_GR:
-                assert (false);
+                throw new IllegalArgumentException("programming bug");
 
             case G3_GR:
-                assert (false);
+                throw new IllegalArgumentException("programming bug");
 
             case G2_GL:
                 // LS2
@@ -2385,10 +2395,10 @@ public class ECMA48 implements Runnable {
             switch (currentState.grLockshift) {
 
             case G2_GL:
-                assert (false);
+                throw new IllegalArgumentException("programming bug");
 
             case G3_GL:
-                assert (false);
+                throw new IllegalArgumentException("programming bug");
 
             case G1_GR:
                 // LS1R
@@ -2643,7 +2653,7 @@ public class ECMA48 implements Runnable {
      */
     private void param(final byte ch) {
         if (csiParams.size() == 0) {
-            csiParams.add(new Integer(0));
+            csiParams.add(Integer.valueOf(0));
         }
         Integer x = csiParams.get(csiParams.size() - 1);
         if ((ch >= '0') && (ch <= '9')) {
@@ -2653,7 +2663,7 @@ public class ECMA48 implements Runnable {
         }
 
         if (ch == ';') {
-            csiParams.add(new Integer(0));
+            csiParams.add(Integer.valueOf(0));
         }
     }
 
@@ -4085,12 +4095,12 @@ public class ECMA48 implements Runnable {
             if (collectBuffer.charAt(0) == '>') {
                 extendedFlag = 1;
                 if (collectBuffer.length() >= 2) {
-                    i = Integer.parseInt(args.toString());
+                    i = Integer.parseInt(args);
                 }
             } else if (collectBuffer.charAt(0) == '=') {
                 extendedFlag = 2;
                 if (collectBuffer.length() >= 2) {
-                    i = Integer.parseInt(args.toString());
+                    i = Integer.parseInt(args);
                 }
             } else {
                 // Unknown code, bail out
@@ -4532,7 +4542,7 @@ public class ECMA48 implements Runnable {
                 args = collectBuffer.substring(0, collectBuffer.length() - 2);
             }
 
-            String [] p = args.toString().split(";");
+            String [] p = args.split(";");
             if (p.length > 0) {
                 if ((p[0].equals("0")) || (p[0].equals("2"))) {
                     if (p.length > 1) {
@@ -4559,6 +4569,38 @@ public class ECMA48 implements Runnable {
         }
     }
 
+    /**
+     * Handle the SCAN_SOSPMAPC_STRING state.  This is currently only used by
+     * Jexer ECMA48Terminal to talk to ECMA48.
+     *
+     * @param pmChar the character received from the remote side
+     */
+    private void pmPut(final char pmChar) {
+        // System.err.println("pmPut: " + pmChar);
+
+        // Collect first
+        collectBuffer.append(pmChar);
+
+        // Xterm cases...
+        if (collectBuffer.toString().endsWith("\033\\")) {
+            String arg = null;
+            arg = collectBuffer.substring(0, collectBuffer.length() - 2);
+
+            // System.err.println("arg: '" + arg + "'");
+
+            if (arg.equals("hideMousePointer")) {
+                hideMousePointer = true;
+            }
+            if (arg.equals("showMousePointer")) {
+                hideMousePointer = false;
+            }
+
+            // Go to SCAN_GROUND state
+            toGround();
+            return;
+        }
+    }
+
     /**
      * Run this input character through the ECMA48 state machine.
      *
@@ -4588,9 +4630,11 @@ public class ECMA48 implements Runnable {
         // 0x1B == ESCAPE
         if (ch == 0x1B) {
             if ((type == DeviceType.XTERM)
-                && (scanState == ScanState.OSC_STRING)
+                && ((scanState == ScanState.OSC_STRING)
+                    || (scanState == ScanState.SOSPMAPC_STRING))
             ) {
                 // Xterm can pass ESCAPE to its OSC sequence.
+                // Jexer can pass ESCAPE to its PM sequence.
             } else if ((scanState != ScanState.DCS_ENTRY)
                 && (scanState != ScanState.DCS_INTERMEDIATE)
                 && (scanState != ScanState.DCS_IGNORE)
@@ -6446,6 +6490,15 @@ public class ECMA48 implements Runnable {
         case SOSPMAPC_STRING:
             // 00-17, 19, 1C-1F, 20-7F --> ignore
 
+            // Special case for Jexer: PM can pass one control character
+            if (ch == 0x1B) {
+                pmPut(ch);
+            }
+
+            if ((ch >= 0x20) && (ch <= 0x7F)) {
+                pmPut(ch);
+            }
+
             // 0x9C goes to GROUND
             if (ch == 0x9C) {
                 toGround();
@@ -6509,4 +6562,15 @@ public class ECMA48 implements Runnable {
         return currentState.cursorY;
     }
 
+    /**
+     * Returns true if this terminal has requested the mouse pointer be
+     * hidden.
+     *
+     * @return true if this terminal has requested the mouse pointer be
+     * hidden
+     */
+    public final boolean hasHiddenMousePointer() {
+        return hideMousePointer;
+    }
+
 }