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:
		
							
								
								
									
										12
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								st.c
									
									
									
									
									
								
							| @ -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; | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user