mirror of
https://github.com/tmux/tmux.git
synced 2024-11-16 01:18:52 +00:00
Sync OpenBSD patchset 183:
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.
This commit is contained in:
parent
2dda197980
commit
2aa4d47312
38
status.c
38
status.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: status.c,v 1.101 2009-07-22 17:31:20 tcunha Exp $ */
|
/* $Id: status.c,v 1.102 2009-07-28 22:32:15 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -645,7 +645,7 @@ status_prompt_redraw(struct client *c)
|
|||||||
struct screen_write_ctx ctx;
|
struct screen_write_ctx ctx;
|
||||||
struct session *s = c->session;
|
struct session *s = c->session;
|
||||||
struct screen old_status;
|
struct screen old_status;
|
||||||
size_t i, size, left, len, offset, n;
|
size_t i, size, left, len, off, n;
|
||||||
char ch;
|
char ch;
|
||||||
struct grid_cell gc;
|
struct grid_cell gc;
|
||||||
|
|
||||||
@ -653,7 +653,7 @@ status_prompt_redraw(struct client *c)
|
|||||||
return (0);
|
return (0);
|
||||||
memcpy(&old_status, &c->status, sizeof old_status);
|
memcpy(&old_status, &c->status, sizeof old_status);
|
||||||
screen_init(&c->status, c->tty.sx, 1, 0);
|
screen_init(&c->status, c->tty.sx, 1, 0);
|
||||||
offset = 0;
|
off = 0;
|
||||||
|
|
||||||
len = strlen(c->prompt_string);
|
len = strlen(c->prompt_string);
|
||||||
if (len > c->tty.sx)
|
if (len > c->tty.sx)
|
||||||
@ -674,7 +674,7 @@ status_prompt_redraw(struct client *c)
|
|||||||
if (c->prompt_index < left)
|
if (c->prompt_index < left)
|
||||||
size = strlen(c->prompt_buffer);
|
size = strlen(c->prompt_buffer);
|
||||||
else {
|
else {
|
||||||
offset = c->prompt_index - left - 1;
|
off = c->prompt_index - left + 1;
|
||||||
if (c->prompt_index == strlen(c->prompt_buffer))
|
if (c->prompt_index == strlen(c->prompt_buffer))
|
||||||
left--;
|
left--;
|
||||||
size = left;
|
size = left;
|
||||||
@ -687,27 +687,27 @@ status_prompt_redraw(struct client *c)
|
|||||||
screen_write_putc(&ctx, &gc, '*');
|
screen_write_putc(&ctx, &gc, '*');
|
||||||
} else {
|
} else {
|
||||||
screen_write_puts(&ctx, &gc,
|
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++)
|
for (i = len + size; i < c->tty.sx; i++)
|
||||||
screen_write_putc(&ctx, &gc, ' ');
|
screen_write_putc(&ctx, &gc, ' ');
|
||||||
}
|
|
||||||
|
|
||||||
/* Draw a fake cursor. */
|
/* Draw a fake cursor. */
|
||||||
screen_write_cursormove(&ctx, len + c->prompt_index - offset, 0);
|
screen_write_cursormove(&ctx, len + c->prompt_index - off, 0);
|
||||||
if (c->prompt_index == strlen(c->prompt_buffer))
|
if (c->prompt_index == strlen(c->prompt_buffer))
|
||||||
ch = ' ';
|
ch = ' ';
|
||||||
else {
|
else {
|
||||||
if (c->prompt_flags & PROMPT_HIDDEN)
|
if (c->prompt_flags & PROMPT_HIDDEN)
|
||||||
ch = '*';
|
ch = '*';
|
||||||
else
|
else
|
||||||
ch = c->prompt_buffer[c->prompt_index];
|
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);
|
screen_write_stop(&ctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user