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(-)master
parent
5d39afc902
commit
950ff21e17
12
st.c
12
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;
|
||||
|
||||
|
|
Reference in New Issue