mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Break up and simplify screen_redraw_screen.
This commit is contained in:
		
							
								
								
									
										147
									
								
								screen-redraw.c
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								screen-redraw.c
									
									
									
									
									
								
							| @@ -29,6 +29,9 @@ int	screen_redraw_check_cell(struct client *, u_int, u_int, | ||||
| int	screen_redraw_check_active(u_int, u_int, int, struct window *, | ||||
| 	    struct window_pane *); | ||||
|  | ||||
| void	screen_redraw_draw_borders(struct client *, int, u_int); | ||||
| void	screen_redraw_draw_panes(struct client *, u_int); | ||||
| void	screen_redraw_draw_status(struct client *, u_int); | ||||
| void	screen_redraw_draw_number(struct client *, struct window_pane *); | ||||
|  | ||||
| #define CELL_INSIDE 0 | ||||
| @@ -216,14 +219,12 @@ screen_redraw_check_active(u_int px, u_int py, int type, struct window *w, | ||||
|  | ||||
| /* Redraw entire screen. */ | ||||
| void | ||||
| screen_redraw_screen(struct client *c, int status_only, int borders_only) | ||||
| screen_redraw_screen(struct client *c, int draw_panes, int draw_status, | ||||
|     int draw_borders) | ||||
| { | ||||
| 	struct window		*w = c->session->curw->window; | ||||
| 	struct options	*oo = &c->session->options; | ||||
| 	struct tty	*tty = &c->tty; | ||||
| 	struct window_pane	*wp; | ||||
| 	struct grid_cell	 active_gc, other_gc; | ||||
| 	u_int		 	 i, j, type, top; | ||||
| 	u_int		 top; | ||||
| 	int	 	 status, spos; | ||||
|  | ||||
| 	/* Suspended clients should not be updated. */ | ||||
| @@ -239,72 +240,15 @@ screen_redraw_screen(struct client *c, int status_only, int borders_only) | ||||
| 	top = 0; | ||||
| 	if (status && spos == 0) | ||||
| 		top = 1; | ||||
| 	if (!status) | ||||
| 		draw_status = 0; | ||||
|  | ||||
| 	/* If only drawing status and it is present, don't need the rest. */ | ||||
| 	if (status_only && status) { | ||||
| 		if (top) | ||||
| 			tty_draw_line(tty, &c->status, 0, 0, 0); | ||||
| 		else | ||||
| 			tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1); | ||||
| 		tty_reset(tty); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	/* Set up pane border attributes. */ | ||||
| 	style_apply(&other_gc, oo, "pane-border-style"); | ||||
| 	style_apply(&active_gc, oo, "pane-active-border-style"); | ||||
| 	active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; /* nuke existing */ | ||||
|  | ||||
| 	/* Draw background and borders. */ | ||||
| 	for (j = 0; j < tty->sy - status; j++) { | ||||
| 		if (status_only) { | ||||
| 			if (spos == 1 && j != tty->sy - 1) | ||||
| 				continue; | ||||
| 			else if (spos == 0 && j != 0) | ||||
| 				break; | ||||
| 		} | ||||
| 		for (i = 0; i < tty->sx; i++) { | ||||
| 			type = screen_redraw_check_cell(c, i, j, &wp); | ||||
| 			if (type == CELL_INSIDE) | ||||
| 				continue; | ||||
| 			if (screen_redraw_check_active(i, j, type, w, wp)) | ||||
| 				tty_attributes(tty, &active_gc); | ||||
| 			else | ||||
| 				tty_attributes(tty, &other_gc); | ||||
| 			tty_cursor(tty, i, top + j); | ||||
| 			tty_putc(tty, CELL_BORDERS[type]); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* If only drawing borders, that's it. */ | ||||
| 	if (borders_only) | ||||
| 		return; | ||||
|  | ||||
| 	/* Draw the panes, if necessary. */ | ||||
| 	TAILQ_FOREACH(wp, &w->panes, entry) { | ||||
| 		if (!window_pane_visible(wp)) | ||||
| 			continue; | ||||
| 		for (i = 0; i < wp->sy; i++) { | ||||
| 			if (status_only) { | ||||
| 				if (spos == 1 && wp->yoff + i != tty->sy - 1) | ||||
| 					continue; | ||||
| 				else if (spos == 0 && wp->yoff + i != 0) | ||||
| 					break; | ||||
| 			} | ||||
| 			tty_draw_line( | ||||
| 			    tty, wp->screen, i, wp->xoff, top + wp->yoff); | ||||
| 		} | ||||
| 		if (c->flags & CLIENT_IDENTIFY) | ||||
| 			screen_redraw_draw_number(c, wp); | ||||
| 	} | ||||
|  | ||||
| 	/* Draw the status line. */ | ||||
| 	if (status) { | ||||
| 		if (top) | ||||
| 			tty_draw_line(tty, &c->status, 0, 0, 0); | ||||
| 		else | ||||
| 			tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1); | ||||
| 	} | ||||
| 	if (draw_borders) | ||||
| 		screen_redraw_draw_borders(c, status, top); | ||||
| 	if (draw_panes) | ||||
| 		screen_redraw_draw_panes(c, top); | ||||
| 	if (draw_status) | ||||
| 		screen_redraw_draw_status(c, top); | ||||
| 	tty_reset(tty); | ||||
| } | ||||
|  | ||||
| @@ -326,6 +270,69 @@ screen_redraw_pane(struct client *c, struct window_pane *wp) | ||||
| 	tty_reset(&c->tty); | ||||
| } | ||||
|  | ||||
| /* Draw the borders. */ | ||||
| void | ||||
| screen_redraw_draw_borders(struct client *c, int status, u_int top) | ||||
| { | ||||
| 	struct window		*w = c->session->curw->window; | ||||
| 	struct options		*oo = &c->session->options; | ||||
| 	struct tty		*tty = &c->tty; | ||||
| 	struct window_pane	*wp; | ||||
| 	struct grid_cell	 active_gc, other_gc; | ||||
| 	u_int		 	 i, j, type; | ||||
|  | ||||
| 	style_apply(&other_gc, oo, "pane-border-style"); | ||||
| 	style_apply(&active_gc, oo, "pane-active-border-style"); | ||||
| 	active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; | ||||
|  | ||||
| 	for (j = 0; j < tty->sy - status; j++) { | ||||
| 		for (i = 0; i < tty->sx; i++) { | ||||
| 			type = screen_redraw_check_cell(c, i, j, &wp); | ||||
| 			if (type == CELL_INSIDE) | ||||
| 				continue; | ||||
| 			if (screen_redraw_check_active(i, j, type, w, wp)) | ||||
| 				tty_attributes(tty, &active_gc); | ||||
| 			else | ||||
| 				tty_attributes(tty, &other_gc); | ||||
| 			tty_cursor(tty, i, top + j); | ||||
| 			tty_putc(tty, CELL_BORDERS[type]); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Draw the panes. */ | ||||
| void | ||||
| screen_redraw_draw_panes(struct client *c, u_int top) | ||||
| { | ||||
| 	struct window		*w = c->session->curw->window; | ||||
| 	struct tty		*tty = &c->tty; | ||||
| 	struct window_pane	*wp; | ||||
| 	struct screen		*s; | ||||
| 	u_int		 	 i; | ||||
|  | ||||
| 	TAILQ_FOREACH(wp, &w->panes, entry) { | ||||
| 		if (!window_pane_visible(wp)) | ||||
| 			continue; | ||||
| 		s = wp->screen; | ||||
| 		for (i = 0; i < wp->sy; i++) | ||||
| 			tty_draw_line(tty, s, i, wp->xoff, top + wp->yoff); | ||||
| 		if (c->flags & CLIENT_IDENTIFY) | ||||
| 			screen_redraw_draw_number(c, wp); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* Draw the status line. */ | ||||
| void | ||||
| screen_redraw_draw_status(struct client *c, u_int top) | ||||
| { | ||||
| 	struct tty	*tty = &c->tty; | ||||
|  | ||||
| 	if (top) | ||||
| 		tty_draw_line(tty, &c->status, 0, 0, 0); | ||||
| 	else | ||||
| 		tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1); | ||||
| } | ||||
|  | ||||
| /* Draw number on a pane. */ | ||||
| void | ||||
| screen_redraw_draw_number(struct client *c, struct window_pane *wp) | ||||
|   | ||||
| @@ -743,7 +743,7 @@ server_client_check_redraw(struct client *c) | ||||
| 	} | ||||
|  | ||||
| 	if (c->flags & CLIENT_REDRAW) { | ||||
| 		screen_redraw_screen(c, 0, 0); | ||||
| 		screen_redraw_screen(c, 1, 1, 1); | ||||
| 		c->flags &= ~(CLIENT_STATUS|CLIENT_BORDERS); | ||||
| 	} else if (c->flags & CLIENT_REDRAWWINDOW) { | ||||
| 		TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) | ||||
| @@ -757,10 +757,10 @@ server_client_check_redraw(struct client *c) | ||||
| 	} | ||||
|  | ||||
| 	if (c->flags & CLIENT_BORDERS) | ||||
| 		screen_redraw_screen(c, 0, 1); | ||||
| 		screen_redraw_screen(c, 0, 0, 1); | ||||
|  | ||||
| 	if (c->flags & CLIENT_STATUS) | ||||
| 		screen_redraw_screen(c, 1, 0); | ||||
| 		screen_redraw_screen(c, 0, 1, 0); | ||||
|  | ||||
| 	c->tty.flags |= flags; | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -2084,7 +2084,7 @@ void	 screen_write_setselection(struct screen_write_ctx *, u_char *, u_int); | ||||
| void	 screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int); | ||||
|  | ||||
| /* screen-redraw.c */ | ||||
| void	 screen_redraw_screen(struct client *, int, int); | ||||
| void	 screen_redraw_screen(struct client *, int, int, int); | ||||
| void	 screen_redraw_pane(struct client *, struct window_pane *); | ||||
|  | ||||
| /* screen.c */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm