mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-26 00:29:46 +01:00
Display UTF-8 properly in status line messages and prompt. Cursor handling is
still way off though.
This commit is contained in:
parent
070e3b4178
commit
5d56225d95
49
status.c
49
status.c
@ -705,13 +705,16 @@ status_message_redraw(struct client *c)
|
|||||||
struct screen old_status;
|
struct screen old_status;
|
||||||
size_t len;
|
size_t len;
|
||||||
struct grid_cell gc;
|
struct grid_cell gc;
|
||||||
|
int utf8flag;
|
||||||
|
|
||||||
if (c->tty.sx == 0 || c->tty.sy == 0)
|
if (c->tty.sx == 0 || c->tty.sy == 0)
|
||||||
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);
|
||||||
|
|
||||||
len = strlen(c->message_string);
|
utf8flag = options_get_number(&s->options, "status-utf8");
|
||||||
|
|
||||||
|
len = screen_write_strlen(utf8flag, "%s", c->message_string);
|
||||||
if (len > c->tty.sx)
|
if (len > c->tty.sx)
|
||||||
len = c->tty.sx;
|
len = c->tty.sx;
|
||||||
|
|
||||||
@ -723,7 +726,7 @@ status_message_redraw(struct client *c)
|
|||||||
screen_write_start(&ctx, NULL, &c->status);
|
screen_write_start(&ctx, NULL, &c->status);
|
||||||
|
|
||||||
screen_write_cursormove(&ctx, 0, 0);
|
screen_write_cursormove(&ctx, 0, 0);
|
||||||
screen_write_puts(&ctx, &gc, "%.*s", (int) len, c->message_string);
|
screen_write_nputs(&ctx, len, &gc, utf8flag, "%s", c->message_string);
|
||||||
for (; len < c->tty.sx; len++)
|
for (; len < c->tty.sx; len++)
|
||||||
screen_write_putc(&ctx, &gc, ' ');
|
screen_write_putc(&ctx, &gc, ' ');
|
||||||
|
|
||||||
@ -812,22 +815,24 @@ status_prompt_update(struct client *c, const char *msg)
|
|||||||
int
|
int
|
||||||
status_prompt_redraw(struct client *c)
|
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, off;
|
size_t i, size, left, len, off;
|
||||||
char ch;
|
struct grid_cell gc, *gcp;
|
||||||
struct grid_cell gc;
|
int utf8flag;
|
||||||
|
|
||||||
if (c->tty.sx == 0 || c->tty.sy == 0)
|
if (c->tty.sx == 0 || c->tty.sy == 0)
|
||||||
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);
|
||||||
off = 0;
|
|
||||||
|
|
||||||
len = strlen(c->prompt_string);
|
utf8flag = options_get_number(&s->options, "status-utf8");
|
||||||
|
|
||||||
|
len = screen_write_strlen(utf8flag, "%s", c->prompt_string);
|
||||||
if (len > c->tty.sx)
|
if (len > c->tty.sx)
|
||||||
len = c->tty.sx;
|
len = c->tty.sx;
|
||||||
|
off = 0;
|
||||||
|
|
||||||
memcpy(&gc, &grid_default_cell, sizeof gc);
|
memcpy(&gc, &grid_default_cell, sizeof gc);
|
||||||
colour_set_fg(&gc, options_get_number(&s->options, "message-fg"));
|
colour_set_fg(&gc, options_get_number(&s->options, "message-fg"));
|
||||||
@ -837,35 +842,31 @@ status_prompt_redraw(struct client *c)
|
|||||||
screen_write_start(&ctx, NULL, &c->status);
|
screen_write_start(&ctx, NULL, &c->status);
|
||||||
|
|
||||||
screen_write_cursormove(&ctx, 0, 0);
|
screen_write_cursormove(&ctx, 0, 0);
|
||||||
screen_write_puts(&ctx, &gc, "%.*s", (int) len, c->prompt_string);
|
screen_write_nputs(&ctx, len, &gc, utf8flag, "%s", c->prompt_string);
|
||||||
|
|
||||||
left = c->tty.sx - len;
|
left = c->tty.sx - len;
|
||||||
if (left != 0) {
|
if (left != 0) {
|
||||||
if (c->prompt_index < left)
|
size = screen_write_strlen(utf8flag, "%s", c->prompt_buffer);
|
||||||
size = strlen(c->prompt_buffer);
|
if (c->prompt_index >= left) {
|
||||||
else {
|
|
||||||
off = c->prompt_index - left + 1;
|
off = c->prompt_index - left + 1;
|
||||||
if (c->prompt_index == strlen(c->prompt_buffer))
|
if (c->prompt_index == size)
|
||||||
left--;
|
left--;
|
||||||
size = left;
|
size = left;
|
||||||
}
|
}
|
||||||
screen_write_puts(
|
screen_write_nputs(
|
||||||
&ctx, &gc, "%.*s", (int) left, c->prompt_buffer + off);
|
&ctx, left, &gc, utf8flag, "%s", 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. */
|
|
||||||
ch = ' ';
|
|
||||||
screen_write_cursormove(&ctx, len + c->prompt_index - off, 0);
|
|
||||||
if (c->prompt_index < strlen(c->prompt_buffer))
|
|
||||||
ch = c->prompt_buffer[c->prompt_index];
|
|
||||||
gc.attr ^= GRID_ATTR_REVERSE;
|
|
||||||
screen_write_putc(&ctx, &gc, ch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_write_stop(&ctx);
|
screen_write_stop(&ctx);
|
||||||
|
|
||||||
|
/* Apply fake cursor. */
|
||||||
|
off = len + c->prompt_index - off;
|
||||||
|
gcp = grid_view_get_cell(c->status.grid, off, 0);
|
||||||
|
gcp->attr ^= GRID_ATTR_REVERSE;
|
||||||
|
|
||||||
if (grid_compare(c->status.grid, old_status.grid) == 0) {
|
if (grid_compare(c->status.grid, old_status.grid) == 0) {
|
||||||
screen_free(&old_status);
|
screen_free(&old_status);
|
||||||
return (0);
|
return (0);
|
||||||
|
Loading…
Reference in New Issue
Block a user