From 007efde8867b52cd5f3648173adb1a12069b6e0d Mon Sep 17 00:00:00 2001 From: Michael Wright Date: Mon, 25 Feb 2013 11:22:30 -0800 Subject: Add jni hooks for key dispatching Change-Id: I51b32fa8635c54418bea73ad7a1fa0c8213cfd32 --- jni/com_android_terminal_Terminal.cpp | 41 ++++++++++++++++++++++++++++++++-- src/com/android/terminal/Terminal.java | 12 ++++++++++ 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((int)mod), character); + flushInput(); + return 0; +} + +int Terminal::dispatchKey(int mod, int key) { + vterm_input_push_key(mVt, static_cast(mod), static_cast(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(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(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); } -- cgit v1.2.3