mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Add struct status_line to hold status line members of struct client, not
used yet but will be soon. From Thomas Adam.
This commit is contained in:
		@@ -563,7 +563,7 @@ screen_redraw_draw_status(struct client *c, u_int lines, u_int top)
 | 
				
			|||||||
	else
 | 
						else
 | 
				
			||||||
		y = tty->sy - lines;
 | 
							y = tty->sy - lines;
 | 
				
			||||||
	for (i = 0; i < lines; i++)
 | 
						for (i = 0; i < lines; i++)
 | 
				
			||||||
		tty_draw_line(tty, NULL, &c->status, i, 0, y);
 | 
							tty_draw_line(tty, NULL, &c->status.status, i, 0, y);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Draw number on a pane. */
 | 
					/* Draw number on a pane. */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -195,7 +195,7 @@ server_client_create(int fd)
 | 
				
			|||||||
	c->tty.sx = 80;
 | 
						c->tty.sx = 80;
 | 
				
			||||||
	c->tty.sy = 24;
 | 
						c->tty.sy = 24;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_init(&c->status, c->tty.sx, 1, 0);
 | 
						screen_init(&c->status.status, c->tty.sx, 1, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c->message_string = NULL;
 | 
						c->message_string = NULL;
 | 
				
			||||||
	TAILQ_INIT(&c->message_log);
 | 
						TAILQ_INIT(&c->message_log);
 | 
				
			||||||
@@ -272,12 +272,12 @@ server_client_lost(struct client *c)
 | 
				
			|||||||
	if (c->stderr_data != c->stdout_data)
 | 
						if (c->stderr_data != c->stdout_data)
 | 
				
			||||||
		evbuffer_free(c->stderr_data);
 | 
							evbuffer_free(c->stderr_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (event_initialized(&c->status_timer))
 | 
						if (event_initialized(&c->status.timer))
 | 
				
			||||||
		evtimer_del(&c->status_timer);
 | 
							evtimer_del(&c->status.timer);
 | 
				
			||||||
	screen_free(&c->status);
 | 
						screen_free(&c->status.status);
 | 
				
			||||||
	if (c->old_status != NULL) {
 | 
						if (c->status.old_status != NULL) {
 | 
				
			||||||
		screen_free(c->old_status);
 | 
							screen_free(c->status.old_status);
 | 
				
			||||||
		free(c->old_status);
 | 
							free(c->status.old_status);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(c->title);
 | 
						free(c->title);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										73
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										73
									
								
								status.c
									
									
									
									
									
								
							@@ -151,7 +151,7 @@ status_timer_callback(__unused int fd, __unused short events, void *arg)
 | 
				
			|||||||
	struct session	*s = c->session;
 | 
						struct session	*s = c->session;
 | 
				
			||||||
	struct timeval	 tv;
 | 
						struct timeval	 tv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	evtimer_del(&c->status_timer);
 | 
						evtimer_del(&c->status.timer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (s == NULL)
 | 
						if (s == NULL)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
@@ -163,7 +163,7 @@ status_timer_callback(__unused int fd, __unused short events, void *arg)
 | 
				
			|||||||
	tv.tv_sec = options_get_number(s->options, "status-interval");
 | 
						tv.tv_sec = options_get_number(s->options, "status-interval");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (tv.tv_sec != 0)
 | 
						if (tv.tv_sec != 0)
 | 
				
			||||||
		evtimer_add(&c->status_timer, &tv);
 | 
							evtimer_add(&c->status.timer, &tv);
 | 
				
			||||||
	log_debug("client %p, status interval %d", c, (int)tv.tv_sec);
 | 
						log_debug("client %p, status interval %d", c, (int)tv.tv_sec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -173,10 +173,10 @@ status_timer_start(struct client *c)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	struct session	*s = c->session;
 | 
						struct session	*s = c->session;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (event_initialized(&c->status_timer))
 | 
						if (event_initialized(&c->status.timer))
 | 
				
			||||||
		evtimer_del(&c->status_timer);
 | 
							evtimer_del(&c->status.timer);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		evtimer_set(&c->status_timer, status_timer_callback, c);
 | 
							evtimer_set(&c->status.timer, status_timer_callback, c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (s != NULL && options_get_number(s->options, "status"))
 | 
						if (s != NULL && options_get_number(s->options, "status"))
 | 
				
			||||||
		status_timer_callback(-1, 0, c);
 | 
							status_timer_callback(-1, 0, c);
 | 
				
			||||||
@@ -317,10 +317,10 @@ status_redraw(struct client *c)
 | 
				
			|||||||
	int			 larrow, rarrow;
 | 
						int			 larrow, rarrow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Delete the saved status line, if any. */
 | 
						/* Delete the saved status line, if any. */
 | 
				
			||||||
	if (c->old_status != NULL) {
 | 
						if (c->status.old_status != NULL) {
 | 
				
			||||||
		screen_free(c->old_status);
 | 
							screen_free(c->status.old_status);
 | 
				
			||||||
		free(c->old_status);
 | 
							free(c->status.old_status);
 | 
				
			||||||
		c->old_status = NULL;
 | 
							c->status.old_status = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* No status line? */
 | 
						/* No status line? */
 | 
				
			||||||
@@ -337,9 +337,9 @@ status_redraw(struct client *c)
 | 
				
			|||||||
	style_apply(&stdgc, s->options, "status-style");
 | 
						style_apply(&stdgc, s->options, "status-style");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Create the target screen. */
 | 
						/* Create the target screen. */
 | 
				
			||||||
	memcpy(&old_status, &c->status, sizeof old_status);
 | 
						memcpy(&old_status, &c->status.status, sizeof old_status);
 | 
				
			||||||
	screen_init(&c->status, c->tty.sx, lines, 0);
 | 
						screen_init(&c->status.status, c->tty.sx, lines, 0);
 | 
				
			||||||
	screen_write_start(&ctx, NULL, &c->status);
 | 
						screen_write_start(&ctx, NULL, &c->status.status);
 | 
				
			||||||
	for (offset = 0; offset < lines * c->tty.sx; offset++)
 | 
						for (offset = 0; offset < lines * c->tty.sx; offset++)
 | 
				
			||||||
		screen_write_putc(&ctx, &stdgc, ' ');
 | 
							screen_write_putc(&ctx, &stdgc, ' ');
 | 
				
			||||||
	screen_write_stop(&ctx);
 | 
						screen_write_stop(&ctx);
 | 
				
			||||||
@@ -462,7 +462,7 @@ status_redraw(struct client *c)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
draw:
 | 
					draw:
 | 
				
			||||||
	/* Begin drawing. */
 | 
						/* Begin drawing. */
 | 
				
			||||||
	screen_write_start(&ctx, NULL, &c->status);
 | 
						screen_write_start(&ctx, NULL, &c->status.status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Draw the left string and arrow. */
 | 
						/* Draw the left string and arrow. */
 | 
				
			||||||
	screen_write_cursormove(&ctx, 0, 0);
 | 
						screen_write_cursormove(&ctx, 0, 0);
 | 
				
			||||||
@@ -517,7 +517,7 @@ out:
 | 
				
			|||||||
	free(left);
 | 
						free(left);
 | 
				
			||||||
	free(right);
 | 
						free(right);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (grid_compare(c->status.grid, old_status.grid) == 0) {
 | 
						if (grid_compare(c->status.status.grid, old_status.grid) == 0) {
 | 
				
			||||||
		screen_free(&old_status);
 | 
							screen_free(&old_status);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -590,10 +590,11 @@ status_message_set(struct client *c, const char *fmt, ...)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	status_message_clear(c);
 | 
						status_message_clear(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (c->old_status == NULL) {
 | 
						if (c->status.old_status == NULL) {
 | 
				
			||||||
		c->old_status = xmalloc(sizeof *c->old_status);
 | 
							c->status.old_status = xmalloc(sizeof *c->status.old_status);
 | 
				
			||||||
		memcpy(c->old_status, &c->status, sizeof *c->old_status);
 | 
							memcpy(c->status.old_status, &c->status.status,
 | 
				
			||||||
		screen_init(&c->status, c->tty.sx, 1, 0);
 | 
							    sizeof *c->status.old_status);
 | 
				
			||||||
 | 
							screen_init(&c->status.status, c->tty.sx, 1, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	va_start(ap, fmt);
 | 
						va_start(ap, fmt);
 | 
				
			||||||
@@ -631,7 +632,7 @@ status_message_clear(struct client *c)
 | 
				
			|||||||
		c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE);
 | 
							c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE);
 | 
				
			||||||
	c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */
 | 
						c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_reinit(&c->status);
 | 
						screen_reinit(&c->status.status);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Clear status line message after timer expires. */
 | 
					/* Clear status line message after timer expires. */
 | 
				
			||||||
@@ -656,14 +657,14 @@ status_message_redraw(struct client *c)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (c->tty.sx == 0 || c->tty.sy == 0)
 | 
						if (c->tty.sx == 0 || c->tty.sy == 0)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	memcpy(&old_status, &c->status, sizeof old_status);
 | 
						memcpy(&old_status, &c->status.status, sizeof old_status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lines = status_line_size(c->session);
 | 
						lines = status_line_size(c->session);
 | 
				
			||||||
	if (lines <= 1) {
 | 
						if (lines <= 1) {
 | 
				
			||||||
		lines = 1;
 | 
							lines = 1;
 | 
				
			||||||
		screen_init(&c->status, c->tty.sx, 1, 0);
 | 
							screen_init(&c->status.status, c->tty.sx, 1, 0);
 | 
				
			||||||
	} else
 | 
						} else
 | 
				
			||||||
		screen_init(&c->status, c->tty.sx, lines, 0);
 | 
							screen_init(&c->status.status, c->tty.sx, lines, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = screen_write_strlen("%s", c->message_string);
 | 
						len = screen_write_strlen("%s", c->message_string);
 | 
				
			||||||
	if (len > c->tty.sx)
 | 
						if (len > c->tty.sx)
 | 
				
			||||||
@@ -671,7 +672,7 @@ status_message_redraw(struct client *c)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	style_apply(&gc, s->options, "message-style");
 | 
						style_apply(&gc, s->options, "message-style");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_write_start(&ctx, NULL, &c->status);
 | 
						screen_write_start(&ctx, NULL, &c->status.status);
 | 
				
			||||||
	screen_write_cursormove(&ctx, 0, 0);
 | 
						screen_write_cursormove(&ctx, 0, 0);
 | 
				
			||||||
	for (offset = 0; offset < lines * c->tty.sx; offset++)
 | 
						for (offset = 0; offset < lines * c->tty.sx; offset++)
 | 
				
			||||||
		screen_write_putc(&ctx, &gc, ' ');
 | 
							screen_write_putc(&ctx, &gc, ' ');
 | 
				
			||||||
@@ -679,7 +680,7 @@ status_message_redraw(struct client *c)
 | 
				
			|||||||
	screen_write_nputs(&ctx, len, &gc, "%s", c->message_string);
 | 
						screen_write_nputs(&ctx, len, &gc, "%s", c->message_string);
 | 
				
			||||||
	screen_write_stop(&ctx);
 | 
						screen_write_stop(&ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (grid_compare(c->status.grid, old_status.grid) == 0) {
 | 
						if (grid_compare(c->status.status.grid, old_status.grid) == 0) {
 | 
				
			||||||
		screen_free(&old_status);
 | 
							screen_free(&old_status);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -710,10 +711,11 @@ status_prompt_set(struct client *c, const char *msg, const char *input,
 | 
				
			|||||||
	status_message_clear(c);
 | 
						status_message_clear(c);
 | 
				
			||||||
	status_prompt_clear(c);
 | 
						status_prompt_clear(c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (c->old_status == NULL) {
 | 
						if (c->status.old_status == NULL) {
 | 
				
			||||||
		c->old_status = xmalloc(sizeof *c->old_status);
 | 
							c->status.old_status = xmalloc(sizeof *c->status.old_status);
 | 
				
			||||||
		memcpy(c->old_status, &c->status, sizeof *c->old_status);
 | 
							memcpy(c->status.old_status, &c->status.status,
 | 
				
			||||||
		screen_init(&c->status, c->tty.sx, 1, 0);
 | 
							    sizeof *c->status.old_status);
 | 
				
			||||||
 | 
							screen_init(&c->status.status, c->tty.sx, 1, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	c->prompt_string = format_expand_time(ft, msg, t);
 | 
						c->prompt_string = format_expand_time(ft, msg, t);
 | 
				
			||||||
@@ -763,7 +765,7 @@ status_prompt_clear(struct client *c)
 | 
				
			|||||||
	c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE);
 | 
						c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE);
 | 
				
			||||||
	c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */
 | 
						c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_reinit(&c->status);
 | 
						screen_reinit(&c->status.status);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Update status line prompt with a new prompt string. */
 | 
					/* Update status line prompt with a new prompt string. */
 | 
				
			||||||
@@ -809,14 +811,14 @@ status_prompt_redraw(struct client *c)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (c->tty.sx == 0 || c->tty.sy == 0)
 | 
						if (c->tty.sx == 0 || c->tty.sy == 0)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	memcpy(&old_status, &c->status, sizeof old_status);
 | 
						memcpy(&old_status, &c->status.status, sizeof old_status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lines = status_line_size(c->session);
 | 
						lines = status_line_size(c->session);
 | 
				
			||||||
	if (lines <= 1) {
 | 
						if (lines <= 1) {
 | 
				
			||||||
		lines = 1;
 | 
							lines = 1;
 | 
				
			||||||
		screen_init(&c->status, c->tty.sx, 1, 0);
 | 
							screen_init(&c->status.status, c->tty.sx, 1, 0);
 | 
				
			||||||
	} else
 | 
						} else
 | 
				
			||||||
		screen_init(&c->status, c->tty.sx, lines, 0);
 | 
							screen_init(&c->status.status, c->tty.sx, lines, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	len = screen_write_strlen("%s", c->prompt_string);
 | 
						len = screen_write_strlen("%s", c->prompt_string);
 | 
				
			||||||
	if (len > c->tty.sx)
 | 
						if (len > c->tty.sx)
 | 
				
			||||||
@@ -834,7 +836,7 @@ status_prompt_redraw(struct client *c)
 | 
				
			|||||||
	if (start > c->tty.sx)
 | 
						if (start > c->tty.sx)
 | 
				
			||||||
		start = c->tty.sx;
 | 
							start = c->tty.sx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_write_start(&ctx, NULL, &c->status);
 | 
						screen_write_start(&ctx, NULL, &c->status.status);
 | 
				
			||||||
	screen_write_cursormove(&ctx, 0, 0);
 | 
						screen_write_cursormove(&ctx, 0, 0);
 | 
				
			||||||
	for (offset = 0; offset < lines * c->tty.sx; offset++)
 | 
						for (offset = 0; offset < lines * c->tty.sx; offset++)
 | 
				
			||||||
		screen_write_putc(&ctx, &gc, ' ');
 | 
							screen_write_putc(&ctx, &gc, ' ');
 | 
				
			||||||
@@ -880,13 +882,14 @@ status_prompt_redraw(struct client *c)
 | 
				
			|||||||
			screen_write_cell(&ctx, &cursorgc);
 | 
								screen_write_cell(&ctx, &cursorgc);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (c->status.cx < screen_size_x(&c->status) && c->prompt_index >= i)
 | 
						if (c->status.status.cx < screen_size_x(&c->status.status) &&
 | 
				
			||||||
 | 
						    c->prompt_index >= i)
 | 
				
			||||||
		screen_write_putc(&ctx, &cursorgc, ' ');
 | 
							screen_write_putc(&ctx, &cursorgc, ' ');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
finished:
 | 
					finished:
 | 
				
			||||||
	screen_write_stop(&ctx);
 | 
						screen_write_stop(&ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (grid_compare(c->status.grid, old_status.grid) == 0) {
 | 
						if (grid_compare(c->status.status.grid, old_status.grid) == 0) {
 | 
				
			||||||
		screen_free(&old_status);
 | 
							screen_free(&old_status);
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1312,6 +1312,13 @@ struct cmd_entry {
 | 
				
			|||||||
	enum cmd_retval	 (*exec)(struct cmd *, struct cmdq_item *);
 | 
						enum cmd_retval	 (*exec)(struct cmd *, struct cmdq_item *);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Status line. */
 | 
				
			||||||
 | 
					struct status_line {
 | 
				
			||||||
 | 
						struct event	 timer;
 | 
				
			||||||
 | 
						struct screen	 status;
 | 
				
			||||||
 | 
						struct screen	*old_status;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Client connection. */
 | 
					/* Client connection. */
 | 
				
			||||||
typedef int (*prompt_input_cb)(struct client *, void *, const char *, int);
 | 
					typedef int (*prompt_input_cb)(struct client *, void *, const char *, int);
 | 
				
			||||||
typedef void (*prompt_free_cb)(void *);
 | 
					typedef void (*prompt_free_cb)(void *);
 | 
				
			||||||
@@ -1354,10 +1361,7 @@ struct client {
 | 
				
			|||||||
	struct event	 click_timer;
 | 
						struct event	 click_timer;
 | 
				
			||||||
	u_int		 click_button;
 | 
						u_int		 click_button;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct event	 status_timer;
 | 
						struct status_line status;
 | 
				
			||||||
	struct screen	 status;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct screen	*old_status;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CLIENT_TERMINAL 0x1
 | 
					#define CLIENT_TERMINAL 0x1
 | 
				
			||||||
#define CLIENT_LOGIN 0x2
 | 
					#define CLIENT_LOGIN 0x2
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -229,10 +229,10 @@ window_client_draw(__unused void *modedata, void *itemdata,
 | 
				
			|||||||
	screen_write_hline(ctx, sx, 0, 0);
 | 
						screen_write_hline(ctx, sx, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_write_cursormove(ctx, cx, cy + sy - 1);
 | 
						screen_write_cursormove(ctx, cx, cy + sy - 1);
 | 
				
			||||||
	if (c->old_status != NULL)
 | 
						if (c->status.old_status != NULL)
 | 
				
			||||||
		screen_write_fast_copy(ctx, c->old_status, 0, 0, sx, 1);
 | 
							screen_write_fast_copy(ctx, c->status.old_status, 0, 0, sx, 1);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		screen_write_fast_copy(ctx, &c->status, 0, 0, sx, 1);
 | 
							screen_write_fast_copy(ctx, &c->status.status, 0, 0, sx, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct screen *
 | 
					static struct screen *
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user