aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenny Root <kenny@the-b.org>2009-05-10 13:55:56 +0000
committerKenny Root <kenny@the-b.org>2009-05-10 13:55:56 +0000
commit865c0a83d30f6395143a0c07883cae12752fc911 (patch)
tree5f855a5a6c516375181f103df0cfd590cce5d434 /src
parent55c979c4d618746275da3307b599d2fcb1479743 (diff)
downloadconnectbot-865c0a83d30f6395143a0c07883cae12752fc911.tar.gz
connectbot-865c0a83d30f6395143a0c07883cae12752fc911.tar.bz2
connectbot-865c0a83d30f6395143a0c07883cae12752fc911.zip
Support soft keyboard even more (123+ALT keys)
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@229 df292f66-193f-0410-a5fc-6d59da041ff2
Diffstat (limited to 'src')
-rw-r--r--src/org/connectbot/service/TerminalBridge.java115
1 files changed, 64 insertions, 51 deletions
diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java
index ed1c132..04b0c99 100644
--- a/src/org/connectbot/service/TerminalBridge.java
+++ b/src/org/connectbot/service/TerminalBridge.java
@@ -850,24 +850,24 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
if ("Use right-side keys".equals(keymode)) {
if (keyCode == KeyEvent.KEYCODE_ALT_RIGHT
&& (metaState & META_SLASH) != 0) {
- metaState &= metaState ^ META_SLASH ^ META_TRANSIENT;
+ metaState &= ~(META_SLASH | META_TRANSIENT);
stdin.write('/');
return true;
} else if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT
&& (metaState & META_TAB) != 0) {
- metaState &= metaState ^ META_TAB ^ META_TRANSIENT;
+ metaState &= ~(META_TAB | META_TRANSIENT);
stdin.write(0x09);
return true;
}
} else if ("Use left-side keys".equals(keymode)) {
if (keyCode == KeyEvent.KEYCODE_ALT_LEFT
&& (metaState & META_SLASH) != 0) {
- metaState &= metaState ^ META_SLASH ^ META_TRANSIENT;
+ metaState &= ~(META_SLASH | META_TRANSIENT);
stdin.write('/');
return true;
} else if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
&& (metaState & META_TAB) != 0) {
- metaState &= metaState ^ META_TAB ^ META_TRANSIENT;
+ metaState &= ~(META_TAB | META_TRANSIENT);
stdin.write(0x09);
return true;
}
@@ -902,17 +902,17 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
if (printing) {
int curMetaState = event.getMetaState();
- metaState &= metaState ^ META_SLASH ^ META_TAB;
+ metaState &= ~(META_SLASH | META_TAB);
if ((metaState & META_SHIFT_MASK) != 0) {
curMetaState |= KeyEvent.META_SHIFT_ON;
- metaState &= metaState ^ META_SHIFT_ON;
+ metaState &= ~META_SHIFT_ON;
redraw();
}
if ((metaState & META_ALT_MASK) != 0) {
curMetaState |= KeyEvent.META_ALT_ON;
- metaState &= metaState ^ META_ALT_ON;
+ metaState &= ~META_ALT_ON;
redraw();
}
@@ -928,7 +928,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
else if (key == 0x20)
key = 0x00;
- metaState &= metaState ^ META_CTRL_ON;
+ metaState &= ~META_CTRL_ON;
redraw();
}
@@ -949,44 +949,57 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
}
}
- stdin.write(key);
+ if (key < 0x80)
+ stdin.write(key);
+ else
+ // TODO write encoding routine that doesn't allocate each time
+ stdin.write(new String(Character.toChars(key))
+ .getBytes(host.getEncoding()));
return true;
}
+ if (keyCode == KeyEvent.KEYCODE_UNKNOWN &&
+ event.getAction() == KeyEvent.ACTION_MULTIPLE) {
+ byte[] input = event.getCharacters().getBytes(host.getEncoding());
+ stdin.write(input);
+ }
+
// try handling keymode shortcuts
- if("Use right-side keys".equals(keymode)) {
- switch(keyCode) {
- case KeyEvent.KEYCODE_ALT_RIGHT:
- metaState |= META_SLASH;
- return true;
- case KeyEvent.KEYCODE_SHIFT_RIGHT:
- metaState |= META_TAB;
- return true;
- case KeyEvent.KEYCODE_SHIFT_LEFT:
- metaPress(META_SHIFT_ON);
- return true;
- case KeyEvent.KEYCODE_ALT_LEFT:
- metaPress(META_ALT_ON);
- return true;
- default:
- break;
- }
- } else if("Use left-side keys".equals(keymode)) {
- switch(keyCode) {
- case KeyEvent.KEYCODE_ALT_LEFT:
- metaState |= META_SLASH;
- return true;
- case KeyEvent.KEYCODE_SHIFT_LEFT:
- metaState |= META_TAB;
- return true;
- case KeyEvent.KEYCODE_SHIFT_RIGHT:
- metaPress(META_SHIFT_ON);
- return true;
- case KeyEvent.KEYCODE_ALT_RIGHT:
- metaPress(META_ALT_ON);
- return true;
- default:
- break;
+ if (event.getRepeatCount() == 0) {
+ if ("Use right-side keys".equals(keymode)) {
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_ALT_RIGHT:
+ metaState |= META_SLASH;
+ return true;
+ case KeyEvent.KEYCODE_SHIFT_RIGHT:
+ metaState |= META_TAB;
+ return true;
+ case KeyEvent.KEYCODE_SHIFT_LEFT:
+ metaPress(META_SHIFT_ON);
+ return true;
+ case KeyEvent.KEYCODE_ALT_LEFT:
+ metaPress(META_ALT_ON);
+ return true;
+ default:
+ break;
+ }
+ } else if ("Use left-side keys".equals(keymode)) {
+ switch(keyCode) {
+ case KeyEvent.KEYCODE_ALT_LEFT:
+ metaState |= META_SLASH;
+ return true;
+ case KeyEvent.KEYCODE_SHIFT_LEFT:
+ metaState |= META_TAB;
+ return true;
+ case KeyEvent.KEYCODE_SHIFT_RIGHT:
+ metaPress(META_SHIFT_ON);
+ return true;
+ case KeyEvent.KEYCODE_ALT_RIGHT:
+ metaPress(META_ALT_ON);
+ return true;
+ default:
+ break;
+ }
}
}
@@ -1013,11 +1026,11 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
case KeyEvent.KEYCODE_DEL:
((vt320) buffer).keyPressed(vt320.KEY_BACK_SPACE, ' ',
getStateForBuffer());
- metaState &= metaState ^ META_TRANSIENT;
+ metaState &= ~META_TRANSIENT;
return true;
case KeyEvent.KEYCODE_ENTER:
((vt320)buffer).keyTyped(vt320.KEY_ENTER, ' ', 0);
- metaState &= metaState ^ META_TRANSIENT;
+ metaState &= ~META_TRANSIENT;
return true;
case KeyEvent.KEYCODE_DPAD_LEFT:
@@ -1027,7 +1040,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
} else {
((vt320) buffer).keyPressed(vt320.KEY_LEFT, ' ',
getStateForBuffer());
- metaState &= metaState ^ META_TRANSIENT;
+ metaState &= ~META_TRANSIENT;
tryKeyVibrate();
}
return true;
@@ -1039,7 +1052,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
} else {
((vt320) buffer).keyPressed(vt320.KEY_UP, ' ',
getStateForBuffer());
- metaState &= metaState ^ META_TRANSIENT;
+ metaState &= ~META_TRANSIENT;
tryKeyVibrate();
}
return true;
@@ -1051,7 +1064,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
} else {
((vt320) buffer).keyPressed(vt320.KEY_DOWN, ' ',
getStateForBuffer());
- metaState &= metaState ^ META_TRANSIENT;
+ metaState &= ~META_TRANSIENT;
tryKeyVibrate();
}
return true;
@@ -1063,7 +1076,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
} else {
((vt320) buffer).keyPressed(vt320.KEY_RIGHT, ' ',
getStateForBuffer());
- metaState &= metaState ^ META_TRANSIENT;
+ metaState &= ~META_TRANSIENT;
tryKeyVibrate();
}
return true;
@@ -1089,7 +1102,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
} else {
if ((metaState & META_CTRL_ON) != 0) {
((vt320)buffer).keyTyped(vt320.KEY_ESCAPE, ' ', 0);
- metaState &= metaState ^ META_CTRL_ON;
+ metaState &= ~META_CTRL_ON;
} else
metaState |= META_CTRL_ON;
}
@@ -1127,9 +1140,9 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener, InteractiveCal
*/
private void metaPress(int code) {
if ((metaState & (code << 1)) != 0) {
- metaState &= metaState ^ (code << 1);
+ metaState &= ~(code << 1);
} else if ((metaState & code) != 0) {
- metaState &= metaState ^ code;
+ metaState &= ~code;
metaState |= code << 1;
} else
metaState |= code;