aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-07-26 21:13:47 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-07-26 21:13:47 +0000
commit55d8c01c339db6dd66ed85ce3da5273632da6ca5 (patch)
treeb8d02cbddb422ffcf1649751ef1f24fe9261ae14
parent6b3b852ebcaa61d3a03b918370939cfd6af8c191 (diff)
downloadrtmux-55d8c01c339db6dd66ed85ce3da5273632da6ca5.tar.gz
rtmux-55d8c01c339db6dd66ed85ce3da5273632da6ca5.tar.bz2
rtmux-55d8c01c339db6dd66ed85ce3da5273632da6ca5.zip
Calculate the space available for the prompt buffer and the cursor position
correctly, and make it work when the screen is not wide enough. Noticed by Kalle Olavi Niemitalo.
-rw-r--r--status.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/status.c b/status.c
index 46d05fd5..24d91204 100644
--- a/status.c
+++ b/status.c
@@ -645,7 +645,7 @@ status_prompt_redraw(struct client *c)
struct screen_write_ctx ctx;
struct session *s = c->session;
struct screen old_status;
- size_t i, size, left, len, offset, n;
+ size_t i, size, left, len, off, n;
char ch;
struct grid_cell gc;
@@ -653,7 +653,7 @@ status_prompt_redraw(struct client *c)
return (0);
memcpy(&old_status, &c->status, sizeof old_status);
screen_init(&c->status, c->tty.sx, 1, 0);
- offset = 0;
+ off = 0;
len = strlen(c->prompt_string);
if (len > c->tty.sx)
@@ -674,7 +674,7 @@ status_prompt_redraw(struct client *c)
if (c->prompt_index < left)
size = strlen(c->prompt_buffer);
else {
- offset = c->prompt_index - left - 1;
+ off = c->prompt_index - left + 1;
if (c->prompt_index == strlen(c->prompt_buffer))
left--;
size = left;
@@ -687,27 +687,27 @@ status_prompt_redraw(struct client *c)
screen_write_putc(&ctx, &gc, '*');
} else {
screen_write_puts(&ctx, &gc,
- "%.*s", (int) left, c->prompt_buffer + offset);
+ "%.*s", (int) left, c->prompt_buffer + off);
}
for (i = len + size; i < c->tty.sx; i++)
screen_write_putc(&ctx, &gc, ' ');
- }
- /* Draw a fake cursor. */
- screen_write_cursormove(&ctx, len + c->prompt_index - offset, 0);
- if (c->prompt_index == strlen(c->prompt_buffer))
- ch = ' ';
- else {
- if (c->prompt_flags & PROMPT_HIDDEN)
- ch = '*';
- else
- ch = c->prompt_buffer[c->prompt_index];
+ /* Draw a fake cursor. */
+ screen_write_cursormove(&ctx, len + c->prompt_index - off, 0);
+ if (c->prompt_index == strlen(c->prompt_buffer))
+ ch = ' ';
+ else {
+ if (c->prompt_flags & PROMPT_HIDDEN)
+ ch = '*';
+ else
+ ch = c->prompt_buffer[c->prompt_index];
+ }
+ if (ch == '\0')
+ ch = ' ';
+ gc.attr ^= GRID_ATTR_REVERSE;
+ screen_write_putc(&ctx, &gc, ch);
}
- if (ch == '\0')
- ch = ' ';
- gc.attr ^= GRID_ATTR_REVERSE;
- screen_write_putc(&ctx, &gc, ch);
screen_write_stop(&ctx);