mirror of
https://github.com/tmux/tmux.git
synced 2025-04-22 04:18:47 +00:00
Simplify character replacement on non-UTF-8 terminals and make a common
function.
This commit is contained in:
parent
c03565611e
commit
2c5a6f9af5
90
tty.c
90
tty.c
@ -878,12 +878,37 @@ tty_draw_pane(struct tty *tty, const struct window_pane *wp, u_int py, u_int ox,
|
|||||||
tty_draw_line(tty, wp, wp->screen, py, ox, oy);
|
tty_draw_line(tty, wp, wp->screen, py, ox, oy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct grid_cell *
|
||||||
|
tty_check_codeset(struct tty *tty, const struct grid_cell *gc)
|
||||||
|
{
|
||||||
|
static struct grid_cell new;
|
||||||
|
u_int n;
|
||||||
|
|
||||||
|
/* Characters less than 0x7f are always fine, no matter what. */
|
||||||
|
if (gc->data.size == 1 && *gc->data.data < 0x7f)
|
||||||
|
return (gc);
|
||||||
|
|
||||||
|
/* UTF-8 terminal and a UTF-8 character - fine. */
|
||||||
|
if (tty->flags & TTY_UTF8)
|
||||||
|
return (gc);
|
||||||
|
|
||||||
|
/* Replace by the right number of underscores. */
|
||||||
|
n = gc->data.width;
|
||||||
|
if (n > UTF8_SIZE)
|
||||||
|
n = UTF8_SIZE;
|
||||||
|
memcpy(&new, gc, sizeof new);
|
||||||
|
new.data.size = n;
|
||||||
|
memset(new.data.data, '_', n);
|
||||||
|
return (&new);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_draw_line(struct tty *tty, const struct window_pane *wp,
|
tty_draw_line(struct tty *tty, const struct window_pane *wp,
|
||||||
struct screen *s, u_int py, u_int ox, u_int oy)
|
struct screen *s, u_int py, u_int ox, u_int oy)
|
||||||
{
|
{
|
||||||
struct grid *gd = s->grid;
|
struct grid *gd = s->grid;
|
||||||
struct grid_cell gc, last;
|
struct grid_cell gc, last;
|
||||||
|
const struct grid_cell *gcp;
|
||||||
u_int i, j, ux, sx, nx, width;
|
u_int i, j, ux, sx, nx, width;
|
||||||
int flags, cleared = 0;
|
int flags, cleared = 0;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
@ -934,18 +959,15 @@ tty_draw_line(struct tty *tty, const struct window_pane *wp,
|
|||||||
|
|
||||||
for (i = 0; i < sx; i++) {
|
for (i = 0; i < sx; i++) {
|
||||||
grid_view_get_cell(gd, i, py, &gc);
|
grid_view_get_cell(gd, i, py, &gc);
|
||||||
|
gcp = tty_check_codeset(tty, &gc);
|
||||||
if (len != 0 &&
|
if (len != 0 &&
|
||||||
(((~tty->flags & TTY_UTF8) &&
|
((gcp->attr & GRID_ATTR_CHARSET) ||
|
||||||
(gc.data.size != 1 ||
|
gcp->flags != last.flags ||
|
||||||
*gc.data.data >= 0x7f ||
|
gcp->attr != last.attr ||
|
||||||
gc.data.width != 1)) ||
|
gcp->fg != last.fg ||
|
||||||
(gc.attr & GRID_ATTR_CHARSET) ||
|
gcp->bg != last.bg ||
|
||||||
gc.flags != last.flags ||
|
ux + width + gcp->data.width >= screen_size_x(s) ||
|
||||||
gc.attr != last.attr ||
|
(sizeof buf) - len < gcp->data.size)) {
|
||||||
gc.fg != last.fg ||
|
|
||||||
gc.bg != last.bg ||
|
|
||||||
ux + width + gc.data.width >= screen_size_x(s) ||
|
|
||||||
(sizeof buf) - len < gc.data.size)) {
|
|
||||||
tty_attributes(tty, &last, wp);
|
tty_attributes(tty, &last, wp);
|
||||||
tty_putn(tty, buf, len, width);
|
tty_putn(tty, buf, len, width);
|
||||||
ux += width;
|
ux += width;
|
||||||
@ -954,35 +976,21 @@ tty_draw_line(struct tty *tty, const struct window_pane *wp,
|
|||||||
width = 0;
|
width = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gc.flags & GRID_FLAG_SELECTED)
|
if (gcp->flags & GRID_FLAG_SELECTED)
|
||||||
screen_select_cell(s, &last, &gc);
|
screen_select_cell(s, &last, &gc);
|
||||||
else
|
else
|
||||||
memcpy(&last, &gc, sizeof last);
|
memcpy(&last, &gc, sizeof last);
|
||||||
if (ux + gc.data.width > screen_size_x(s))
|
if (ux + gcp->data.width > screen_size_x(s))
|
||||||
for (j = 0; j < gc.data.width; j++) {
|
for (j = 0; j < gcp->data.width; j++) {
|
||||||
if (ux + j > screen_size_x(s))
|
if (ux + j > screen_size_x(s))
|
||||||
break;
|
break;
|
||||||
tty_putc(tty, ' ');
|
tty_putc(tty, ' ');
|
||||||
ux++;
|
ux++;
|
||||||
}
|
}
|
||||||
else if (((~tty->flags & TTY_UTF8) &&
|
else {
|
||||||
(gc.data.size != 1 ||
|
memcpy(buf + len, gcp->data.data, gcp->data.size);
|
||||||
*gc.data.data >= 0x7f ||
|
len += gcp->data.size;
|
||||||
gc.data.width != 1)) ||
|
width += gcp->data.width;
|
||||||
(gc.attr & GRID_ATTR_CHARSET)) {
|
|
||||||
tty_attributes(tty, &last, wp);
|
|
||||||
if (~tty->flags & TTY_UTF8) {
|
|
||||||
for (j = 0; j < gc.data.width; j++)
|
|
||||||
tty_putc(tty, '_');
|
|
||||||
} else {
|
|
||||||
for (j = 0; j < gc.data.size; j++)
|
|
||||||
tty_putc(tty, gc.data.data[j]);
|
|
||||||
}
|
|
||||||
ux += gc.data.width;
|
|
||||||
} else {
|
|
||||||
memcpy(buf + len, gc.data.data, gc.data.size);
|
|
||||||
len += gc.data.size;
|
|
||||||
width += gc.data.width;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (len != 0) {
|
if (len != 0) {
|
||||||
@ -1409,7 +1417,7 @@ static void
|
|||||||
tty_cell(struct tty *tty, const struct grid_cell *gc,
|
tty_cell(struct tty *tty, const struct grid_cell *gc,
|
||||||
const struct window_pane *wp)
|
const struct window_pane *wp)
|
||||||
{
|
{
|
||||||
u_int i;
|
const struct grid_cell *gcp;
|
||||||
|
|
||||||
/* Skip last character if terminal is stupid. */
|
/* Skip last character if terminal is stupid. */
|
||||||
if ((tty->term->flags & TERM_EARLYWRAP) &&
|
if ((tty->term->flags & TERM_EARLYWRAP) &&
|
||||||
@ -1425,22 +1433,16 @@ tty_cell(struct tty *tty, const struct grid_cell *gc,
|
|||||||
tty_attributes(tty, gc, wp);
|
tty_attributes(tty, gc, wp);
|
||||||
|
|
||||||
/* Get the cell and if ASCII write with putc to do ACS translation. */
|
/* Get the cell and if ASCII write with putc to do ACS translation. */
|
||||||
if (gc->data.size == 1) {
|
gcp = tty_check_codeset(tty, gc);
|
||||||
if (*gc->data.data < 0x20 || *gc->data.data == 0x7f)
|
if (gcp->data.size == 1) {
|
||||||
|
if (*gcp->data.data < 0x20 || *gcp->data.data == 0x7f)
|
||||||
return;
|
return;
|
||||||
tty_putc(tty, *gc->data.data);
|
tty_putc(tty, *gcp->data.data);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If not UTF-8, write _. */
|
|
||||||
if (!(tty->flags & TTY_UTF8)) {
|
|
||||||
for (i = 0; i < gc->data.width; i++)
|
|
||||||
tty_putc(tty, '_');
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write the data. */
|
/* Write the data. */
|
||||||
tty_putn(tty, gc->data.data, gc->data.size, gc->data.width);
|
tty_putn(tty, gcp->data.data, gcp->data.size, gcp->data.width);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user