import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.Collections;
import java.util.Date;
TApplicationImpl();
}
+ /**
+ * Public constructor. The backend type will be BackendType.ECMA48.
+ *
+ * @param input the InputStream underlying 'reader'. Its available()
+ * method is used to determine if reader.read() will block or not.
+ * @param reader a Reader connected to the remote user.
+ * @param writer a PrintWriter connected to the remote user.
+ * @param setRawMode if true, set System.in into raw mode with stty.
+ * This should in general not be used. It is here solely for Demo3,
+ * which uses System.in.
+ * @throws IllegalArgumentException if input, reader, or writer are null.
+ */
+ public TApplication(final InputStream input, final Reader reader,
+ final PrintWriter writer, final boolean setRawMode) {
+
+ backend = new ECMA48Backend(this, input, reader, writer, setRawMode);
+ TApplicationImpl();
+ }
+
+ /**
+ * Public constructor. The backend type will be BackendType.ECMA48.
+ *
+ * @param input the InputStream underlying 'reader'. Its available()
+ * method is used to determine if reader.read() will block or not.
+ * @param reader a Reader connected to the remote user.
+ * @param writer a PrintWriter connected to the remote user.
+ * @throws IllegalArgumentException if input, reader, or writer are null.
+ */
+ public TApplication(final InputStream input, final Reader reader,
+ final PrintWriter writer) {
+
+ this(input, reader, writer, false);
+ }
+
/**
* Public constructor. This hook enables use with new non-Jexer
* backends.
* @param y row position
*/
private void invertCell(final int x, final int y) {
- synchronized (getScreen()) {
- CellAttributes attr = getScreen().getAttrXY(x, y);
- attr.setForeColor(attr.getForeColor().invert());
- attr.setBackColor(attr.getBackColor().invert());
- getScreen().putAttrXY(x, y, attr, false);
+ if (debugThreads) {
+ System.err.printf("invertCell() %d %d\n", x, y);
}
+ CellAttributes attr = getScreen().getAttrXY(x, y);
+ attr.setForeColor(attr.getForeColor().invert());
+ attr.setBackColor(attr.getBackColor().invert());
+ getScreen().putAttrXY(x, y, attr, false);
}
/**
}
if (!repaint) {
- if ((oldMouseX != mouseX) || (oldMouseY != mouseY)) {
- // The only thing that has happened is the mouse moved.
- // Clear the old position and draw the new position.
- invertCell(oldMouseX, oldMouseY);
- invertCell(mouseX, mouseY);
- oldMouseX = mouseX;
- oldMouseY = mouseY;
+ if (debugThreads) {
+ System.err.printf("drawAll() !repaint\n");
}
- if (getScreen().isDirty()) {
- backend.flushScreen();
+ synchronized (getScreen()) {
+ if ((oldMouseX != mouseX) || (oldMouseY != mouseY)) {
+ // The only thing that has happened is the mouse moved.
+ // Clear the old position and draw the new position.
+ invertCell(oldMouseX, oldMouseY);
+ invertCell(mouseX, mouseY);
+ oldMouseX = mouseX;
+ oldMouseY = mouseY;
+ }
+ if (getScreen().isDirty()) {
+ backend.flushScreen();
+ }
+ return;
}
- return;
}
if (debugThreads) {
// Draw the mouse pointer
invertCell(mouseX, mouseY);
+ oldMouseX = mouseX;
+ oldMouseY = mouseY;
// Place the cursor if it is visible
TWidget activeWidget = null;
}
// Flush the screen contents
- backend.flushScreen();
+ if (getScreen().isDirty()) {
+ backend.flushScreen();
+ }
repaint = false;
}
// wait until either the backend or the consumer threads have
// something to do.
try {
+ if (debugThreads) {
+ System.err.println("sleep " + timeout + " millis");
+ }
synchronized (this) {
this.wait(timeout);
}