mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Add a simple form of output rate limiting by counting the number of
certain C0 sequences (linefeeds, backspaces, carriage returns) and if it exceeds a threshold (current default 50/millisecond), start to redraw the pane every 100 milliseconds instead of making each change as it comes. Two configuration options - c0-change-trigger and c0-change-interval. This makes tmux much more responsive under very fast output (for example yes(1) or accidentally cat'ing a large file) but may not be perfect on all terminals and connections - feedback very welcome, particularly where this change has a negative rather than positive effect (making it off by default is a possibility). After much experimentation based originally on a request Robin Lee Powell (which ended with a completely different solution), this idea from discussion with Ailin Nemui.
This commit is contained in:
		
							
								
								
									
										16
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								input.c
									
									
									
									
									
								
							@@ -908,6 +908,7 @@ input_c0_dispatch(struct input_ctx *ictx)
 | 
			
		||||
	struct screen_write_ctx	*sctx = &ictx->ctx;
 | 
			
		||||
	struct window_pane	*wp = ictx->wp;
 | 
			
		||||
	struct screen		*s = sctx->s;
 | 
			
		||||
	u_int			 trigger;
 | 
			
		||||
 | 
			
		||||
	log_debug("%s: '%c", __func__, ictx->ch);
 | 
			
		||||
 | 
			
		||||
@@ -919,7 +920,7 @@ input_c0_dispatch(struct input_ctx *ictx)
 | 
			
		||||
		break;
 | 
			
		||||
	case '\010':	/* BS */
 | 
			
		||||
		screen_write_backspace(sctx);
 | 
			
		||||
		break;
 | 
			
		||||
		goto count_c0;
 | 
			
		||||
	case '\011':	/* HT */
 | 
			
		||||
		/* Don't tab beyond the end of the line. */
 | 
			
		||||
		if (s->cx >= screen_size_x(s) - 1)
 | 
			
		||||
@@ -936,10 +937,10 @@ input_c0_dispatch(struct input_ctx *ictx)
 | 
			
		||||
	case '\013':	/* VT */
 | 
			
		||||
	case '\014':	/* FF */
 | 
			
		||||
		screen_write_linefeed(sctx, 0);
 | 
			
		||||
		break;
 | 
			
		||||
		goto count_c0;
 | 
			
		||||
	case '\015':	/* CR */
 | 
			
		||||
		screen_write_carriagereturn(sctx);
 | 
			
		||||
		break;
 | 
			
		||||
		goto count_c0;
 | 
			
		||||
	case '\016':	/* SO */
 | 
			
		||||
		ictx->cell.attr |= GRID_ATTR_CHARSET;
 | 
			
		||||
		break;
 | 
			
		||||
@@ -951,6 +952,15 @@ input_c0_dispatch(struct input_ctx *ictx)
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (0);
 | 
			
		||||
 | 
			
		||||
count_c0:
 | 
			
		||||
	trigger = options_get_number(&wp->window->options, "c0-change-trigger");
 | 
			
		||||
	if (++wp->changes == trigger) {
 | 
			
		||||
		wp->flags |= PANE_DROP;
 | 
			
		||||
		window_pane_timer_start(wp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user