Created
July 17, 2011 14:54
-
-
Save dividuum/1087663 to your computer and use it in GitHub Desktop.
Cargo cult rewrite of onKey in ConnectBot for my bluetooth keyboard (GeneralKeys PX-2556)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Handle onKey() events coming down from a {@link TerminalView} above us. | |
* Modify the keys to make more sense to a host then pass it to the transport. | |
*/ | |
public boolean onKey(View v, int keyCode, KeyEvent event) { | |
try { | |
// Log.d(TAG, "KEY " + keyCode + " " + event.getAction() + " -> " + metaState); | |
if (bridge.isDisconnected() || bridge.transport == null) { | |
Log.d(TAG, "not connected"); | |
return false; | |
} | |
if (event.getAction() == KeyEvent.ACTION_UP) { | |
switch (keyCode) { | |
case 4: // Escape | |
((vt320)buffer).keyTyped(vt320.KEY_ESCAPE, ' ', 0); | |
return true; | |
case KeyEvent.KEYCODE_DEL: | |
((vt320) buffer).keyPressed(vt320.KEY_BACK_SPACE, ' ', | |
getStateForBuffer()); | |
return true; | |
case KeyEvent.KEYCODE_ENTER: | |
((vt320)buffer).keyTyped(vt320.KEY_ENTER, ' ', 0); | |
return true; | |
case KeyEvent.KEYCODE_TAB: | |
bridge.transport.write(0x09); | |
return true; | |
case 0: // Ctrl | |
metaState &= ~META_CTRL_ON; | |
bridge.redraw(); | |
return true; | |
case KeyEvent.KEYCODE_ALT_LEFT: | |
case KeyEvent.KEYCODE_ALT_RIGHT: | |
metaState &= ~META_ALT_ON; | |
bridge.redraw(); | |
return true; | |
case KeyEvent.KEYCODE_SHIFT_LEFT: | |
case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
metaState &= ~META_SHIFT_ON; | |
bridge.redraw(); | |
return true; | |
case KeyEvent.KEYCODE_VOLUME_UP: | |
bridge.increaseFontSize(); | |
return true; | |
case KeyEvent.KEYCODE_VOLUME_DOWN: | |
bridge.decreaseFontSize(); | |
return true; | |
// WTF? mixed up!? | |
case KeyEvent.KEYCODE_DPAD_LEFT: | |
((vt320) buffer).keyPressed(vt320.KEY_UP, ' ', | |
getStateForBuffer()); | |
return true; | |
case KeyEvent.KEYCODE_DPAD_RIGHT: | |
((vt320) buffer).keyPressed(vt320.KEY_DOWN, ' ', | |
getStateForBuffer()); | |
return true; | |
case KeyEvent.KEYCODE_DPAD_UP: | |
((vt320) buffer).keyPressed(vt320.KEY_RIGHT, ' ', | |
getStateForBuffer()); | |
return true; | |
case KeyEvent.KEYCODE_DPAD_DOWN: | |
((vt320) buffer).keyPressed(vt320.KEY_LEFT, ' ', | |
getStateForBuffer()); | |
return true; | |
default: | |
int curMetaState = event.getMetaState(); | |
// Log.d(TAG, "curMetaState: " + curMetaState); | |
if ((metaState & META_SHIFT_MASK) != 0) { | |
curMetaState |= KeyEvent.META_SHIFT_ON; | |
} | |
if ((metaState & META_ALT_MASK) != 0) { | |
curMetaState |= KeyEvent.META_ALT_ON; | |
} | |
if ((metaState & META_CTRL_MASK) != 0) { | |
curMetaState |= KeyEvent.META_CTRL_ON; | |
} | |
int key = event.getUnicodeChar(curMetaState); | |
if ((metaState & META_CTRL_MASK) != 0) { | |
key = keyAsControl(key); | |
} | |
if (key < 0x80) { | |
// Log.d(TAG, "< 0x80 case"); | |
bridge.transport.write(key); | |
} else { | |
// Log.d(TAG, "whut? >= 0x80 case"); | |
bridge.transport.write(new String(Character.toChars(key)) | |
.getBytes(encoding)); | |
} | |
return true; | |
} | |
} else { // Down | |
if (event.getRepeatCount() != 0) { | |
// Log.d(TAG, "ignoring repeated key"); | |
return false; | |
} | |
switch (keyCode) { | |
case 0: // Ctrl | |
metaState |= META_CTRL_ON; | |
bridge.redraw(); | |
return true; | |
case KeyEvent.KEYCODE_ALT_LEFT: | |
case KeyEvent.KEYCODE_ALT_RIGHT: | |
metaState |= META_ALT_ON; | |
bridge.redraw(); | |
return true; | |
case KeyEvent.KEYCODE_SHIFT_LEFT: | |
case KeyEvent.KEYCODE_SHIFT_RIGHT: | |
metaState |= META_SHIFT_ON; | |
bridge.redraw(); | |
return true; | |
} | |
} | |
return false; | |
} catch (IOException e) { | |
Log.e(TAG, "Problem while trying to handle an onKey() event", e); | |
try { | |
bridge.transport.flush(); | |
} catch (IOException ioe) { | |
Log.d(TAG, "Our transport was closed, dispatching disconnect event"); | |
bridge.dispatchDisconnect(false); | |
} | |
} catch (NullPointerException npe) { | |
Log.d(TAG, "Input before connection established ignored."); | |
return true; | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment