aboutsummaryrefslogtreecommitdiffstats
path: root/src/org
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2009-08-02 12:35:57 +0000
committerKenny Root <kenny@the-b.org>2009-08-02 12:35:57 +0000
commit4738e1afc28356df2100a145c6226732ccee365a (patch)
tree7b26db408f5961e6703cebc50711543ced1ddd8a /src/org
parent1afdbb9858fbc300261afc8187634ba15082acf3 (diff)
downloadconnectbot-4738e1afc28356df2100a145c6226732ccee365a.tar.gz
connectbot-4738e1afc28356df2100a145c6226732ccee365a.tar.bz2
connectbot-4738e1afc28356df2100a145c6226732ccee365a.zip
Support wide characters in drawing and emulation
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@381 df292f66-193f-0410-a5fc-6d59da041ff2
Diffstat (limited to 'src/org')
-rw-r--r--src/org/connectbot/TerminalView.java10
-rw-r--r--src/org/connectbot/service/Relay.java12
-rw-r--r--src/org/connectbot/service/TerminalBridge.java28
3 files changed, 44 insertions, 6 deletions
diff --git a/src/org/connectbot/TerminalView.java b/src/org/connectbot/TerminalView.java
index de74f7e..5eb7e24 100644
--- a/src/org/connectbot/TerminalView.java
+++ b/src/org/connectbot/TerminalView.java
@@ -36,6 +36,7 @@ import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.Toast;
+import de.mud.terminal.VDUBuffer;
/**
* User interface {@link View} for showing a TerminalBridge in an
@@ -148,6 +149,11 @@ public class TerminalView extends View implements FontSizeChangedListener {
// also draw cursor if visible
if(bridge.buffer.isCursorVisible()) {
+ int currentAttribute = bridge.buffer.getAttributes(
+ bridge.buffer.getCursorColumn(),
+ bridge.buffer.getCursorRow());
+ boolean onWideCharacter = (currentAttribute & VDUBuffer.FULLWIDTH) != 0;
+
int x = bridge.buffer.getCursorColumn() * bridge.charWidth;
int y = (bridge.buffer.getCursorRow()
+ bridge.buffer.screenBase - bridge.buffer.windowBase)
@@ -157,7 +163,9 @@ public class TerminalView extends View implements FontSizeChangedListener {
canvas.save();
canvas.translate(x, y);
- canvas.clipRect(0, 0, bridge.charWidth, bridge.charHeight);
+ canvas.clipRect(0, 0,
+ bridge.charWidth * (onWideCharacter ? 2 : 1),
+ bridge.charHeight);
canvas.drawPaint(cursorPaint);
// Make sure we scale our decorations to the correct size.
diff --git a/src/org/connectbot/service/Relay.java b/src/org/connectbot/service/Relay.java
index 746a915..22b8299 100644
--- a/src/org/connectbot/service/Relay.java
+++ b/src/org/connectbot/service/Relay.java
@@ -92,6 +92,9 @@ public class Relay implements Runnable {
byteBuffer = ByteBuffer.allocate(BUFFER_SIZE);
charBuffer = CharBuffer.allocate(BUFFER_SIZE);
+ float[] widths = new float[BUFFER_SIZE];
+ boolean[] fullwidths = new boolean[BUFFER_SIZE];
+
byteArray = byteBuffer.array();
charArray = charBuffer.array();
@@ -101,9 +104,11 @@ public class Relay implements Runnable {
byteBuffer.limit(0);
int bytesToRead;
int offset;
+ int charWidth;
try {
while (true) {
+ charWidth = bridge.charWidth;
bytesToRead = byteBuffer.capacity() - byteBuffer.limit();
offset = byteBuffer.arrayOffset() + byteBuffer.limit();
bytesRead = transport.read(byteArray, offset, bytesToRead);
@@ -122,7 +127,12 @@ public class Relay implements Runnable {
byteBuffer.position(0);
}
- buffer.putString(charArray, 0, charBuffer.position());
+ offset = charBuffer.position();
+ bridge.defaultPaint.getTextWidths(charArray, 0, offset, widths);
+ for (int i = 0; i < offset; i++)
+ fullwidths[i] = (int)widths[i] != charWidth;
+
+ buffer.putString(charArray, fullwidths, 0, charBuffer.position());
charBuffer.clear();
bridge.redraw();
}
diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java
index 500a821..5cb9613 100644
--- a/src/org/connectbot/service/TerminalBridge.java
+++ b/src/org/connectbot/service/TerminalBridge.java
@@ -80,7 +80,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener {
private AbsTransport transport;
- private final Paint defaultPaint;
+ final Paint defaultPaint;
private Relay relay;
@@ -1037,6 +1037,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener {
int fg, bg;
synchronized (buffer) {
boolean entireDirty = buffer.update[0] || fullRedraw;
+ boolean isWideCharacter = false;
// walk through all lines in the buffer
for(int l = 0; l < buffer.height; l++) {
@@ -1080,9 +1081,16 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener {
// set underlined attributes if requested
defaultPaint.setUnderlineText((currAttr & VDUBuffer.UNDERLINE) != 0);
- // determine the amount of continuous characters with the same settings and print them all at once
- while(c + addr < buffer.width && buffer.charAttributes[buffer.windowBase + l][c + addr] == currAttr) {
+ isWideCharacter = (currAttr & VDUBuffer.FULLWIDTH) != 0;
+
+ if (isWideCharacter)
addr++;
+ else {
+ // determine the amount of continuous characters with the same settings and print them all at once
+ while(c + addr < buffer.width
+ && buffer.charAttributes[buffer.windowBase + l][c + addr] == currAttr) {
+ addr++;
+ }
}
// Save the current clip region
@@ -1090,7 +1098,17 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener {
// clear this dirty area with background color
defaultPaint.setColor(bg);
- canvas.clipRect(c * charWidth, l * charHeight, (c + addr) * charWidth, (l + 1) * charHeight);
+ if (isWideCharacter) {
+ canvas.clipRect(c * charWidth,
+ l * charHeight,
+ (c + 2) * charWidth,
+ (l + 1) * charHeight);
+ } else {
+ canvas.clipRect(c * charWidth,
+ l * charHeight,
+ (c + addr) * charWidth,
+ (l + 1) * charHeight);
+ }
canvas.drawPaint(defaultPaint);
// write the text string starting at 'c' for 'addr' number of characters
@@ -1105,6 +1123,8 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener {
// advance to the next text block with different characteristics
c += addr - 1;
+ if (isWideCharacter)
+ c++;
}
}