X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fio%2FECMA48Terminal.java;h=b496d8c2557806c0752b8730e16f658d3fd069df;hb=7c870d89433346ccb5505f8f9ba62d3fc18fe996;hp=d466646d5d129b312a8d93aa85c61812502738ec;hpb=a83fea2bae838f4b9bbf59ce3832e0e67be41378;p=nikiroo-utils.git diff --git a/src/jexer/io/ECMA48Terminal.java b/src/jexer/io/ECMA48Terminal.java index d466646..b496d8c 100644 --- a/src/jexer/io/ECMA48Terminal.java +++ b/src/jexer/io/ECMA48Terminal.java @@ -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 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(); - 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