mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Trying to avoid the occasional newline by saving the last cell on screen
is not actually helping us much and just adds complexity, so don't bother.
This commit is contained in:
		| @@ -25,8 +25,6 @@ | ||||
|  | ||||
| static void	screen_write_initctx(struct screen_write_ctx *, | ||||
| 		    struct tty_ctx *); | ||||
| static void	screen_write_save_last(struct screen_write_ctx *, | ||||
| 		    struct tty_ctx *); | ||||
| static void	screen_write_flush(struct screen_write_ctx *); | ||||
|  | ||||
| static int	screen_write_overwrite(struct screen_write_ctx *, | ||||
| @@ -437,24 +435,6 @@ screen_write_initctx(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx) | ||||
| 	ttyctx->orupper = s->rupper; | ||||
| } | ||||
|  | ||||
| /* Save last cell on screen. */ | ||||
| static void | ||||
| screen_write_save_last(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx) | ||||
| { | ||||
| 	struct screen		*s = ctx->s; | ||||
| 	struct grid		*gd = s->grid; | ||||
| 	struct grid_cell	 gc; | ||||
| 	u_int			 xx; | ||||
|  | ||||
| 	memcpy(&gc, &grid_default_cell, sizeof gc); | ||||
| 	for (xx = 1; xx <= screen_size_x(s); xx++) { | ||||
| 		grid_view_get_cell(gd, screen_size_x(s) - xx, s->cy, &gc); | ||||
| 		if (~gc.flags & GRID_FLAG_PADDING) | ||||
| 			break; | ||||
| 	} | ||||
| 	memcpy(&ttyctx->last_cell, &gc, sizeof ttyctx->last_cell); | ||||
| } | ||||
|  | ||||
| /* Set a mode. */ | ||||
| void | ||||
| screen_write_mode_set(struct screen_write_ctx *ctx, int mode) | ||||
| @@ -1040,7 +1020,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) | ||||
| 	struct grid_line	*gl; | ||||
| 	struct grid_cell 	 tmp_gc, now_gc; | ||||
| 	struct grid_cell_entry	*gce; | ||||
| 	int			 insert, skip, selected, wrapped = 0; | ||||
| 	int			 insert, skip, selected; | ||||
|  | ||||
| 	ctx->cells++; | ||||
|  | ||||
| @@ -1071,9 +1051,6 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	/* Initialise the redraw context. */ | ||||
| 	screen_write_initctx(ctx, &ttyctx); | ||||
|  | ||||
| 	/* If in insert mode, make space for the cells. */ | ||||
| 	if (s->mode & MODE_INSERT) { | ||||
| 		if (s->cx <= sx - width) { | ||||
| @@ -1088,18 +1065,17 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) | ||||
|  | ||||
| 	/* Check this will fit on the current line and wrap if not. */ | ||||
| 	if ((s->mode & MODE_WRAP) && s->cx > sx - width) { | ||||
| 		screen_write_flush(ctx); | ||||
| 		screen_write_save_last(ctx, &ttyctx); | ||||
| 		screen_write_linefeed(ctx, 1); | ||||
| 		s->cx = 0;	/* carriage return */ | ||||
| 		skip = 0; | ||||
| 		wrapped = 1; | ||||
| 	} | ||||
|  | ||||
| 	/* Sanity check cursor position. */ | ||||
| 	if (s->cx > sx - width || s->cy > sy - 1) | ||||
| 		return; | ||||
|  | ||||
| 	/* Initialise the redraw context. */ | ||||
| 	screen_write_initctx(ctx, &ttyctx); | ||||
|  | ||||
| 	/* Handle overwriting of UTF-8 characters. */ | ||||
| 	gl = &s->grid->linedata[s->grid->hsize + s->cy]; | ||||
| 	if (gl->flags & GRID_LINE_EXTENDED) { | ||||
| @@ -1179,27 +1155,20 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc) | ||||
| 		tty_write(tty_cmd_cell, &ttyctx); | ||||
| 		ctx->written++; | ||||
| 	} else if (!skip) { | ||||
| 		if (wrapped) { | ||||
| 			ttyctx.cell = gc; | ||||
| 			tty_write(tty_cmd_cell, &ttyctx); | ||||
| 			ctx->written++; | ||||
| 		} else { | ||||
| 			/* | ||||
| 			 * If wp is NULL, we are not updating the terminal and | ||||
| 			 * don't care about actually writing the cells | ||||
| 			 * (tty_write will just return). So don't even bother | ||||
| 			 * allocating the dirty array. | ||||
| 			 */ | ||||
| 			if (ctx->wp != NULL && s->dirty == NULL) { | ||||
| 				log_debug("%s: allocating %u bits", __func__, | ||||
| 				    s->dirtysize); | ||||
| 				s->dirty = bit_alloc(s->dirtysize); | ||||
| 			} | ||||
| 			if (s->dirty != NULL) { | ||||
| 				bit_set(s->dirty, screen_dirty_bit(s, | ||||
| 				    ttyctx.ocx, ttyctx.ocy)); | ||||
| 				ctx->dirty++; | ||||
| 			} | ||||
| 		/* | ||||
| 		 * If wp is NULL, we are not updating the terminal and don't | ||||
| 		 * care about actually writing the cells (tty_write will just | ||||
| 		 * return). So don't even bother allocating the dirty array. | ||||
| 		 */ | ||||
| 		if (ctx->wp != NULL && s->dirty == NULL) { | ||||
| 			log_debug("%s: allocating %u bits", __func__, | ||||
| 			    s->dirtysize); | ||||
| 			s->dirty = bit_alloc(s->dirtysize); | ||||
| 		} | ||||
| 		if (s->dirty != NULL) { | ||||
| 			bit_set(s->dirty, screen_dirty_bit(s, | ||||
| 			    ttyctx.ocx, ttyctx.ocy)); | ||||
| 			ctx->dirty++; | ||||
| 		} | ||||
| 	} else | ||||
| 		ctx->skipped++; | ||||
|   | ||||
							
								
								
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1105,9 +1105,6 @@ struct tty_ctx { | ||||
|  | ||||
| 	/* The background colour used for clearing (erasing). */ | ||||
| 	u_int		 bg; | ||||
|  | ||||
| 	/* Saved last cell on line. */ | ||||
| 	struct grid_cell last_cell; | ||||
| }; | ||||
|  | ||||
| /* Saved message entry. */ | ||||
|   | ||||
							
								
								
									
										39
									
								
								tty.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								tty.c
									
									
									
									
									
								
							| @@ -998,17 +998,6 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx) | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	 * If this line wrapped naturally (ctx->num is nonzero) and we are not | ||||
