Refactoring - boolean getters and miscellaneous
[nikiroo-utils.git] / src / jexer / io / ECMA48Terminal.java
index d466646d5d129b312a8d93aa85c61812502738ec..b496d8c2557806c0752b8730e16f658d3fd069df 100644 (file)
@@ -46,7 +46,6 @@ import java.util.Date;
 import java.util.List;
 import java.util.LinkedList;
 
-import jexer.TKeypress;
 import jexer.bits.Color;
 import jexer.event.TInputEvent;
 import jexer.event.TKeypressEvent;
@@ -98,11 +97,6 @@ public final class ECMA48Terminal implements Runnable {
      */
     private ArrayList<String> params;
 
-    /**
-     * params[paramI] is being appended to.
-     */
-    private int paramI;
-
     /**
      * States in the input parser.
      */
@@ -188,12 +182,9 @@ public final class ECMA48Terminal implements Runnable {
     private PrintWriter output;
 
     /**
-     * When true, the terminal is sending non-UTF8 bytes when reporting mouse
-     * events.
-     *
-     * TODO: Add broken mouse detection back into the reader.
+     * The listening object that run() wakes up on new input.
      */
-    private boolean brokenTerminalUTFMouse = false;
+    private Object listener;
 
     /**
      * Get the output writer.
@@ -284,6 +275,8 @@ public final class ECMA48Terminal implements Runnable {
     /**
      * Constructor sets up state for getEvent().
      *
+     * @param listener the object this backend needs to wake up when new
+     * input comes in
      * @param input an InputStream connected to the remote user, or null for
      * System.in.  If System.in is used, then on non-Windows systems it will
      * be put in raw mode; shutdown() will (blindly!) put System.in in cooked
@@ -294,7 +287,7 @@ public final class ECMA48Terminal implements Runnable {
      * @throws UnsupportedEncodingException if an exception is thrown when
      * creating the InputStreamReader
      */
-    public ECMA48Terminal(final InputStream input,
+    public ECMA48Terminal(final Object listener, final InputStream input,
         final OutputStream output) throws UnsupportedEncodingException {
 
         reset();
@@ -302,6 +295,7 @@ public final class ECMA48Terminal implements Runnable {
         mouse2           = false;
         mouse3           = false;
         stopReaderThread = false;
+        this.listener    = listener;
 
         if (input == null) {
             // inputStream = System.in;
@@ -402,7 +396,6 @@ public final class ECMA48Terminal implements Runnable {
     private void reset() {
         state = ParseState.GROUND;
         params = new ArrayList<String>();
-        paramI = 0;
         params.clear();
         params.add("");
     }
@@ -709,8 +702,6 @@ public final class ECMA48Terminal implements Runnable {
         boolean ctrl = false;
         boolean alt = false;
         boolean shift = false;
-        char keyCh = ch;
-        TKeypress key;
 
         // System.err.printf("state: %s ch %c\r\n", state, ch);
 
@@ -799,13 +790,13 @@ public final class ECMA48Terminal implements Runnable {
         case CSI_ENTRY:
             // Numbers - parameter values
             if ((ch >= '0') && (ch <= '9')) {
-                params.set(paramI, params.get(paramI) + ch);
+                params.set(params.size() - 1,
+                    params.get(params.size() - 1) + ch);
                 state = ParseState.CSI_PARAM;
                 return;
             }
             // Parameter separator
             if (ch == ';') {
-                paramI++;
                 params.add("");
                 return;
             }
@@ -907,14 +898,14 @@ public final class ECMA48Terminal implements Runnable {
         case CSI_PARAM:
             // Numbers - parameter values
             if ((ch >= '0') && (ch <= '9')) {
-                params.set(paramI, params.get(paramI) + ch);
+                params.set(params.size() - 1,
+                    params.get(params.size() - 1) + ch);
                 state = ParseState.CSI_PARAM;
                 return;
             }
             // Parameter separator
             if (ch == ';') {
-                paramI++;
-                params.add(paramI, "");
+                params.add("");
                 return;
             }
 
@@ -1000,7 +991,7 @@ public final class ECMA48Terminal implements Runnable {
             return;
 
         case MOUSE:
-            params.set(0, params.get(paramI) + ch);
+            params.set(0, params.get(params.size() - 1) + ch);
             if (params.get(0).length() == 3) {
                 // We have enough to generate a mouse event
                 events.add(parseMouse());
@@ -1435,7 +1426,7 @@ public final class ECMA48Terminal implements Runnable {
                         readBuffer = new char[readBuffer.length * 2];
                     }
 
-                    int rc = input.read(readBuffer, 0, n);
+                    int rc = input.read(readBuffer, 0, readBuffer.length);
                     // System.err.printf("read() %d", rc); System.err.flush();
                     if (rc == -1) {
                         // This is EOF
@@ -1450,9 +1441,8 @@ public final class ECMA48Terminal implements Runnable {
                                 synchronized (eventQueue) {
                                     eventQueue.addAll(events);
                                 }
-                                // Now wake up the backend
-                                synchronized (this) {
-                                    this.notifyAll();
+                                synchronized (listener) {
+                                    listener.notifyAll();
                                 }
                                 events.clear();
                             }
@@ -1465,6 +1455,9 @@ public final class ECMA48Terminal implements Runnable {
                             eventQueue.addAll(events);
                         }
                         events.clear();
+                        synchronized (listener) {
+                            listener.notifyAll();
+                        }
                     }
 
                     // Wait 10 millis for more data