summaryrefslogtreecommitdiffstats
path: root/jni
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-02-19 23:10:46 -0800
committerJeff Sharkey <jsharkey@android.com>2013-02-19 23:11:58 -0800
commit410e0da343fd581f3112037deb475db9fb0da850 (patch)
treeb5abeb9de4fb1818c26b2be19aa842e65576d789 /jni
parent5d4b3955da5952d8ec2cb45e3aa5406294560798 (diff)
downloadandroid_packages_apps_Terminal-410e0da343fd581f3112037deb475db9fb0da850.tar.gz
android_packages_apps_Terminal-410e0da343fd581f3112037deb475db9fb0da850.tar.bz2
android_packages_apps_Terminal-410e0da343fd581f3112037deb475db9fb0da850.zip
TerminalView to draw session contents.
View sets terminal dimensions to match screen, and handles any draw requests for dirty regions. damage() calls from below are translated into normal View invalidates. For now makes separate getCell() calls for each cell while drawing across screen. This currently costs about 130ms for a 38x59 shell. Change-Id: I2d106a8aeb18e9d6993f30cfb02438e85ee63c65
Diffstat (limited to 'jni')
-rw-r--r--jni/com_android_terminal_Terminal.cpp70
1 files changed, 63 insertions, 7 deletions
diff --git a/jni/com_android_terminal_Terminal.cpp b/jni/com_android_terminal_Terminal.cpp
index 106b7d6..6867d34 100644
--- a/jni/com_android_terminal_Terminal.cpp
+++ b/jni/com_android_terminal_Terminal.cpp
@@ -58,6 +58,12 @@ static jmethodID setTermPropColorMethod;
static jmethodID bellMethod;
static jmethodID resizeMethod;
+/*
+ * Cell class
+ */
+static jclass cellClass;
+static jfieldID cellCharsField;
+
/*
* Terminal session
@@ -69,9 +75,12 @@ public:
~Terminal();
size_t write(const char *bytes, size_t len);
- void resize(short unsigned int rows, short unsigned int cols);
+
+ int resize(short unsigned int rows, short unsigned int cols);
+ int getCell(VTermPos pos, VTermScreenCell* cell);
int getRows() const;
+ int getCols() const;
jobject getCallbacks() const;
@@ -80,10 +89,9 @@ private:
VTerm *mVt;
VTermScreen *mVts;
+ jobject mCallbacks;
short unsigned int mRows;
short unsigned int mCols;
-
- jobject mCallbacks;
};
static JNIEnv* getEnv() {
@@ -297,17 +305,27 @@ size_t Terminal::write(const char *bytes, size_t len) {
return ::write(mMasterFd, bytes, len);
}
-void Terminal::resize(short unsigned int rows, short unsigned int cols) {
+int Terminal::resize(short unsigned int rows, short unsigned int cols) {
+ ALOGD("resize(%d, %d)", rows, cols);
mRows = rows;
mCols = cols;
struct winsize size = { rows, cols, 0, 0 };
ioctl(mMasterFd, TIOCSWINSZ, &size);
+ return 0;
+}
+
+int Terminal::getCell(VTermPos pos, VTermScreenCell* cell) {
+ return vterm_screen_get_cell(mVts, pos, cell);
}
int Terminal::getRows() const {
return mRows;
}
+int Terminal::getCols() const {
+ return mCols;
+}
+
jobject Terminal::getCallbacks() const {
return mCallbacks;
}
@@ -328,10 +346,36 @@ static void com_android_terminal_Terminal_nativeWrite(JNIEnv* env,
term->write(NULL, 0);
}
-static void com_android_terminal_Terminal_nativeResize(JNIEnv* env,
+static jint com_android_terminal_Terminal_nativeResize(JNIEnv* env,
jclass clazz, jint ptr, jint rows, jint cols) {
Terminal* term = reinterpret_cast<Terminal*>(ptr);
- term->resize(rows, cols);
+ return term->resize(rows, cols);
+}
+
+static jint com_android_terminal_Terminal_nativeGetCell(JNIEnv* env,
+ jclass clazz, jint ptr, jint row, jint col, jobject cell) {
+ //ALOGD("getCell(%d, %d)", row, col);
+ Terminal* term = reinterpret_cast<Terminal*>(ptr);
+
+ VTermPos pos = {
+ .row = row,
+ .col = col,
+ };
+
+ VTermScreenCell termCell;
+ memset(&termCell, 0, sizeof(VTermScreenCell));
+ int res = term->getCell(pos, &termCell);
+
+ // TODO: support full UTF-32 characters
+ // for testing, 0x00020000 should become 0xD840 0xDC00
+
+ jintArray charsArray = (jintArray)env->GetObjectField(cell, cellCharsField);
+ jint *chars = env->GetIntArrayElements(charsArray, 0);
+ chars[0] = '$';
+ chars[1] = 0x00;
+ env->ReleaseIntArrayElements(charsArray, chars, 0);
+
+ return 0;
}
static jint com_android_terminal_Terminal_nativeGetRows(JNIEnv* env, jclass clazz, jint ptr) {
@@ -339,10 +383,17 @@ static jint com_android_terminal_Terminal_nativeGetRows(JNIEnv* env, jclass claz
return term->getRows();
}
+static jint com_android_terminal_Terminal_nativeGetCols(JNIEnv* env, jclass clazz, jint ptr) {
+ Terminal* term = reinterpret_cast<Terminal*>(ptr);
+ return term->getCols();
+}
+
static JNINativeMethod gMethods[] = {
{ "nativeInit", "(Lcom/android/terminal/TerminalCallbacks;II)I", (void*)com_android_terminal_Terminal_nativeInit },
- { "nativeResize", "(III)", (void*)com_android_terminal_Terminal_nativeResize },
+ { "nativeResize", "(III)I", (void*)com_android_terminal_Terminal_nativeResize },
+ { "nativeGetCell", "(IIILcom/android/terminal/Terminal$Cell;)I", (void*)com_android_terminal_Terminal_nativeGetCell },
{ "nativeGetRows", "(I)I", (void*)com_android_terminal_Terminal_nativeGetRows },
+ { "nativeGetCols", "(I)I", (void*)com_android_terminal_Terminal_nativeGetCols },
};
int register_com_android_terminal_Terminal(JNIEnv* env) {
@@ -367,6 +418,11 @@ int register_com_android_terminal_Terminal(JNIEnv* env) {
android::bellMethod = env->GetMethodID(terminalCallbacksClass, "bell", "()I");
android::resizeMethod = env->GetMethodID(terminalCallbacksClass, "resize", "(II)I");
+ ScopedLocalRef<jclass> cellLocal(env,
+ env->FindClass("com/android/terminal/Terminal$Cell"));
+ cellClass = reinterpret_cast<jclass>(env->NewGlobalRef(cellLocal.get()));
+ cellCharsField = env->GetFieldID(cellClass, "chars", "[C");
+
env->GetJavaVM(&gJavaVM);
return jniRegisterNativeMethods(env, "com/android/terminal/Terminal",