diff options
author | Jeff Sharkey <jsharkey@android.com> | 2013-02-19 23:10:46 -0800 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2013-02-19 23:11:58 -0800 |
commit | 410e0da343fd581f3112037deb475db9fb0da850 (patch) | |
tree | b5abeb9de4fb1818c26b2be19aa842e65576d789 /jni | |
parent | 5d4b3955da5952d8ec2cb45e3aa5406294560798 (diff) | |
download | android_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.cpp | 70 |
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", |