diff options
author | Danny Baumann <dannybaumann@web.de> | 2015-01-14 14:15:34 +0100 |
---|---|---|
committer | Danny Baumann <dannybaumann@web.de> | 2015-01-14 14:16:58 +0100 |
commit | df1166f61ee1b4bb157ac3692b35253d4781371c (patch) | |
tree | bbe09f2dfff5c2725c3196334dad479b8f0158e5 | |
parent | 9a76b2106d1e00cdea5fd8899a9849c2e58a91d0 (diff) | |
download | android_packages_apps_Terminal-df1166f61ee1b4bb157ac3692b35253d4781371c.tar.gz android_packages_apps_Terminal-df1166f61ee1b4bb157ac3692b35253d4781371c.tar.bz2 android_packages_apps_Terminal-df1166f61ee1b4bb157ac3692b35253d4781371c.zip |
Properly clear background when changing colors.
Change-Id: Iaab48ac635a8fe089852178813421aa0b570cf87
-rw-r--r-- | jni/com_android_terminal_Terminal.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/jni/com_android_terminal_Terminal.cpp b/jni/com_android_terminal_Terminal.cpp index 53c0417..cbec14a 100644 --- a/jni/com_android_terminal_Terminal.cpp +++ b/jni/com_android_terminal_Terminal.cpp @@ -125,6 +125,7 @@ public: status_t onPushline(dimen_t cols, const VTermScreenCell* cells); status_t onPopline(dimen_t cols, VTermScreenCell* cells); + int onCursorChange(const VTermPos& oldPos, const VTermPos& newPos, bool visible); bool getCellLocked(VTermPos pos, VTermScreenCell* cell); @@ -148,6 +149,7 @@ private: dimen_t mRows; dimen_t mCols; bool mKilled; + bool mCursorVisible; ScrollbackLine **mScroll; dimen_t mScrollCur; @@ -188,9 +190,7 @@ static int term_movecursor(VTermPos pos, VTermPos oldpos, int visible, void *use ALOGW("term_movecursor"); #endif - JNIEnv* env = AndroidRuntime::getJNIEnv(); - return env->CallIntMethod(term->getCallbacks(), moveCursorMethod, pos.row, - pos.col, oldpos.row, oldpos.col, visible); + return term->onCursorChange(oldpos, pos, visible != 0); } static int term_settermprop(VTermProp prop, VTermValue *val, void *user) { @@ -267,9 +267,13 @@ static VTermScreenCallbacks cb = { .sb_popline = term_sb_popline, }; +static inline int toArgb(const VTermColor& color) { + return (0xff << 24 | color.red << 16 | color.green << 8 | color.blue); +} + Terminal::Terminal(jobject callbacks) : mCallbacks(callbacks), mRows(25), mCols(80), mKilled(false), - mScrollCur(0), mScrollSize(100) { + mCursorVisible(true), mScrollCur(0), mScrollSize(100) { JNIEnv* env = AndroidRuntime::getJNIEnv(); mCallbacks = env->NewGlobalRef(callbacks); @@ -440,6 +444,10 @@ status_t Terminal::setColors(int fg, int bg) { ALOGD("setColors(0x%x, 0x%x)", fg, bg); VTermState* state = vterm_obtain_state(mVt); + VTermColor oldFgColor, oldBgColor; + vterm_state_get_default_colors(state, &oldFgColor, &oldBgColor); + + int changed = fg != toArgb(oldFgColor) || bg != toArgb(oldBgColor); VTermColor fg_color = { (uint8_t)((fg>>16)&0xff), (uint8_t)((fg>>8)&0xff), (uint8_t)(fg&0xff) }; @@ -447,11 +455,27 @@ status_t Terminal::setColors(int fg, int bg) { (uint8_t)((bg>>8)&0xff), (uint8_t)(bg&0xff) }; vterm_state_set_default_colors(state, &fg_color, &bg_color); - vterm_state_reset(state, 0); + + VTermPos oldPos, newPos; + vterm_state_get_cursorpos(state, &oldPos); + vterm_state_reset(state, changed); + vterm_state_get_cursorpos(state, &newPos); + + if (oldPos.row != newPos.row || oldPos.col != newPos.col) { + onCursorChange(oldPos, newPos, mCursorVisible); + } return 0; } +int Terminal::onCursorChange(const VTermPos& oldPos, const VTermPos& newPos, bool visible) { + mCursorVisible = visible; + + JNIEnv* env = AndroidRuntime::getJNIEnv(); + return env->CallIntMethod(getCallbacks(), moveCursorMethod, newPos.row, + newPos.col, oldPos.row, oldPos.col, visible); +} + status_t Terminal::onPushline(dimen_t cols, const VTermScreenCell* cells) { ScrollbackLine* line = NULL; if (mScrollCur == mScrollSize) { @@ -597,10 +621,6 @@ static jint com_android_terminal_Terminal_nativeSetColors(JNIEnv* env, return term->setColors(fg, bg); } -static inline int toArgb(const VTermColor& color) { - return (0xff << 24 | color.red << 16 | color.green << 8 | color.blue); -} - static inline bool isCellStyleEqual(const VTermScreenCell& a, const VTermScreenCell& b) { if (toArgb(a.fg) != toArgb(b.fg)) return false; if (toArgb(a.bg) != toArgb(b.bg)) return false; |