summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2015-01-14 14:15:34 +0100
committerDanny Baumann <dannybaumann@web.de>2015-01-14 14:16:58 +0100
commitdf1166f61ee1b4bb157ac3692b35253d4781371c (patch)
treebbe09f2dfff5c2725c3196334dad479b8f0158e5
parent9a76b2106d1e00cdea5fd8899a9849c2e58a91d0 (diff)
downloadandroid_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.cpp38
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;