Skip to content

Instantly share code, notes, and snippets.

@dividuum
Created July 17, 2011 14:54
Show Gist options
  • Save dividuum/1087663 to your computer and use it in GitHub Desktop.
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)
/**
* 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