mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Implement ECH (erase character, CSI X). Reported by Christian Neukirchen.
This commit is contained in:
		
							
								
								
									
										5
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								input.c
									
									
									
									
									
								
							| @@ -135,6 +135,7 @@ enum input_csi_type { | |||||||
| 	INPUT_CSI_DECSTBM, | 	INPUT_CSI_DECSTBM, | ||||||
| 	INPUT_CSI_DL, | 	INPUT_CSI_DL, | ||||||
| 	INPUT_CSI_DSR, | 	INPUT_CSI_DSR, | ||||||
|  | 	INPUT_CSI_ECH, | ||||||
| 	INPUT_CSI_ED, | 	INPUT_CSI_ED, | ||||||
| 	INPUT_CSI_EL, | 	INPUT_CSI_EL, | ||||||
| 	INPUT_CSI_HPA, | 	INPUT_CSI_HPA, | ||||||
| @@ -167,6 +168,7 @@ const struct input_table_entry input_csi_table[] = { | |||||||
| 	{ 'L', "",  INPUT_CSI_IL }, | 	{ 'L', "",  INPUT_CSI_IL }, | ||||||
| 	{ 'M', "",  INPUT_CSI_DL }, | 	{ 'M', "",  INPUT_CSI_DL }, | ||||||
| 	{ 'P', "",  INPUT_CSI_DCH }, | 	{ 'P', "",  INPUT_CSI_DCH }, | ||||||
|  | 	{ 'X', "",  INPUT_CSI_ECH }, | ||||||
| 	{ 'Z', "",  INPUT_CSI_CBT }, | 	{ 'Z', "",  INPUT_CSI_CBT }, | ||||||
| 	{ 'c', "",  INPUT_CSI_DA }, | 	{ 'c', "",  INPUT_CSI_DA }, | ||||||
| 	{ 'c', ">", INPUT_CSI_DA_TWO }, | 	{ 'c', ">", INPUT_CSI_DA_TWO }, | ||||||
| @@ -1143,6 +1145,9 @@ input_csi_dispatch(struct input_ctx *ictx) | |||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
|  | 	case INPUT_CSI_ECH: | ||||||
|  | 		screen_write_clearcharacter(sctx, input_get(ictx, 0, 1, 1)); | ||||||
|  | 		break; | ||||||
| 	case INPUT_CSI_DCH: | 	case INPUT_CSI_DCH: | ||||||
| 		screen_write_deletecharacter(sctx, input_get(ictx, 0, 1, 1)); | 		screen_write_deletecharacter(sctx, input_get(ictx, 0, 1, 1)); | ||||||
| 		break; | 		break; | ||||||
|   | |||||||
| @@ -649,6 +649,30 @@ screen_write_deletecharacter(struct screen_write_ctx *ctx, u_int nx) | |||||||
| 	tty_write(tty_cmd_deletecharacter, &ttyctx); | 	tty_write(tty_cmd_deletecharacter, &ttyctx); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* Clear nx characters. */ | ||||||
|  | void | ||||||
|  | screen_write_clearcharacter(struct screen_write_ctx *ctx, u_int nx) | ||||||
|  | { | ||||||
|  | 	struct screen	*s = ctx->s; | ||||||
|  | 	struct tty_ctx	 ttyctx; | ||||||
|  |  | ||||||
|  | 	if (nx == 0) | ||||||
|  | 		nx = 1; | ||||||
|  |  | ||||||
|  | 	if (nx > screen_size_x(s) - s->cx) | ||||||
|  | 		nx = screen_size_x(s) - s->cx; | ||||||
|  | 	if (nx == 0) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	screen_write_initctx(ctx, &ttyctx, 0); | ||||||
|  |  | ||||||
|  | 	if (s->cx <= screen_size_x(s) - 1) | ||||||
|  | 		grid_view_clear(s->grid, s->cx, s->cy, nx, 1); | ||||||
|  |  | ||||||
|  | 	ttyctx.num = nx; | ||||||
|  | 	tty_write(tty_cmd_clearcharacter, &ttyctx); | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Insert ny lines. */ | /* Insert ny lines. */ | ||||||
| void | void | ||||||
| screen_write_insertline(struct screen_write_ctx *ctx, u_int ny) | screen_write_insertline(struct screen_write_ctx *ctx, u_int ny) | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -274,6 +274,7 @@ enum tty_code_code { | |||||||
| 	TTYC_DL,	/* parm_delete_line, DL */ | 	TTYC_DL,	/* parm_delete_line, DL */ | ||||||
| 	TTYC_DL1,	/* delete_line, dl */ | 	TTYC_DL1,	/* delete_line, dl */ | ||||||
| 	TTYC_E3, | 	TTYC_E3, | ||||||
|  | 	TTYC_ECH,	/* erase_chars, ec */ | ||||||
| 	TTYC_EL,	/* clr_eol, ce */ | 	TTYC_EL,	/* clr_eol, ce */ | ||||||
| 	TTYC_EL1,	/* clr_bol, cb */ | 	TTYC_EL1,	/* clr_bol, cb */ | ||||||
| 	TTYC_ENACS,	/* ena_acs, eA */ | 	TTYC_ENACS,	/* ena_acs, eA */ | ||||||
| @@ -1660,6 +1661,7 @@ void	tty_cmd_clearscreen(struct tty *, const struct tty_ctx *); | |||||||
| void	tty_cmd_clearstartofline(struct tty *, const struct tty_ctx *); | void	tty_cmd_clearstartofline(struct tty *, const struct tty_ctx *); | ||||||
| void	tty_cmd_clearstartofscreen(struct tty *, const struct tty_ctx *); | void	tty_cmd_clearstartofscreen(struct tty *, const struct tty_ctx *); | ||||||
| void	tty_cmd_deletecharacter(struct tty *, const struct tty_ctx *); | void	tty_cmd_deletecharacter(struct tty *, const struct tty_ctx *); | ||||||
|  | void	tty_cmd_clearcharacter(struct tty *, const struct tty_ctx *); | ||||||
| void	tty_cmd_deleteline(struct tty *, const struct tty_ctx *); | void	tty_cmd_deleteline(struct tty *, const struct tty_ctx *); | ||||||
| void	tty_cmd_erasecharacter(struct tty *, const struct tty_ctx *); | void	tty_cmd_erasecharacter(struct tty *, const struct tty_ctx *); | ||||||
| void	tty_cmd_insertcharacter(struct tty *, const struct tty_ctx *); | void	tty_cmd_insertcharacter(struct tty *, const struct tty_ctx *); | ||||||
| @@ -2049,6 +2051,7 @@ void	 screen_write_cursorleft(struct screen_write_ctx *, u_int); | |||||||
| void	 screen_write_alignmenttest(struct screen_write_ctx *); | void	 screen_write_alignmenttest(struct screen_write_ctx *); | ||||||
| void	 screen_write_insertcharacter(struct screen_write_ctx *, u_int); | void	 screen_write_insertcharacter(struct screen_write_ctx *, u_int); | ||||||
| void	 screen_write_deletecharacter(struct screen_write_ctx *, u_int); | void	 screen_write_deletecharacter(struct screen_write_ctx *, u_int); | ||||||
|  | void	 screen_write_clearcharacter(struct screen_write_ctx *, u_int); | ||||||
| void	 screen_write_insertline(struct screen_write_ctx *, u_int); | void	 screen_write_insertline(struct screen_write_ctx *, u_int); | ||||||
| void	 screen_write_deleteline(struct screen_write_ctx *, u_int); | void	 screen_write_deleteline(struct screen_write_ctx *, u_int); | ||||||
| void	 screen_write_clearline(struct screen_write_ctx *); | void	 screen_write_clearline(struct screen_write_ctx *); | ||||||
|   | |||||||
| @@ -62,6 +62,7 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = { | |||||||
| 	{ TTYC_DL, TTYCODE_STRING, "dl" }, | 	{ TTYC_DL, TTYCODE_STRING, "dl" }, | ||||||
| 	{ TTYC_DL1, TTYCODE_STRING, "dl1" }, | 	{ TTYC_DL1, TTYCODE_STRING, "dl1" }, | ||||||
| 	{ TTYC_E3, TTYCODE_STRING, "E3" }, | 	{ TTYC_E3, TTYCODE_STRING, "E3" }, | ||||||
|  | 	{ TTYC_ECH, TTYCODE_STRING, "ech" }, | ||||||
| 	{ TTYC_EL, TTYCODE_STRING, "el" }, | 	{ TTYC_EL, TTYCODE_STRING, "el" }, | ||||||
| 	{ TTYC_EL1, TTYCODE_STRING, "el1" }, | 	{ TTYC_EL1, TTYCODE_STRING, "el1" }, | ||||||
| 	{ TTYC_ENACS, TTYCODE_STRING, "enacs" }, | 	{ TTYC_ENACS, TTYCODE_STRING, "enacs" }, | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								tty.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								tty.c
									
									
									
									
									
								
							| @@ -718,6 +718,23 @@ tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx) | |||||||
| 		tty_emulate_repeat(tty, TTYC_DCH, TTYC_DCH1, ctx->num); | 		tty_emulate_repeat(tty, TTYC_DCH, TTYC_DCH1, ctx->num); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void | ||||||
|  | tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx) | ||||||
|  | { | ||||||
|  | 	u_int	i; | ||||||
|  |  | ||||||
|  | 	tty_reset(tty); | ||||||
|  |  | ||||||
|  | 	tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); | ||||||
|  |  | ||||||
|  | 	if (tty_term_has(tty->term, TTYC_ECH)) | ||||||
|  | 		tty_putcode1(tty, TTYC_ECH, ctx->num); | ||||||
|  | 	else { | ||||||
|  | 		for (i = 0; i < ctx->num; i++) | ||||||
|  | 			tty_putc(tty, ' '); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx) | tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx) | ||||||
| { | { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott