mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Some minor performance improvements - most notably, don't search the
input state table if the next character matches the same state as before.
This commit is contained in:
		
							
								
								
									
										22
									
								
								grid.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								grid.c
									
									
									
									
									
								
							@@ -186,17 +186,19 @@ grid_clear_cell(struct grid *gd, u_int px, u_int py, u_int bg)
 | 
			
		||||
	struct grid_cell	*gc;
 | 
			
		||||
 | 
			
		||||
	memcpy(gce, &grid_cleared_entry, sizeof *gce);
 | 
			
		||||
	if (bg & COLOUR_FLAG_RGB) {
 | 
			
		||||
		grid_get_extended_cell(gl, gce, gce->flags);
 | 
			
		||||
		gl->flags |= GRID_LINE_EXTENDED;
 | 
			
		||||
	if (bg != 8) {
 | 
			
		||||
		if (bg & COLOUR_FLAG_RGB) {
 | 
			
		||||
			grid_get_extended_cell(gl, gce, gce->flags);
 | 
			
		||||
			gl->flags |= GRID_LINE_EXTENDED;
 | 
			
		||||
 | 
			
		||||
		gc = &gl->extddata[gce->offset];
 | 
			
		||||
		memcpy(gc, &grid_cleared_cell, sizeof *gc);
 | 
			
		||||
		gc->bg = bg;
 | 
			
		||||
	} else {
 | 
			
		||||
		if (bg & COLOUR_FLAG_256)
 | 
			
		||||
			gce->flags |= GRID_FLAG_BG256;
 | 
			
		||||
		gce->data.bg = bg;
 | 
			
		||||
			gc = &gl->extddata[gce->offset];
 | 
			
		||||
			memcpy(gc, &grid_cleared_cell, sizeof *gc);
 | 
			
		||||
			gc->bg = bg;
 | 
			
		||||
		} else {
 | 
			
		||||
			if (bg & COLOUR_FLAG_256)
 | 
			
		||||
				gce->flags |= GRID_FLAG_BG256;
 | 
			
		||||
			gce->data.bg = bg;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								input.c
									
									
									
									
									
								
							@@ -888,7 +888,8 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len)
 | 
			
		||||
{
 | 
			
		||||
	struct input_ctx		*ictx = wp->ictx;
 | 
			
		||||
	struct screen_write_ctx		*sctx = &ictx->ctx;
 | 
			
		||||
	const struct input_transition	*itr;
 | 
			
		||||
	const struct input_state	*state = NULL;
 | 
			
		||||
	const struct input_transition	*itr = NULL;
 | 
			
		||||
	size_t				 off = 0;
 | 
			
		||||
 | 
			
		||||
	if (len == 0)
 | 
			
		||||
@@ -916,16 +917,22 @@ input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len)
 | 
			
		||||
		ictx->ch = buf[off++];
 | 
			
		||||
 | 
			
		||||
		/* Find the transition. */
 | 
			
		||||
		itr = ictx->state->transitions;
 | 
			
		||||
		while (itr->first != -1 && itr->last != -1) {
 | 
			
		||||
			if (ictx->ch >= itr->first && ictx->ch <= itr->last)
 | 
			
		||||
				break;
 | 
			
		||||
			itr++;
 | 
			
		||||
		}
 | 
			
		||||
		if (itr->first == -1 || itr->last == -1) {
 | 
			
		||||
			/* No transition? Eh? */
 | 
			
		||||
			fatalx("no transition from state");
 | 
			
		||||
		if (ictx->state != state ||
 | 
			
		||||
		    itr == NULL ||
 | 
			
		||||
		    ictx->ch < itr->first ||
 | 
			
		||||
		    ictx->ch > itr->last) {
 | 
			
		||||
			itr = ictx->state->transitions;
 | 
			
		||||
			while (itr->first != -1 && itr->last != -1) {
 | 
			
		||||
				if (ictx->ch >= itr->first && ictx->ch <= itr->last)
 | 
			
		||||
					break;
 | 
			
		||||
				itr++;
 | 
			
		||||
			}
 | 
			
		||||
			if (itr->first == -1 || itr->last == -1) {
 | 
			
		||||
				/* No transition? Eh? */
 | 
			
		||||
				fatalx("no transition from state");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		state = ictx->state;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Any state except print stops the current collection. This is
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								log.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								log.c
									
									
									
									
									
								
							@@ -131,6 +131,9 @@ log_debug(const char *msg, ...)
 | 
			
		||||
{
 | 
			
		||||
	va_list	ap;
 | 
			
		||||
 | 
			
		||||
	if (log_file == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	va_start(ap, msg);
 | 
			
		||||
	log_vwrite(msg, ap);
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
 
 | 
			
		||||
@@ -1326,8 +1326,7 @@ screen_write_collect_end(struct screen_write_ctx *ctx)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	memcpy(&gc, &ci->gc, sizeof gc);
 | 
			
		||||
	grid_view_set_cells(s->grid, s->cx, s->cy, &gc, ci->data, ci->used);
 | 
			
		||||
	grid_view_set_cells(s->grid, s->cx, s->cy, &ci->gc, ci->data, ci->used);
 | 
			
		||||
	screen_write_set_cursor(ctx, s->cx + ci->used, -1);
 | 
			
		||||
 | 
			
		||||
	for (xx = s->cx; xx < screen_size_x(s); xx++) {
 | 
			
		||||
@@ -1351,8 +1350,7 @@ screen_write_collect_add(struct screen_write_ctx *ctx,
 | 
			
		||||
	/*
 | 
			
		||||
	 * Don't need to check that the attributes and whatnot are still the
 | 
			
		||||
	 * same - input_parse will end the collection when anything that isn't
 | 
			
		||||
	 * a plain character is encountered. Also nothing should make it here
 | 
			
		||||
	 * that isn't a single ASCII character.
 | 
			
		||||
	 * a plain character is encountered.
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	collect = 1;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user