summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2013-02-18 23:31:29 -0800
committerJeff Sharkey <jsharkey@android.com>2013-02-19 19:52:30 -0800
commit8c040334130cea6e44dda03516d86e774d18d376 (patch)
treebc7ef7df505ac6b3d88e7037db2fd0899fd0c1af
parentef946f3ae80556ab221265c0bf1c560683ea27f6 (diff)
downloadandroid_packages_apps_Terminal-8c040334130cea6e44dda03516d86e774d18d376.tar.gz
android_packages_apps_Terminal-8c040334130cea6e44dda03516d86e774d18d376.tar.bz2
android_packages_apps_Terminal-8c040334130cea6e44dda03516d86e774d18d376.zip
Add callbacks
Change-Id: I0702f4ce4be69f86995956f98a0da52f47026f90
-rw-r--r--jni/Android.mk3
-rw-r--r--jni/com_android_terminal_Terminal.cpp194
-rw-r--r--src/com/android/terminal/Terminal.java8
-rw-r--r--src/com/android/terminal/TerminalCallbacks.java62
4 files changed, 232 insertions, 35 deletions
diff --git a/jni/Android.mk b/jni/Android.mk
index 0563efc..3c8e5f3 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -7,7 +7,8 @@ LOCAL_SRC_FILES := \
com_android_terminal_Terminal.cpp
LOCAL_C_INCLUDES += \
- external/libvterm/include
+ external/libvterm/include \
+ libcore/include
LOCAL_SHARED_LIBRARIES := \
libutils \
diff --git a/jni/com_android_terminal_Terminal.cpp b/jni/com_android_terminal_Terminal.cpp
index ed84619..a574630 100644
--- a/jni/com_android_terminal_Terminal.cpp
+++ b/jni/com_android_terminal_Terminal.cpp
@@ -19,6 +19,7 @@
#include <utils/Log.h>
#include "jni.h"
#include "JNIHelp.h"
+#include <ScopedLocalRef.h>
#include <vterm.h>
@@ -26,7 +27,62 @@
namespace android {
-class Terminal;
+/*
+ * JavaVM reference
+ */
+static JavaVM* gJavaVM;
+
+/*
+ * Callback class reference
+ */
+static jclass terminalCallbacksClass;
+
+/*
+ * Callback methods
+ */
+static jmethodID damageMethod;
+static jmethodID prescrollMethod;
+static jmethodID moveRectMethod;
+static jmethodID moveCursorMethod;
+static jmethodID setTermPropBooleanMethod;
+static jmethodID setTermPropIntMethod;
+static jmethodID setTermPropStringMethod;
+static jmethodID setTermPropColorMethod;
+static jmethodID bellMethod;
+static jmethodID resizeMethod;
+
+
+/*
+ * Terminal session
+ */
+
+class Terminal {
+public:
+ Terminal(jobject callbacks, int rows, int cols);
+ ~Terminal();
+
+ int getRows() const;
+
+ jobject getCallbacks() const;
+
+private:
+ VTerm *mVt;
+ VTermScreen *mVts;
+
+ jobject mCallbacks;
+ int mRows;
+ int mCols;
+};
+
+static JNIEnv* getEnv() {
+ JNIEnv* env;
+
+ if (gJavaVM->AttachCurrentThread(&env, NULL) < 0) {
+ return NULL;
+ }
+
+ return env;
+}
/*
* VTerm event handlers
@@ -35,31 +91,82 @@ class Terminal;
static int term_damage(VTermRect rect, void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_damage");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_damage: couldn't get JNIEnv");
+ return 0;
+ }
+
+ return env->CallIntMethod(term->getCallbacks(), damageMethod, rect.start_row, rect.end_row,
+ rect.start_col, rect.end_col);
}
static int term_prescroll(VTermRect rect, void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_prescroll");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_prescroll: couldn't get JNIEnv");
+ return 0;
+ }
+
+ return env->CallIntMethod(term->getCallbacks(), prescrollMethod);
}
static int term_moverect(VTermRect dest, VTermRect src, void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_moverect");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_moverect: couldn't get JNIEnv");
+ return 0;
+ }
+
+ return env->CallIntMethod(term->getCallbacks(), moveRectMethod);
}
static int term_movecursor(VTermPos pos, VTermPos oldpos, int visible, void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_movecursor");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_movecursor: couldn't get JNIEnv");
+ return 0;
+ }
+
+ return env->CallIntMethod(term->getCallbacks(), moveCursorMethod);
}
static int term_settermprop(VTermProp prop, VTermValue *val, void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_settermprop");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_settermprop: couldn't get JNIEnv");
+ return 0;
+ }
+
+ switch (vterm_get_prop_type(prop)) {
+ case VTERM_VALUETYPE_BOOL:
+ return env->CallIntMethod(term->getCallbacks(), setTermPropBooleanMethod,
+ static_cast<jboolean>(val->boolean));
+ case VTERM_VALUETYPE_INT:
+ return env->CallIntMethod(term->getCallbacks(), setTermPropIntMethod, prop, val->number);
+ case VTERM_VALUETYPE_STRING:
+ return env->CallIntMethod(term->getCallbacks(), setTermPropStringMethod, prop,
+ env->NewStringUTF(val->string));
+ case VTERM_VALUETYPE_COLOR:
+ return env->CallIntMethod(term->getCallbacks(), setTermPropIntMethod, prop, val->color.red,
+ val->color.green, val->color.blue);
+ default:
+ ALOGE("unknown callback type");
+ return 0;
+ }
}
static int term_setmousefunc(VTermMouseFunc func, void *data, void *user) {
@@ -71,13 +178,27 @@ static int term_setmousefunc(VTermMouseFunc func, void *data, void *user) {
static int term_bell(void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_bell");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_bell: couldn't get JNIEnv");
+ return 0;
+ }
+
+ return env->CallIntMethod(term->getCallbacks(), bellMethod);
}
static int term_resize(int rows, int cols, void *user) {
Terminal* term = reinterpret_cast<Terminal*>(user);
ALOGW("term_resize");
- return 1;
+
+ JNIEnv* env = getEnv();
+ if (env == NULL) {
+ ALOGE("term_bell: couldn't get JNIEnv");
+ return 0;
+ }
+
+ return env->CallIntMethod(term->getCallbacks(), resizeMethod);
}
static VTermScreenCallbacks cb = {
@@ -91,26 +212,8 @@ static VTermScreenCallbacks cb = {
.resize = term_resize,
};
-/*
- * Terminal session
- */
-
-class Terminal {
-public:
- Terminal(int rows, int cols);
- ~Terminal();
-
- int getRows();
-
-private:
- VTerm *mVt;
- VTermScreen *mVts;
-
- int mRows;
- int mCols;
-};
-
-Terminal::Terminal(int rows, int cols) : mRows(rows), mCols(cols) {
+Terminal::Terminal(jobject callbacks, int rows, int cols) :
+ mCallbacks(callbacks), mRows(rows), mCols(cols) {
// pt->writefn = NULL;
// pt->resizedfn = NULL;
@@ -131,17 +234,21 @@ Terminal::~Terminal() {
vterm_free(mVt);
}
-int Terminal::getRows() {
+int Terminal::getRows() const {
return mRows;
}
+jobject Terminal::getCallbacks() const {
+ return mCallbacks;
+}
+
/*
* JNI glue
*/
-static jint com_android_terminal_Terminal_nativeInit(JNIEnv* env, jclass clazz,
+static jint com_android_terminal_Terminal_nativeInit(JNIEnv* env, jclass clazz, jobject callbacks,
jint rows, jint cols) {
- return reinterpret_cast<jint>(new Terminal(rows, cols));
+ return reinterpret_cast<jint>(new Terminal(env->NewGlobalRef(callbacks), rows, cols));
}
static jint com_android_terminal_Terminal_nativeGetRows(JNIEnv* env, jclass clazz, jint ptr) {
@@ -150,11 +257,34 @@ static jint com_android_terminal_Terminal_nativeGetRows(JNIEnv* env, jclass claz
}
static JNINativeMethod gMethods[] = {
- { "nativeInit", "(II)I", (void*)com_android_terminal_Terminal_nativeInit },
+ { "nativeInit", "(Lcom/android/terminal/TerminalCallbacks;II)I", (void*)com_android_terminal_Terminal_nativeInit },
{ "nativeGetRows", "(I)I", (void*)com_android_terminal_Terminal_nativeGetRows },
};
int register_com_android_terminal_Terminal(JNIEnv* env) {
+ ScopedLocalRef<jclass> localClass(env,
+ env->FindClass("com/android/terminal/TerminalCallbacks"));
+
+ android::terminalCallbacksClass = reinterpret_cast<jclass>(env->NewGlobalRef(localClass.get()));
+
+ android::damageMethod = env->GetMethodID(terminalCallbacksClass, "damage", "(IIII)I");
+ android::prescrollMethod = env->GetMethodID(terminalCallbacksClass, "prescroll", "(IIII)I");
+ android::moveRectMethod = env->GetMethodID(terminalCallbacksClass, "moveRect", "(IIIIIIII)I");
+ android::moveCursorMethod = env->GetMethodID(terminalCallbacksClass, "moveCursor",
+ "(IIIIIIIII)I");
+ android::setTermPropBooleanMethod = env->GetMethodID(terminalCallbacksClass,
+ "setTermPropBoolean", "(IZ)I");
+ android::setTermPropIntMethod = env->GetMethodID(terminalCallbacksClass, "setTermPropInt",
+ "(II)I");
+ android::setTermPropStringMethod = env->GetMethodID(terminalCallbacksClass, "setTermPropString",
+ "(ILjava/lang/String;)I");
+ android::setTermPropColorMethod = env->GetMethodID(terminalCallbacksClass, "setTermPropColor",
+ "(IIII)I");
+ android::bellMethod = env->GetMethodID(terminalCallbacksClass, "bell", "()I");
+ android::resizeMethod = env->GetMethodID(terminalCallbacksClass, "resize", "(II)I");
+
+ env->GetJavaVM(&gJavaVM);
+
return jniRegisterNativeMethods(env, "com/android/terminal/Terminal",
gMethods, NELEM(gMethods));
}
diff --git a/src/com/android/terminal/Terminal.java b/src/com/android/terminal/Terminal.java
index 8b1809c..067d560 100644
--- a/src/com/android/terminal/Terminal.java
+++ b/src/com/android/terminal/Terminal.java
@@ -17,6 +17,8 @@
package com.android.terminal;
public class Terminal {
+ private TerminalCallbacks mCallbacks;
+
static {
System.loadLibrary("jni_terminal");
}
@@ -24,13 +26,15 @@ public class Terminal {
private final int mNativePtr;
public Terminal() {
- mNativePtr = nativeInit(25, 80);
+ mCallbacks = new TerminalCallbacks() {
+ };
+ mNativePtr = nativeInit(mCallbacks, 25, 80);
}
public int getRows() {
return nativeGetRows(mNativePtr);
}
- private static native int nativeInit(int rows, int cols);
+ private static native int nativeInit(TerminalCallbacks callbacks, int rows, int cols);
private static native int nativeGetRows(int ptr);
}
diff --git a/src/com/android/terminal/TerminalCallbacks.java b/src/com/android/terminal/TerminalCallbacks.java
new file mode 100644
index 0000000..cafaec0
--- /dev/null
+++ b/src/com/android/terminal/TerminalCallbacks.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.terminal;
+
+public abstract class TerminalCallbacks {
+ public int damage(int start_row, int end_row, int start_col, int end_col) {
+ return 1;
+ }
+
+ public int prescroll(int start_row, int end_row, int start_col, int end_col) {
+ return 1;
+ }
+
+ public int moveRect(int dest_start_row, int dest_end_row, int dest_start_col, int dest_end_col,
+ int src_start_row, int src_end_row, int src_start_col, int src_end_col) {
+ return 1;
+ }
+
+ public int moveCursor(int dest_start_row, int dest_end_row, int dest_start_col,
+ int dest_end_col, int src_start_row, int src_end_row, int src_start_col,
+ int src_end_col, int visible) {
+ return 1;
+ }
+
+ public int setTermPropBoolean(int prop, boolean value) {
+ return 1;
+ }
+
+ public int setTermPropInt(int prop, int value) {
+ return 1;
+ }
+
+ public int setTermPropString(int prop, String value) {
+ return 1;
+ }
+
+ public int setTermPropColor(int prop, int red, int green, int blue) {
+ return 1;
+ }
+
+ public int bell() {
+ return 1;
+ }
+
+ public int resize(int rows, int cols) {
+ return 1;
+ }
+}