diff --git a/Makefile b/Makefile index d3fb19c5..ab0380ee 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.46 2007-11-21 19:44:04 nicm Exp $ +# $Id: Makefile,v 1.47 2007-11-22 18:09:43 nicm Exp $ .SUFFIXES: .c .o .y .h .PHONY: clean update-index.html upload-index.html @@ -26,8 +26,8 @@ SRCS= tmux.c server.c server-msg.c server-fn.c buffer.c buffer-poll.c status.c \ cmd-refresh-client.c cmd-kill-window.c cmd-list-clients.c \ cmd-link-window.c cmd-unlink-window.c cmd-next-window.c \ cmd-swap-window.c cmd-rename-session.c cmd-kill-session.c \ - cmd-switch-client.c cmd-has-session.c cmd-scroll-mode.c \ - window-scroll.c window-more.c + cmd-switch-client.c cmd-has-session.c cmd-scroll-mode.c cmd-copy-mode.c \ + window-scroll.c window-more.c window-copy.c CC?= cc INCDIRS+= -I. -I- -I/usr/local/include diff --git a/cmd-scroll-mode.c b/cmd-scroll-mode.c index 808d8f71..6b7f6abc 100644 --- a/cmd-scroll-mode.c +++ b/cmd-scroll-mode.c @@ -1,4 +1,4 @@ -/* $Id: cmd-scroll-mode.c,v 1.2 2007-11-21 20:06:48 nicm Exp $ */ +/* $Id: cmd-scroll-mode.c,v 1.3 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -30,7 +30,7 @@ void cmd_scroll_mode_exec(void *, struct cmd_ctx *); const struct cmd_entry cmd_scroll_mode_entry = { - "scroll-mode", "scroll", "", + "scroll-mode", NULL, "", CMD_NOCLIENT, NULL, cmd_scroll_mode_exec, diff --git a/cmd.c b/cmd.c index 91c41103..0023bbad 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.30 2007-11-21 13:11:41 nicm Exp $ */ +/* $Id: cmd.c,v 1.31 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -26,6 +26,7 @@ const struct cmd_entry *cmd_table[] = { &cmd_attach_session_entry, &cmd_bind_key_entry, + &cmd_copy_mode_entry, &cmd_detach_client_entry, &cmd_has_session_entry, &cmd_kill_session_entry, diff --git a/key-bindings.c b/key-bindings.c index 5f13dd60..84358b4d 100644 --- a/key-bindings.c +++ b/key-bindings.c @@ -1,4 +1,4 @@ -/* $Id: key-bindings.c,v 1.19 2007-11-21 19:44:05 nicm Exp $ */ +/* $Id: key-bindings.c,v 1.20 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -109,6 +109,7 @@ key_bindings_init(void) { 'r', &cmd_refresh_client_entry, NULL }, { '&', &cmd_kill_window_entry, NULL }, { '=', &cmd_scroll_mode_entry, NULL }, + { '[', &cmd_copy_mode_entry, NULL }, { META, &cmd_send_prefix_entry, NULL }, }; u_int i; diff --git a/screen.c b/screen.c index 6df0abc1..2e1f4a86 100644 --- a/screen.c +++ b/screen.c @@ -1,4 +1,4 @@ -/* $Id: screen.c,v 1.36 2007-11-22 09:11:20 nicm Exp $ */ +/* $Id: screen.c,v 1.37 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -110,7 +110,7 @@ screen_create(struct screen *s, u_int dx, u_int dy) void screen_resize(struct screen *s, u_int sx, u_int sy) { - u_int ox, oy, ny, my; + u_int i, ox, oy, ny, my; if (sx < 1) sx = 1; @@ -126,6 +126,14 @@ screen_resize(struct screen *s, u_int sx, u_int sy) * X dimension. */ if (sx != ox) { + /* If getting smaller, nuke any data in lines over the new size. */ + if (sx < ox) { + for (i = s->hsize; i < s->hsize + oy; i++) { + if (s->grid_size[i] > sx) + screen_reduce_line(s, i, sx); + } + } + if (s->cx >= sx) s->cx = sx - 1; s->dx = sx; @@ -201,6 +209,17 @@ screen_expand_line(struct screen *s, u_int py, u_int nx) memset(&s->grid_colr[py][ox], SCREEN_DEFCOLR, nx - ox); } +/* Reduce line. */ +void +screen_reduce_line(struct screen *s, u_int py, u_int nx) +{ + s->grid_size[py] = nx; + + s->grid_data[py] = xrealloc(s->grid_data[py], 1, nx); + s->grid_attr[py] = xrealloc(s->grid_attr[py], 1, nx); + s->grid_colr[py] = xrealloc(s->grid_colr[py], 1, nx); +} + /* Get cell. */ void screen_get_cell(struct screen *s, @@ -263,9 +282,7 @@ screen_draw_start(struct screen_draw_ctx *ctx, ctx->colr = s->colr; input_store_two(b, CODE_SCROLLREGION, 1, screen_size_y(s)); - - if (s->mode & MODE_CURSOR) - input_store_zero(b, CODE_CURSOROFF); + input_store_zero(b, CODE_CURSOROFF); } /* Get cell data during drawing. */ @@ -296,9 +313,14 @@ screen_draw_stop(struct screen_draw_ctx *ctx) if (ctx->attr != s->attr || ctx->colr != s->colr) input_store_two(b, CODE_ATTRIBUTES, s->attr, s->colr); - - if (!(s->mode & MODE_NOCURSOR) && s->mode & MODE_CURSOR) - input_store_zero(b, CODE_CURSORON); + + if (s->mode & MODE_BACKGROUND) { + if (s->mode & MODE_BGCURSOR) + input_store_zero(b, CODE_CURSORON); + } else { + if (s->mode & MODE_CURSOR) + input_store_zero(b, CODE_CURSORON); + } } /* Move cursor. */ diff --git a/server-fn.c b/server-fn.c index 27a43a41..f9866da0 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.30 2007-11-22 09:11:20 nicm Exp $ */ +/* $Id: server-fn.c,v 1.31 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -175,8 +175,13 @@ server_clear_client(struct client *c) input_store_zero(c->out, CODE_CLEARLINE); } input_store_two(c->out, CODE_CURSORMOVE, s->cy + 1, s->cx + 1); - if (!(s->mode & MODE_NOCURSOR) && s->mode & MODE_CURSOR) - input_store_zero(c->out, CODE_CURSORON); + if (s->mode & MODE_BACKGROUND) { + if (s->mode & MODE_BGCURSOR) + input_store_zero(c->out, CODE_CURSORON); + } else { + if (s->mode & MODE_CURSOR) + input_store_zero(c->out, CODE_CURSORON); + } size = BUFFER_USED(c->out) - size; hdr.type = MSG_DATA; diff --git a/status.c b/status.c index 5a341d0e..15821313 100644 --- a/status.c +++ b/status.c @@ -1,4 +1,4 @@ -/* $Id: status.c,v 1.12 2007-11-22 09:29:50 nicm Exp $ */ +/* $Id: status.c,v 1.13 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -57,8 +57,13 @@ status_write(struct client *c) input_store_two(b, CODE_ATTRIBUTES, s->attr, s->colr); input_store_two(b, CODE_CURSORMOVE, s->cy + 1, s->cx + 1); - if (!(s->mode & MODE_NOCURSOR) && s->mode & MODE_CURSOR) - input_store_zero(b, CODE_CURSORON); + if (s->mode & MODE_BACKGROUND) { + if (s->mode & MODE_BGCURSOR) + input_store_zero(c->out, CODE_CURSORON); + } else { + if (s->mode & MODE_CURSOR) + input_store_zero(c->out, CODE_CURSORON); + } } void printflike3 diff --git a/tmux.h b/tmux.h index 0039c834..c55d7e08 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.93 2007-11-22 09:11:20 nicm Exp $ */ +/* $Id: tmux.h,v 1.94 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -334,14 +334,14 @@ struct msg_resize_data { #define ATTR_ITALICS 0x40 /* Modes. */ -#define MODE_CURSOR 0x01 -#define MODE_INSERT 0x02 -#define MODE_KCURSOR 0x04 -#define MODE_KKEYPAD 0x08 -#define MODE_SAVED 0x10 -#define MODE_HIDDEN 0x20 -#define MODE_BACKGROUND 0x40 -#define MODE_NOCURSOR 0x80 +#define MODE_CURSOR 0x001 +#define MODE_INSERT 0x002 +#define MODE_KCURSOR 0x004 +#define MODE_KKEYPAD 0x008 +#define MODE_SAVED 0x010 +#define MODE_HIDDEN 0x020 +#define MODE_BACKGROUND 0x040 +#define MODE_BGCURSOR 0x080 /* * Virtual screen. This is stored as three blocks of 8-bit values, one for @@ -623,6 +623,7 @@ void cmd_send_string(struct buffer *, const char *); char *cmd_recv_string(struct buffer *); extern const struct cmd_entry cmd_attach_session_entry; extern const struct cmd_entry cmd_bind_key_entry; +extern const struct cmd_entry cmd_copy_mode_entry; extern const struct cmd_entry cmd_detach_client_entry; extern const struct cmd_entry cmd_has_session_entry; extern const struct cmd_entry cmd_kill_session_entry; @@ -766,6 +767,7 @@ void screen_create(struct screen *, u_int, u_int); void screen_destroy(struct screen *); void screen_resize(struct screen *, u_int, u_int); void screen_expand_line(struct screen *, u_int, u_int); +void screen_reduce_line(struct screen *, u_int, u_int); void screen_get_cell( struct screen *, u_int, u_int, u_char *, u_char *, u_char *); void screen_set_cell(struct screen *, u_int, u_int, u_char, u_char, u_char); @@ -817,6 +819,9 @@ void window_parse(struct window *, struct buffer *); void window_draw(struct window *, struct buffer *, u_int, u_int); void window_key(struct window *, int); +/* window-copy.c */ +extern const struct window_mode window_copy_mode; + /* window-scroll.c */ extern const struct window_mode window_scroll_mode; diff --git a/window-copy.c b/window-copy.c new file mode 100644 index 00000000..7fb25be5 --- /dev/null +++ b/window-copy.c @@ -0,0 +1,456 @@ +/* $Id: window-copy.c,v 1.1 2007-11-22 18:09:43 nicm Exp $ */ + +/* + * Copyright (c) 2007 Nicholas Marriott + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include + +#include "tmux.h" + +void window_copy_init(struct window *); +void window_copy_resize(struct window *, u_int, u_int); +void window_copy_draw(struct window *, struct buffer *, u_int, u_int); +void window_copy_key(struct window *, int); + +void window_copy_draw_position(struct window *, struct screen_draw_ctx *); + +u_int window_copy_line_length(struct window *); +void window_copy_move_cursor(struct window *); +void window_copy_cursor_left(struct window *); +void window_copy_cursor_right(struct window *); +void window_copy_cursor_up(struct window *); +void window_copy_cursor_down(struct window *); +void window_copy_scroll_left(struct window *, u_int); +void window_copy_scroll_right(struct window *, u_int); +void window_copy_scroll_up(struct window *, u_int); +void window_copy_scroll_down(struct window *, u_int); + +const struct window_mode window_copy_mode = { + window_copy_init, + window_copy_resize, + window_copy_draw, + window_copy_key +}; + +struct window_copy_mode_data { + u_int ox; + u_int oy; + u_int cx; + u_int cy; + u_int size; +}; + +void +window_copy_init(struct window *w) +{ + struct window_copy_mode_data *data; + + w->modedata = data = xmalloc(sizeof *data); + data->ox = data->oy = 0; + data->cx = w->screen.cx; + data->cy = w->screen.cy; + data->size = w->screen.hsize; + + w->screen.mode |= (MODE_BACKGROUND|MODE_BGCURSOR); +} + +void +window_copy_resize(unused struct window *w, unused u_int sx, unused u_int sy) +{ +} + +void +window_copy_draw_position(struct window *w, struct screen_draw_ctx *ctx) +{ + struct window_copy_mode_data *data = w->modedata; + char *ptr, buf[32]; + size_t len; + + len = xsnprintf( + buf, sizeof buf, "[%u,%u/%u]", data->ox, data->oy, data->size); + if (len <= screen_size_x(ctx->s)) + ptr = buf; + else { + ptr = buf + len - screen_size_x(ctx->s); + len -= len - screen_size_x(ctx->s); + } + + screen_draw_cells(ctx, 0, 0, screen_size_x(ctx->s) - len); + + screen_draw_move(ctx, screen_size_x(ctx->s) - len, 0); + screen_draw_set_attributes(ctx, 0, status_colour); + buffer_write(ctx->b, ptr, len); +} + +void +window_copy_draw(struct window *w, struct buffer *b, u_int py, u_int ny) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + struct screen_draw_ctx ctx; + + if (s->hsize != data->size) { + data->oy += s->hsize - data->size; + data->size = s->hsize; + } + + screen_draw_start(&ctx, s, b, data->ox, data->oy); + if (py != 0) + screen_draw_lines(&ctx, py, ny); + else if (ny > 1) + screen_draw_lines(&ctx, py + 1, ny - 1); + + if (py == 0) + window_copy_draw_position(w, &ctx); + + screen_draw_stop(&ctx); + + input_store_two(b, CODE_CURSORMOVE, data->cy + 1, data->cx + 1); +} + +void +window_copy_key(struct window *w, int key) +{ + struct window_copy_mode_data *data = w->modedata; + u_int oy, sy; + + sy = screen_size_y(&w->screen); + oy = data->oy; + + switch (key) { + case 'Q': + case 'q': + w->mode = NULL; + xfree(w->modedata); + + w->screen.mode &= ~MODE_BACKGROUND; + + recalculate_sizes(); + server_redraw_window_all(w); + return; + case 'h': + case KEYC_LEFT: + window_copy_cursor_left(w); + return; + case 'l': + case KEYC_RIGHT: + window_copy_cursor_right(w); + return; + case 'k': + case 'K': + case KEYC_UP: + window_copy_cursor_up(w); + return; + case 'j': + case 'J': + case KEYC_DOWN: + window_copy_cursor_down(w); + return; + case '\025': /* C-u */ + case KEYC_PPAGE: + if (data->oy + sy > data->size) + data->oy = data->size; + else + data->oy += sy; + break; + case '\006': /* C-f */ + case KEYC_NPAGE: + if (data->oy < sy) + data->oy = 0; + else + data->oy -= sy; + break; + /* XXX start/end of line, next word, prev word */ + } + if (data->oy != oy) { + server_redraw_window_all(w); + window_copy_move_cursor(w); + } +} + +void +window_copy_move_cursor(struct window *w) +{ + struct window_copy_mode_data *data = w->modedata; + struct client *c; + u_int i; + struct hdr hdr; + size_t size; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (!session_has(c->session, w)) + continue; + + buffer_ensure(c->out, sizeof hdr); + buffer_add(c->out, sizeof hdr); + size = BUFFER_USED(c->out); + + input_store_two( + c->out, CODE_CURSORMOVE, data->cy + 1, data->cx + 1); + + size = BUFFER_USED(c->out) - size; + hdr.type = MSG_DATA; + hdr.size = size; + memcpy(BUFFER_IN(c->out) - size - sizeof hdr, &hdr, sizeof hdr); + } +} + +void +window_copy_cursor_left(struct window *w) +{ + struct window_copy_mode_data *data = w->modedata; + + if (data->ox + data->cx == 0) + return; + + if (data->cx == 0) + window_copy_scroll_right(w, 1); + else + data->cx--; + window_copy_move_cursor(w); +} + +void +window_copy_cursor_right(struct window *w) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + + if (data->ox + data->cx == SHRT_MAX) + return; + + if (data->cx == screen_last_x(s)) + window_copy_scroll_left(w, 1); + else + data->cx++; + window_copy_move_cursor(w); +} + +void +window_copy_cursor_up(struct window *w) +{ + struct window_copy_mode_data *data = w->modedata; + + if (data->cy == 0 && data->oy == data->size) + return; + + if (data->cy == 0) + window_copy_scroll_down(w, 1); + else + data->cy--; + window_copy_move_cursor(w); +} + +void +window_copy_cursor_down(struct window *w) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + + if (data->cy == screen_last_y(s) && data->oy == 0) + return; + + if (data->cy == screen_last_y(s)) + window_copy_scroll_up(w, 1); + else + data->cy++; + window_copy_move_cursor(w); +} + +void +window_copy_scroll_left(struct window *w, u_int nx) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + struct screen_draw_ctx ctx; + struct client *c; + struct buffer *b; + u_int i, j; + struct hdr hdr; + size_t size; + + if (data->ox >= SHRT_MAX - nx) + nx = SHRT_MAX - data->ox; + if (nx == 0) + return; + data->ox += nx; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (!session_has(c->session, w)) + continue; + b = c->out; + + buffer_ensure(b, sizeof hdr); + buffer_add(b, sizeof hdr); + size = BUFFER_USED(b); + + screen_draw_start(&ctx, s, b, data->ox, data->oy); + for (j = 1; j < screen_size_y(s); j++) { + screen_draw_move(&ctx, 0, j); + input_store_one(b, CODE_DELETECHARACTER, nx); + } + for (j = 0; j < nx; j++) + screen_draw_column(&ctx, screen_last_x(s) - j); + window_copy_draw_position(w, &ctx); + screen_draw_stop(&ctx); + + size = BUFFER_USED(b) - size; + hdr.type = MSG_DATA; + hdr.size = size; + memcpy(BUFFER_IN(b) - size - sizeof hdr, &hdr, sizeof hdr); + } +} + +void +window_copy_scroll_right(struct window *w, u_int nx) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + struct screen_draw_ctx ctx; + struct client *c; + struct buffer *b; + u_int i, j; + struct hdr hdr; + size_t size; + + if (data->ox < nx) + nx = data->ox; + if (nx == 0) + return; + data->ox -= nx; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (!session_has(c->session, w)) + continue; + b = c->out; + + buffer_ensure(b, sizeof hdr); + buffer_add(b, sizeof hdr); + size = BUFFER_USED(b); + + screen_draw_start(&ctx, s, b, data->ox, data->oy); + for (j = 1; j < screen_size_y(s); j++) { + screen_draw_move(&ctx, 0, j); + input_store_one(b, CODE_INSERTCHARACTER, nx); + } + for (j = 0; j < nx; j++) + screen_draw_column(&ctx, j); + window_copy_draw_position(w, &ctx); + screen_draw_stop(&ctx); + + size = BUFFER_USED(b) - size; + hdr.type = MSG_DATA; + hdr.size = size; + memcpy(BUFFER_IN(b) - size - sizeof hdr, &hdr, sizeof hdr); + } +} + +void +window_copy_scroll_up(struct window *w, u_int ny) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + struct screen_draw_ctx ctx; + struct client *c; + u_int i; + struct hdr hdr; + size_t size; + + if (data->oy < ny) + ny = data->oy; + if (ny == 0) + return; + data->oy -= ny; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (!session_has(c->session, w)) + continue; + + buffer_ensure(c->out, sizeof hdr); + buffer_add(c->out, sizeof hdr); + size = BUFFER_USED(c->out); + + screen_draw_start(&ctx, s, c->out, data->ox, data->oy); + screen_draw_move(&ctx, 0, 0); + input_store_one(c->out, CODE_DELETELINE, ny); + for (i = 0; i < ny; i++) + screen_draw_line(&ctx, screen_last_y(s) - i); + window_copy_draw_position(w, &ctx); + screen_draw_stop(&ctx); + + size = BUFFER_USED(c->out) - size; + hdr.type = MSG_DATA; + hdr.size = size; + memcpy(BUFFER_IN(c->out) - size - sizeof hdr, &hdr, sizeof hdr); + } +} + +void +window_copy_scroll_down(struct window *w, u_int ny) +{ + struct window_copy_mode_data *data = w->modedata; + struct screen *s = &w->screen; + struct screen_draw_ctx ctx; + struct client *c; + u_int i; + struct hdr hdr; + size_t size; + + if (data->oy >= data->size - ny) + ny = data->size - data->oy; + if (ny == 0) + return; + data->oy += ny; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (!session_has(c->session, w)) + continue; + + buffer_ensure(c->out, sizeof hdr); + buffer_add(c->out, sizeof hdr); + size = BUFFER_USED(c->out); + + screen_draw_start(&ctx, s, c->out, data->ox, data->oy); + screen_draw_move(&ctx, 0, 0); + input_store_one(c->out, CODE_INSERTLINE, ny); + for (i = 1; i < ny + 1; i++) + screen_draw_line(&ctx, i); + window_copy_draw_position(w, &ctx); + screen_draw_stop(&ctx); + + size = BUFFER_USED(c->out) - size; + hdr.type = MSG_DATA; + hdr.size = size; + memcpy(BUFFER_IN(c->out) - size - sizeof hdr, &hdr, sizeof hdr); + } +} diff --git a/window-more.c b/window-more.c index 7e848143..1c0cc9bb 100644 --- a/window-more.c +++ b/window-more.c @@ -1,4 +1,4 @@ -/* $Id: window-more.c,v 1.3 2007-11-22 09:11:20 nicm Exp $ */ +/* $Id: window-more.c,v 1.4 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -74,7 +74,8 @@ window_more_init(struct window *w) ARRAY_INIT(&data->list); data->top = 0; - w->screen.mode |= (MODE_BACKGROUND|MODE_NOCURSOR); + w->screen.mode |= MODE_BACKGROUND; + w->screen.mode &= ~MODE_BGCURSOR; } void @@ -163,7 +164,6 @@ window_more_draw(struct window *w, struct buffer *b, u_int py, u_int ny) window_more_draw_position(w, &ctx); screen_draw_stop(&ctx); - input_store_zero(b, CODE_CURSOROFF); } void @@ -186,7 +186,7 @@ window_more_key(struct window *w, int key) w->mode = NULL; xfree(w->modedata); - w->screen.mode &= ~(MODE_BACKGROUND|MODE_NOCURSOR); + w->screen.mode &= ~MODE_BACKGROUND; recalculate_sizes(); server_redraw_window_all(w); diff --git a/window-scroll.c b/window-scroll.c index 0c9ef2ec..f36bba5e 100644 --- a/window-scroll.c +++ b/window-scroll.c @@ -1,4 +1,4 @@ -/* $Id: window-scroll.c,v 1.11 2007-11-22 09:11:20 nicm Exp $ */ +/* $Id: window-scroll.c,v 1.12 2007-11-22 18:09:43 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -56,7 +56,8 @@ window_scroll_init(struct window *w) data->ox = data->oy = 0; data->size = w->screen.hsize; - w->screen.mode |= (MODE_BACKGROUND|MODE_NOCURSOR); + w->screen.mode |= MODE_BACKGROUND; + w->screen.mode &= ~MODE_BGCURSOR; } void @@ -72,7 +73,7 @@ window_scroll_draw_position(struct window *w, struct screen_draw_ctx *ctx) size_t len; len = xsnprintf( - buf, sizeof buf, "[%u,%u/%u]", data->ox, data->oy, ctx->s->hsize); + buf, sizeof buf, "[%u,%u/%u]", data->ox, data->oy, data->size); if (len <= screen_size_x(ctx->s)) ptr = buf; else { @@ -109,7 +110,6 @@ window_scroll_draw(struct window *w, struct buffer *b, u_int py, u_int ny) window_scroll_draw_position(w, &ctx); screen_draw_stop(&ctx); - input_store_zero(b, CODE_CURSOROFF); } void @@ -130,7 +130,7 @@ window_scroll_key(struct window *w, int key) w->mode = NULL; xfree(w->modedata); - w->screen.mode &= ~(MODE_BACKGROUND|MODE_NOCURSOR); + w->screen.mode &= ~MODE_BACKGROUND; recalculate_sizes(); server_redraw_window_all(w); @@ -286,7 +286,6 @@ window_scroll_right_1(struct window *w) screen_draw_column(&ctx, screen_last_x(s)); window_scroll_draw_position(w, &ctx); screen_draw_stop(&ctx); - input_store_zero(c->out, CODE_CURSOROFF); size = BUFFER_USED(c->out) - size; hdr.type = MSG_DATA; @@ -329,7 +328,6 @@ window_scroll_left_1(struct window *w) screen_draw_column(&ctx, 0); window_scroll_draw_position(w, &ctx); screen_draw_stop(&ctx); - input_store_zero(c->out, CODE_CURSOROFF); size = BUFFER_USED(c->out) - size; hdr.type = MSG_DATA;