=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/screen-redraw.c,v retrieving revision 1.25 retrieving revision 1.26 diff -c -r1.25 -r1.26 *** src/usr.bin/tmux/screen-redraw.c 2014/01/28 23:07:09 1.25 --- src/usr.bin/tmux/screen-redraw.c 2014/01/31 14:19:24 1.26 *************** *** 1,4 **** ! /* $OpenBSD: screen-redraw.c,v 1.25 2014/01/28 23:07:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: screen-redraw.c,v 1.26 2014/01/31 14:19:24 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 29,34 **** --- 29,37 ---- 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,230 **** /* Redraw entire screen. */ void ! screen_redraw_screen(struct client *c, int status_only, int borders_only) { ! 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; ! int status, spos; /* Suspended clients should not be updated. */ if (c->flags & CLIENT_SUSPENDED) --- 219,231 ---- /* Redraw entire screen. */ void ! screen_redraw_screen(struct client *c, int draw_panes, int draw_status, ! int draw_borders) { ! struct options *oo = &c->session->options; ! struct tty *tty = &c->tty; ! u_int top; ! int status, spos; /* Suspended clients should not be updated. */ if (c->flags & CLIENT_SUSPENDED) *************** *** 239,268 **** top = 0; if (status && spos == 0) top = 1; ! /* 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) --- 240,291 ---- top = 0; if (status && spos == 0) top = 1; + if (!status) + draw_status = 0; ! 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); ! } ! ! /* Draw a single pane. */ ! void ! screen_redraw_pane(struct client *c, struct window_pane *wp) ! { ! u_int i, yoff; ! ! if (!window_pane_visible(wp)) return; ! yoff = wp->yoff; ! if (status_at_line(c) == 0) ! yoff++; ! ! for (i = 0; i < wp->sy; i++) ! tty_draw_line(&c->tty, wp->screen, i, wp->xoff, yoff); ! 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) *************** *** 275,329 **** 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); - } - tty_reset(tty); } ! /* Draw a single pane. */ void ! screen_redraw_pane(struct client *c, struct window_pane *wp) { ! u_int i, yoff; ! if (!window_pane_visible(wp)) ! return; ! ! yoff = wp->yoff; ! if (status_at_line(c) == 0) ! yoff++; ! ! for (i = 0; i < wp->sy; i++) ! tty_draw_line(&c->tty, wp->screen, i, wp->xoff, yoff); ! tty_reset(&c->tty); } /* Draw number on a pane. */ --- 298,336 ---- 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. */