X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Ftterminal%2FECMA48.java;h=7ce95d6255e34bce8081bf2d54a23b6e92faddce;hb=218d18dbda14a7bf482d6c07bed66f16bcd6a6ba;hp=f9c98661b83c65a9329582ea12092cae2ea5db2f;hpb=3af53a35f41caa36050a69d39a8ec40be92e7aca;p=fanfix.git diff --git a/src/jexer/tterminal/ECMA48.java b/src/jexer/tterminal/ECMA48.java index f9c9866..7ce95d6 100644 --- a/src/jexer/tterminal/ECMA48.java +++ b/src/jexer/tterminal/ECMA48.java @@ -52,6 +52,8 @@ import jexer.bits.Color; import jexer.bits.Cell; import jexer.bits.CellAttributes; import jexer.bits.StringUtils; +import jexer.event.TInputEvent; +import jexer.event.TKeypressEvent; import jexer.event.TMouseEvent; import jexer.io.ReadTimeoutException; import jexer.io.TimeoutInputStream; @@ -490,6 +492,12 @@ public class ECMA48 implements Runnable { */ private GlyphMaker glyphMaker = null; + /** + * Input queue for keystrokes and mouse events to send to the remote + * side. + */ + private ArrayList userQueue = new ArrayList(); + /** * DECSC/DECRC save/restore a subset of the total state. This class * encapsulates those specific flags/modes. @@ -682,12 +690,18 @@ public class ECMA48 implements Runnable { char [] readBufferUTF8 = null; byte [] readBuffer = null; if (utf8) { - readBufferUTF8 = new char[128]; + readBufferUTF8 = new char[2048]; } else { - readBuffer = new byte[128]; + readBuffer = new byte[2048]; } while (!done && !stopReaderThread) { + synchronized (userQueue) { + while (userQueue.size() > 0) { + handleUserEvent(userQueue.remove(0)); + } + } + try { int n = inputStream.available(); @@ -709,7 +723,7 @@ public class ECMA48 implements Runnable { } if (n == 0) { try { - Thread.sleep(2); + Thread.sleep(10); } catch (InterruptedException e) { // SQUASH } @@ -810,6 +824,31 @@ public class ECMA48 implements Runnable { // ECMA48 ----------------------------------------------------------------- // ------------------------------------------------------------------------ + /** + * Process keyboard and mouse events from the user. + * + * @param event the input event to consume + */ + private void handleUserEvent(final TInputEvent event) { + if (event instanceof TKeypressEvent) { + keypress(((TKeypressEvent) event).getKey()); + } + if (event instanceof TMouseEvent) { + mouse((TMouseEvent) event); + } + } + + /** + * Add a keyboard and mouse event from the user to the queue. + * + * @param event the input event to consume + */ + public void addUserEvent(final TInputEvent event) { + synchronized (userQueue) { + userQueue.add(event); + } + } + /** * Return the proper primary Device Attributes string. * @@ -1495,7 +1534,7 @@ public class ECMA48 implements Runnable { * * @param mouse mouse event received from the local user */ - public void mouse(final TMouseEvent mouse) { + private void mouse(final TMouseEvent mouse) { /* System.err.printf("mouse(): protocol %s encoding %s mouse %s\n", @@ -1643,7 +1682,7 @@ public class ECMA48 implements Runnable { * * @param keypress keypress received from the local user */ - public void keypress(final TKeypress keypress) { + private void keypress(final TKeypress keypress) { writeRemote(keypressToString(keypress)); } @@ -3419,8 +3458,7 @@ public class ECMA48 implements Runnable { * DECALN - Screen alignment display. */ private void decaln() { - Cell newCell = new Cell(); - newCell.setChar('E'); + Cell newCell = new Cell('E'); for (DisplayLine line: display) { for (int i = 0; i < line.length(); i++) { line.replace(i, newCell); @@ -6870,8 +6908,7 @@ public class ECMA48 implements Runnable { lastTextHeight = textHeight; } - Cell cell = new Cell(ch); - cell.setAttr(currentState.attr); + Cell cell = new Cell(ch, currentState.attr); BufferedImage image = glyphMaker.getImage(cell, textWidth * 2, textHeight); BufferedImage leftImage = image.getSubimage(0, 0, textWidth, @@ -6879,14 +6916,12 @@ public class ECMA48 implements Runnable { BufferedImage rightImage = image.getSubimage(textWidth, 0, textWidth, textHeight); - Cell left = new Cell(); - left.setTo(cell); + Cell left = new Cell(cell); left.setImage(leftImage); left.setWidth(Cell.Width.LEFT); display.get(leftY).replace(leftX, left); - Cell right = new Cell(); - right.setTo(cell); + Cell right = new Cell(cell); right.setImage(rightImage); right.setWidth(Cell.Width.RIGHT); display.get(rightY).replace(rightX, right);