commit 950ff21e17af487b205ea0b666be015790114fa7
parent 5d39afc9023bc9a692ba6faf590abf9397a890ae
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Thu, 8 Nov 2012 17:15:26 +0100
Fix bug restoring cursor position
Sequences like DECSC, DECRC, ESC [?1047l or ESC [?1047h save and restore
cursor attributes, than taken from vt100 manual are:
Save Cursor (DECSC) ESC 7
===========================
Saves the following in terminal memory.
- cursor position
- graphic rendition
- character set shift state
- state of wrap flag
- state of origin mode
Restore Cursor (DECRC) ESC 8
===========================
Restores the states described for (DECSC) above. If none of these
characteristics were saved, the cursor moves to home position; origin
mode is reset; no character attributes are assigned; and the default
character set mapping is established.
This implies that hide attribute of the cursor should not be saved/restored
in these sequences. The best way to fix this problem is moving hide
attribute into the terminal mode, instead of having it in the cursor state.
---
st.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
Diffstat:
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/st.c b/st.c
@@ -96,8 +96,7 @@ enum cursor_movement {
enum cursor_state {
CURSOR_DEFAULT = 0,
- CURSOR_HIDE = 1,
- CURSOR_WRAPNEXT = 2
+ CURSOR_WRAPNEXT = 1,
};
enum glyph_state {
@@ -115,7 +114,8 @@ enum term_mode {
MODE_MOUSEMOTION = 64,
MODE_MOUSE = 32|64,
MODE_REVERSE = 128,
- MODE_KBDLOCK = 256
+ MODE_KBDLOCK = 256,
+ MODE_HIDE = 512
};
enum escape_state {
@@ -1464,8 +1464,8 @@ tsetmode(bool priv, bool set, int *args, int narg) {
case 0: /* Error (IGNORED) */
case 12: /* att610 -- Start blinking cursor (IGNORED) */
break;
- case 25:
- MODBIT(term.c.state, !set, CURSOR_HIDE);
+ case 25: /* DECTCEM -- Text Cursor Enable Mode */
+ MODBIT(term.mode, !set, MODE_HIDE);
break;
case 1000: /* 1000,1002: enable xterm mouse report */
MODBIT(term.mode, set, MODE_MOUSEBTN);
@@ -2505,7 +2505,7 @@ xdrawcursor(void) {
}
/* draw the new one */
- if(!(term.c.state & CURSOR_HIDE)) {
+ if(!(IS_SET(MODE_HIDE))) {
if(!(xw.state & WIN_FOCUSED))
g.bg = defaultucs;