import java.util.List;
import java.util.LinkedList;
-import jexer.TKeypress;
import jexer.bits.Color;
import jexer.event.TInputEvent;
import jexer.event.TKeypressEvent;
*/
private ArrayList<String> params;
- /**
- * params[paramI] is being appended to.
- */
- private int paramI;
-
/**
* States in the input parser.
*/
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.
/**
* 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
* @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();
mouse2 = false;
mouse3 = false;
stopReaderThread = false;
+ this.listener = listener;
if (input == null) {
// inputStream = System.in;
private void reset() {
state = ParseState.GROUND;
params = new ArrayList<String>();
- paramI = 0;
params.clear();
params.add("");
}
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);
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;
}
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;
}
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());
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
synchronized (eventQueue) {
eventQueue.addAll(events);
}
- // Now wake up the backend
- synchronized (this) {
- this.notifyAll();
+ synchronized (listener) {
+ listener.notifyAll();
}
events.clear();
}
eventQueue.addAll(events);
}
events.clear();
+ synchronized (listener) {
+ listener.notifyAll();
+ }
}
// Wait 10 millis for more data