summaryrefslogtreecommitdiffstats
path: root/jni
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 /jni
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
Diffstat (limited to 'jni')
-rw-r--r--jni/com_android_terminal_Terminal.cpp41
1 files changed, 39 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) {