diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-01-11 23:31:46 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-01-11 23:31:46 +0000 |
commit | 162bacdcd91caf631db6979a21c27d208a66046b (patch) | |
tree | d678a35fa4c017ec034d6d6b19140f56fd8ca65a /screen-redraw.c | |
parent | d78bc5dfc40fe8d1a3842bd91dcfa5ca4c44ae01 (diff) | |
download | rtmux-162bacdcd91caf631db6979a21c27d208a66046b.tar.gz rtmux-162bacdcd91caf631db6979a21c27d208a66046b.tar.bz2 rtmux-162bacdcd91caf631db6979a21c27d208a66046b.zip |
Window splitting. Two vertical panes fixed 50% each. This is a huge diff, still a couple of bugs (notably heap corruption somewhere causing segfault on exit).
Diffstat (limited to 'screen-redraw.c')
-rw-r--r-- | screen-redraw.c | 215 |
1 files changed, 106 insertions, 109 deletions
diff --git a/screen-redraw.c b/screen-redraw.c index 7b3a8ec0..df57c7da 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -1,4 +1,4 @@ -/* $Id: screen-redraw.c,v 1.15 2009-01-09 23:57:42 nicm Exp $ */ +/* $Id: screen-redraw.c,v 1.16 2009-01-11 23:31:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -22,146 +22,143 @@ #include "tmux.h" -/* Initialise redrawing with a window. */ -void -screen_redraw_start_window(struct screen_redraw_ctx *ctx, struct window *w) -{ - struct screen *t = w->screen; +void screen_redraw_blankx(struct client *, u_int, u_int); +void screen_redraw_blanky(struct client *, u_int, u_int); +void screen_redraw_line(struct client *, struct screen *, u_int, u_int); - screen_redraw_start(ctx, t, tty_write_window, w); -} - -/* Initialise redrawing with a client. */ +/* Redraw entire screen.. */ void -screen_redraw_start_client(struct screen_redraw_ctx *ctx, struct client *c) +screen_redraw_screen(struct client *c, struct screen *s) { - struct screen *t = c->session->curw->window->screen; + struct winlink *wl = c->session->curw; + u_int i, cx, cy, sy; + int status; - screen_redraw_start(ctx, t, tty_write_client, c); -} + status = options_get_number(&c->session->options, "status"); -/* Initialise redrawing with a session. */ -void -screen_redraw_start_session(struct screen_redraw_ctx *ctx, struct session *s) -{ - struct screen *t = s->curw->window->screen; - - screen_redraw_start(ctx, t, tty_write_session, s); -} - -/* Initialise for redrawing. */ -void -screen_redraw_start(struct screen_redraw_ctx *ctx, - struct screen *s, void (*write)(void *, enum tty_cmd, ...), void *data) -{ - ctx->write = write; - ctx->data = data; - - ctx->s = s; + /* Override the normal screen if one is given. */ + if (s != NULL) { + for (i = 0; i < screen_size_y(s); i++) + screen_redraw_line(c, s, 0, i); + return; + } - /* - * Save screen cursor position. Emulation of some TTY_* commands - * requires this to be correct in the screen, so rather than having - * a local copy and just manipulating it, save the screen's values, - * modify them during redraw, and restore them when finished. XXX. + /* + * A normal client screen is made up of three parts: a top window, a + * bottom window and a status line. The bottom window may be turned + * off; the status line is always drawn. */ - ctx->saved_cx = s->cx; - ctx->saved_cy = s->cy; - ctx->write(ctx->data, TTY_SCROLLREGION, 0, screen_size_y(s) - 1); - ctx->write(ctx->data, TTY_CURSORMOVE, s->cx, s->cy); - ctx->write(ctx->data, TTY_CURSORMODE, 0); - ctx->write(ctx->data, TTY_MOUSEMODE, 0); -} + /* Draw the top window. */ + s = wl->window->panes[0]->screen; + sy = screen_size_y(s); + if (screen_size_y(s) == c->sy && wl->window->panes[1] == NULL) + sy--; + cx = s->cx; + cy = s->cy; + for (i = 0; i < sy; i++) + screen_redraw_line(c, s, 0, i); + s->cx = cx; + s->cy = cy; + + /* Draw the bottom window. */ + if (wl->window->panes[1] != NULL) { + s = wl->window->panes[1]->screen; + sy = screen_size_y(s); + if (!status && screen_size_y(s) == c->sy - (c->sy / 2) - 1) + sy--; + cx = s->cx; + cy = s->cy; + for (i = 0; i < sy; i++) + screen_redraw_line(c, s, wl->window->sy / 2, i); + s->cx = cx; + s->cy = cy; + } -/* Finish redrawing. */ -void -screen_redraw_stop(struct screen_redraw_ctx *ctx) -{ - struct screen *s = ctx->s; + /* Fill in empty space. */ + if (wl->window->sx < c->sx) { + screen_redraw_blankx( + c, wl->window->sx, c->sx - wl->window->sx); + } + if (wl->window->sy < c->sy - status) { + screen_redraw_blanky( + c, wl->window->sy, c->sy - wl->window->sy); + } - s->cx = ctx->saved_cx; - s->cy = ctx->saved_cy; + /* Draw separator line. */ + s = wl->window->panes[0]->screen; + if (screen_size_y(s) != wl->window->sy) + screen_redraw_blanky(c, screen_size_y(s), 1); - ctx->write(ctx->data, TTY_SCROLLREGION, s->rupper, s->rlower); - ctx->write(ctx->data, TTY_CURSORMOVE, s->cx, s->cy); - if (s->mode & MODE_CURSOR) - ctx->write(ctx->data, TTY_CURSORMODE, 1); - if (s->mode & MODE_MOUSE) - ctx->write(ctx->data, TTY_MOUSEMODE, 1); + /* Draw the status line. */ + screen_redraw_status(c); } -/* Write character. */ +/* Draw the status line. */ void -screen_redraw_putc( - struct screen_redraw_ctx *ctx, struct grid_cell *gc, u_char ch) +screen_redraw_status(struct client *c) { - gc->data = ch; - ctx->write(ctx->data, TTY_CELL, gc); - ctx->s->cx++; -} - -/* Write string. */ -void printflike3 -screen_redraw_puts( - struct screen_redraw_ctx *ctx, struct grid_cell *gc, const char *fmt, ...) -{ - va_list ap; - char *msg, *ptr; - - va_start(ap, fmt); - xvasprintf(&msg, fmt, ap); - va_end(ap); - - for (ptr = msg; *ptr != '\0'; ptr++) - screen_redraw_putc(ctx, gc, (u_char) *ptr); - - xfree(msg); + screen_redraw_line(c, &c->status, c->sy - 1, 0); } -/* Redraw single cell. */ +/* Draw blank columns. */ void -screen_redraw_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py) +screen_redraw_blankx(struct client *c, u_int ox, u_int nx) { - const struct grid_cell *gc; - struct grid_cell tc; + u_int i, j; - if (px != ctx->s->cx || py != ctx->s->cy) { - ctx->s->cx = px; - ctx->s->cy = py; - ctx->write(ctx->data, TTY_CURSORMOVE, ctx->s->cx, ctx->s->cy); + tty_putcode(&c->tty, TTYC_SGR0); + for (j = 0; j < c->sy; j++) { + tty_putcode2(&c->tty, TTYC_CUP, j, ox); + for (i = 0; i < nx; i++) + tty_putc(&c->tty, ' '); } - gc = grid_view_peek_cell(ctx->s->grid, px, py); - if (screen_check_selection(ctx->s, px, py)) { - memcpy(&tc, &ctx->s->sel.cell, sizeof tc); - tc.data = gc->data; - ctx->write(ctx->data, TTY_CELL, &tc); - } else - ctx->write(ctx->data, TTY_CELL, gc); - ctx->s->cx++; + c->tty.cx = UINT_MAX; + c->tty.cy = UINT_MAX; + memcpy(&c->tty.cell, &grid_default_cell, sizeof c->tty.cell); } -/* Draw set of lines. */ +/* Draw blank lines. */ void -screen_redraw_lines(struct screen_redraw_ctx *ctx, u_int py, u_int ny) +screen_redraw_blanky(struct client *c, u_int oy, u_int ny) { u_int i, j; - for (j = py; j < py + ny; j++) { - for (i = 0; i < screen_size_x(ctx->s); i++) - screen_redraw_cell(ctx, i, j); + tty_putcode(&c->tty, TTYC_SGR0); + for (j = 0; j < ny; j++) { + tty_putcode2(&c->tty, TTYC_CUP, oy + j, 0); + for (i = 0; i < c->sx; i++) { + if (j == 0) + tty_putc(&c->tty, '-'); + else + tty_putc(&c->tty, ' '); + } } + + c->tty.cx = UINT_MAX; + c->tty.cy = UINT_MAX; + memcpy(&c->tty.cell, &grid_default_cell, sizeof c->tty.cell); } -/* Draw set of columns. */ +/* Draw a line. */ void -screen_redraw_columns(struct screen_redraw_ctx *ctx, u_int px, u_int nx) +screen_redraw_line(struct client *c, struct screen *s, u_int oy, u_int py) { - u_int i, j; - - for (j = 0; j < screen_size_y(ctx->s); j++) { - for (i = px; i < px + nx; i++) - screen_redraw_cell(ctx, i, j); + const struct grid_cell *gc; + struct grid_cell tc; + u_int i; + + for (i = 0; i < screen_size_x(s); i++) { + s->cx = i; + s->cy = py; + + gc = grid_view_peek_cell(s->grid, i, py); + if (screen_check_selection(s, i, py)) { + memcpy(&tc, &s->sel.cell, sizeof tc); + tc.data = gc->data; + tty_write(&c->tty, s, oy, TTY_CELL, &tc); + } else + tty_write(&c->tty, s, oy, TTY_CELL, gc); } } |