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(-)
This commit is contained in:
Roberto E. Vargas Caballero 2012-11-08 17:15:26 +01:00
parent 5d39afc902
commit 950ff21e17

12
st.c
View File

@ -96,8 +96,7 @@ enum cursor_movement {
enum cursor_state { enum cursor_state {
CURSOR_DEFAULT = 0, CURSOR_DEFAULT = 0,
CURSOR_HIDE = 1, CURSOR_WRAPNEXT = 1,
CURSOR_WRAPNEXT = 2
}; };
enum glyph_state { enum glyph_state {
@ -115,7 +114,8 @@ enum term_mode {
MODE_MOUSEMOTION = 64, MODE_MOUSEMOTION = 64,
MODE_MOUSE = 32|64, MODE_MOUSE = 32|64,
MODE_REVERSE = 128, MODE_REVERSE = 128,
MODE_KBDLOCK = 256 MODE_KBDLOCK = 256,
MODE_HIDE = 512
}; };
enum escape_state { enum escape_state {
@ -1464,8 +1464,8 @@ tsetmode(bool priv, bool set, int *args, int narg) {
case 0: /* Error (IGNORED) */ case 0: /* Error (IGNORED) */
case 12: /* att610 -- Start blinking cursor (IGNORED) */ case 12: /* att610 -- Start blinking cursor (IGNORED) */
break; break;
case 25: case 25: /* DECTCEM -- Text Cursor Enable Mode */
MODBIT(term.c.state, !set, CURSOR_HIDE); MODBIT(term.mode, !set, MODE_HIDE);
break; break;
case 1000: /* 1000,1002: enable xterm mouse report */ case 1000: /* 1000,1002: enable xterm mouse report */
MODBIT(term.mode, set, MODE_MOUSEBTN); MODBIT(term.mode, set, MODE_MOUSEBTN);
@ -2505,7 +2505,7 @@ xdrawcursor(void) {
} }
/* draw the new one */ /* draw the new one */
if(!(term.c.state & CURSOR_HIDE)) { if(!(IS_SET(MODE_HIDE))) {
if(!(xw.state & WIN_FOCUSED)) if(!(xw.state & WIN_FOCUSED))
g.bg = defaultucs; g.bg = defaultucs;