summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Wright <michaelwr@google.com>2013-02-25 11:22:30 -0800
committerMichael Wright <michaelwr@google.com>2013-02-25 11:33:01 -0800
commit007efde8867b52cd5f3648173adb1a12069b6e0d (patch)
tree52507eb03993d605167ce347a0b6d81a3d69561b
parentd654ac68397e98a3476e92a32ee9a5ed07c1f18b (diff)
downloadandroid_packages_apps_Terminal-007efde8867b52cd5f3648173adb1a12069b6e0d.tar.gz
android_packages_apps_Terminal-007efde8867b52cd5f3648173adb1a12069b6e0d.tar.bz2
android_packages_apps_Terminal-007efde8867b52cd5f3648173adb1a12069b6e0d.zip
Add jni hooks for key dispatching
Change-Id: I51b32fa8635c54418bea73ad7a1fa0c8213cfd32
-rw-r--r--jni/com_android_terminal_Terminal.cpp41
-rw-r--r--src/com/android/terminal/Terminal.java12
2 files changed, 51 insertions, 2 deletions
diff --git a/jni/com_android_terminal_Terminal.cpp b/jni/com_android_terminal_Terminal.cpp
index c84f323..313e631 100644
--- a/jni/com_android_terminal_Terminal.cpp
+++ b/jni/com_android_terminal_Terminal.cpp
@@ -87,6 +87,10 @@ public:
size_t write(const char *bytes, size_t len);
+ int dispatchCharacter(int mod, int character);
+ int dispatchKey(int mod, int key);
+ void flushInput();
+
int flushDamage();
int resize(short unsigned int rows, short unsigned int cols);
@@ -286,8 +290,6 @@ Terminal::~Terminal() {
}
int Terminal::run() {
- /* None of the docs about termios explain how to construct a new one of
- * these, so this is largely a guess */
struct termios termios = {
.c_iflag = ICRNL|IXON|IUTF8,
.c_oflag = OPOST|ONLCR|NL0|CR0|TAB0|BS0|VT0|FF0,
@@ -385,6 +387,27 @@ size_t Terminal::write(const char *bytes, size_t len) {
return ::write(mMasterFd, bytes, len);
}
+int Terminal::dispatchCharacter(int mod, int character) {
+ vterm_input_push_char(mVt, static_cast<VTermModifier>((int)mod), character);
+ flushInput();
+ return 0;
+}
+
+int Terminal::dispatchKey(int mod, int key) {
+ vterm_input_push_key(mVt, static_cast<VTermModifier>(mod), static_cast<VTermKey>(key));
+ flushInput();
+ return 0;
+}
+
+void Terminal::flushInput() {
+ size_t len = vterm_output_get_buffer_current(mVt);
+ if (len) {
+ char buf[len];
+ len = vterm_output_bufferread(mVt, buf, len);
+ write(buf, len);
+ }
+}
+
int Terminal::flushDamage() {
vterm_screen_flush_damage(mVts);
return 0;
@@ -536,6 +559,18 @@ static jint com_android_terminal_Terminal_nativeGetCols(JNIEnv* env, jclass claz
return term->getCols();
}
+static jint com_android_terminal_Terminal_nativeDispatchCharacter(JNIEnv *env, jclass clazz,
+ jint ptr, jint mod, jint c) {
+ Terminal* term = reinterpret_cast<Terminal*>(ptr);
+ return term->dispatchCharacter(mod, c);
+}
+
+static jint com_android_terminal_Terminal_nativeDispatchKey(JNIEnv *env, jclass clazz, jint ptr,
+ jint mod, jint c) {
+ Terminal* term = reinterpret_cast<Terminal*>(ptr);
+ return term->dispatchKey(mod, c);
+}
+
static JNINativeMethod gMethods[] = {
{ "nativeInit", "(Lcom/android/terminal/TerminalCallbacks;II)I", (void*)com_android_terminal_Terminal_nativeInit },
{ "nativeRun", "(I)I", (void*)com_android_terminal_Terminal_nativeRun },
@@ -545,6 +580,8 @@ static JNINativeMethod gMethods[] = {
{ "nativeGetCellRun", "(IIILcom/android/terminal/Terminal$CellRun;)I", (void*)com_android_terminal_Terminal_nativeGetCellRun },
{ "nativeGetRows", "(I)I", (void*)com_android_terminal_Terminal_nativeGetRows },
{ "nativeGetCols", "(I)I", (void*)com_android_terminal_Terminal_nativeGetCols },
+ { "nativeDispatchCharacter", "(III)I", (void*)com_android_terminal_Terminal_nativeDispatchCharacter},
+ { "nativeDispatchKey", "(III)I", (void*)com_android_terminal_Terminal_nativeDispatchKey },
};
int register_com_android_terminal_Terminal(JNIEnv* env) {
diff --git a/src/com/android/terminal/Terminal.java b/src/com/android/terminal/Terminal.java
index c9e45e7..5d1e6d6 100644
--- a/src/com/android/terminal/Terminal.java
+++ b/src/com/android/terminal/Terminal.java
@@ -151,6 +151,15 @@ public class Terminal {
return mTitle;
}
+ public boolean dispatchKey(int modifiers, int key) {
+ return nativeDispatchKey(mNativePtr, modifiers, key) == 0;
+ }
+
+ public boolean dispatchCharacter(int modifiers, int character) {
+ return nativeDispatchCharacter(mNativePtr, modifiers, character) == 0;
+ }
+
+
private static native int nativeInit(TerminalCallbacks callbacks, int rows, int cols);
private static native int nativeRun(int ptr);
private static native int nativeStop(int ptr);
@@ -160,4 +169,7 @@ public class Terminal {
private static native int nativeGetCellRun(int ptr, int row, int col, CellRun run);
private static native int nativeGetRows(int ptr);
private static native int nativeGetCols(int ptr);
+
+ private static native int nativeDispatchKey(int ptr, int modifiers, int key);
+ private static native int nativeDispatchCharacter(int ptr, int modifiers, int character);
}