summaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
authorMihail Zenkov <mihail.zenkov@gmail.com>2013-10-01 20:02:24 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2013-10-02 20:47:19 +0200
commit62ab938965f2673e029ae2e2a4244788e673bd70 (patch)
tree3bf4d187f7ac6614ac009c73edba192abc16464c /st.c
parent2b1bc8087f232a7b0ba4c7233e76be7abae25a88 (diff)
Fix save/restore cursor
st was assuming that save/restore cursor position was independent of the screen that was shown in each moment, but it is not true, because each screen has a different save/restore buffer. This patch fixes it.
Diffstat (limited to 'st.c')
-rw-r--r--st.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/st.c b/st.c
index 05e285c..12fcc90 100644
--- a/st.c
+++ b/st.c
@@ -1342,13 +1342,14 @@ tfulldirt(void) {
void
tcursor(int mode) {
- static TCursor c;
+ static TCursor c[2];
+ bool alt = IS_SET(MODE_ALTSCREEN);
if(mode == CURSOR_SAVE) {
- c = term.c;
+ c[alt] = term.c;
} else if(mode == CURSOR_LOAD) {
- term.c = c;
- tmoveto(c.x, c.y);
+ term.c = c[alt];
+ tmoveto(c[alt].x, c[alt].y);
}
}
@@ -1854,12 +1855,12 @@ tsetmode(bool priv, bool set, int *args, int narg) {
case 1034:
MODBIT(term.mode, set, MODE_8BIT);
break;
- case 1049: /* = 1047 and 1048 */
- case 47:
+ case 1049: /* swap screen & set/restore cursor as xterm */
+ tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
+ case 47: /* swap screen */
case 1047:
if (!allowaltscreen)
break;
-
alt = IS_SET(MODE_ALTSCREEN);
if(alt) {
tclearregion(0, 0, term.col-1,