| 	 * using margins, don't do anything - the cursor can just be moved | ||||
| 	 * to the last cell and wrap naturally. | ||||
| 	 */ | ||||
| 	if ((!tty_use_margin(tty) || | ||||
| 	    tty_pane_full_width(tty, ctx)) && | ||||
| 	    ctx->num != 0 && | ||||
| 	    !(tty->term->flags & TERM_EARLYWRAP)) | ||||
| 		return; | ||||
|  | ||||
| 	tty_attributes(tty, &grid_default_cell, wp); | ||||
|  | ||||
| 	tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower); | ||||
| @@ -1164,8 +1153,6 @@ void | ||||
| tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx) | ||||
| { | ||||
| 	struct window_pane	*wp = ctx->wp; | ||||
| 	struct screen		*s = wp->screen; | ||||
| 	u_int			 cx, width; | ||||
|  | ||||
| 	if (ctx->xoff + ctx->ocx > tty->sx - 1 && ctx->ocy == ctx->orlower) { | ||||
| 		if (tty_pane_full_width(tty, ctx)) | ||||
| @@ -1174,31 +1161,7 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx) | ||||
| 			tty_margin_off(tty); | ||||
| 	} | ||||
|  | ||||
| 	/* Is the cursor in the very last position? */ | ||||
| 	width = ctx->cell->data.width; | ||||
| 	if (ctx->ocx > wp->sx - width) { | ||||
| 		if (!tty_pane_full_width(tty, ctx)) { | ||||
| 			/* | ||||
| 			 * The pane doesn't fill the entire line, the linefeed | ||||
| 			 * will already have happened, so just move the cursor. | ||||
| 			 */ | ||||
| 			if (ctx->ocy != wp->yoff + wp->screen->rlower) | ||||
| 				tty_cursor_pane(tty, ctx, 0, ctx->ocy + 1); | ||||
| 			else | ||||
| 				tty_cursor_pane(tty, ctx, 0, ctx->ocy); | ||||
| 		} else if (tty->cy != ctx->yoff + ctx->ocy || | ||||
| 		    tty->cx < tty->sx) { | ||||
| 			/* | ||||
| 			 * The cursor isn't in the last position already, so | ||||
| 			 * move as far right as possible and redraw the last | ||||
| 			 * cell to move into the last position. | ||||
| 			 */ | ||||
| 			cx = screen_size_x(s) - ctx->last_cell.data.width; | ||||
| 			tty_cursor_pane(tty, ctx, cx, ctx->ocy); | ||||
| 			tty_cell(tty, &ctx->last_cell, wp); | ||||
| 		} | ||||
| 	} else | ||||
| 		tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); | ||||
| 	tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); | ||||
|  | ||||
| 	tty_cell(tty, ctx->cell, wp); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm