mirror of
https://github.com/tmux/tmux.git
synced 2024-12-04 19:58:48 +00:00
Send Unicode directional isolate characters around horizontal pane
borders if the terminal support UTF-8 and an extension terminfo(5) capability "Bidi" is present. On terminals with BiDi support (ie, VTE) this seems to be enough to display right-to-left text acceptably enough to be usable (with some caveats about the mouse position). Requested by and with help from Mahmoud Elagdar in GitHub issue 2425.
This commit is contained in:
parent
be471c328e
commit
3dddc11603
4
grid.c
4
grid.c
@ -1045,14 +1045,14 @@ grid_duplicate_lines(struct grid *dst, u_int dy, struct grid *src, u_int sy,
|
||||
srcl->cellsize * sizeof *dstl->celldata);
|
||||
} else
|
||||
dstl->celldata = NULL;
|
||||
|
||||
if (srcl->extdsize != 0) {
|
||||
dstl->extdsize = srcl->extdsize;
|
||||
dstl->extddata = xreallocarray(NULL, dstl->extdsize,
|
||||
sizeof *dstl->extddata);
|
||||
memcpy(dstl->extddata, srcl->extddata, dstl->extdsize *
|
||||
sizeof *dstl->extddata);
|
||||
}
|
||||
} else
|
||||
dstl->extddata = NULL;
|
||||
|
||||
sy++;
|
||||
dy++;
|
||||
|
@ -32,8 +32,8 @@ static void screen_redraw_set_context(struct client *,
|
||||
struct screen_redraw_ctx *);
|
||||
|
||||
#define CELL_INSIDE 0
|
||||
#define CELL_LEFTRIGHT 1
|
||||
#define CELL_TOPBOTTOM 2
|
||||
#define CELL_TOPBOTTOM 1
|
||||
#define CELL_LEFTRIGHT 2
|
||||
#define CELL_TOPLEFT 3
|
||||
#define CELL_TOPRIGHT 4
|
||||
#define CELL_BOTTOMLEFT 5
|
||||
@ -47,6 +47,9 @@ static void screen_redraw_set_context(struct client *,
|
||||
|
||||
#define CELL_BORDERS " xqlkmjwvtun~"
|
||||
|
||||
#define START_ISOLATE "\342\201\246"
|
||||
#define END_ISOLATE "\342\201\251"
|
||||
|
||||
static const struct utf8_data screen_redraw_double_borders[] = {
|
||||
{ "", 0, 0, 0 },
|
||||
{ "\342\225\221", 0, 3, 1 }, /* U+2551 */
|
||||
@ -299,7 +302,7 @@ screen_redraw_type_of_cell(struct client *c, u_int px, u_int py,
|
||||
case 13: /* 1101, left right bottom */
|
||||
return (CELL_TOPJOIN);
|
||||
case 12: /* 1100, left right */
|
||||
return (CELL_TOPBOTTOM);
|
||||
return (CELL_LEFTRIGHT);
|
||||
case 11: /* 1011, left top bottom */
|
||||
return (CELL_RIGHTJOIN);
|
||||
case 10: /* 1010, left top */
|
||||
@ -313,7 +316,7 @@ screen_redraw_type_of_cell(struct client *c, u_int px, u_int py,
|
||||
case 5: /* 0101, right bottom */
|
||||
return (CELL_TOPLEFT);
|
||||
case 3: /* 0011, top bottom */
|
||||
return (CELL_LEFTRIGHT);
|
||||
return (CELL_TOPBOTTOM);
|
||||
}
|
||||
return (CELL_OUTSIDE);
|
||||
}
|
||||
@ -680,7 +683,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j)
|
||||
struct tty *tty = &c->tty;
|
||||
struct window_pane *wp;
|
||||
u_int cell_type, x = ctx->ox + i, y = ctx->oy + j;
|
||||
int pane_status = ctx->pane_status;
|
||||
int pane_status = ctx->pane_status, isolates;
|
||||
struct grid_cell gc;
|
||||
const struct grid_cell *tmp;
|
||||
|
||||
@ -705,11 +708,22 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j)
|
||||
}
|
||||
screen_redraw_border_set(wp, ctx->pane_lines, cell_type, &gc);
|
||||
|
||||
if (cell_type == CELL_TOPBOTTOM &&
|
||||
(c->flags & CLIENT_UTF8) &&
|
||||
tty_term_has(tty->term, TTYC_BIDI))
|
||||
isolates = 1;
|
||||
else
|
||||
isolates = 0;
|
||||
|
||||
if (ctx->statustop)
|
||||
tty_cursor(tty, i, ctx->statuslines + j);
|
||||
else
|
||||
tty_cursor(tty, i, j);
|
||||
if (isolates)
|
||||
tty_puts(tty, END_ISOLATE);
|
||||
tty_cell(tty, &gc, &grid_default_cell, NULL);
|
||||
if (isolates)
|
||||
tty_puts(tty, START_ISOLATE);
|
||||
}
|
||||
|
||||
/* Draw the borders. */
|
||||
|
4
tmux.1
4
tmux.1
@ -5953,6 +5953,10 @@ option should be used.
|
||||
An existing extension that tells
|
||||
.Nm
|
||||
the terminal supports default colours.
|
||||
.It Em \&Bidi
|
||||
Tell
|
||||
.Nm
|
||||
that the terminal supports the VTE bidirectional text extensions.
|
||||
.It Em \&Cs , Cr
|
||||
Set the cursor colour.
|
||||
The first takes a single string argument and is used to set the colour;
|
||||
|
1
tmux.h
1
tmux.h
@ -261,6 +261,7 @@ enum tty_code_code {
|
||||
TTYC_AX,
|
||||
TTYC_BCE,
|
||||
TTYC_BEL,
|
||||
TTYC_BIDI,
|
||||
TTYC_BLINK,
|
||||
TTYC_BOLD,
|
||||
TTYC_CIVIS,
|
||||
|
@ -58,6 +58,7 @@ static const struct tty_term_code_entry tty_term_codes[] = {
|
||||
[TTYC_AX] = { TTYCODE_FLAG, "AX" },
|
||||
[TTYC_BCE] = { TTYCODE_FLAG, "bce" },
|
||||
[TTYC_BEL] = { TTYCODE_STRING, "bel" },
|
||||
[TTYC_BIDI] = { TTYCODE_STRING, "Bidi" },
|
||||
[TTYC_BLINK] = { TTYCODE_STRING, "blink" },
|
||||
[TTYC_BOLD] = { TTYCODE_STRING, "bold" },
|
||||
[TTYC_CIVIS] = { TTYCODE_STRING, "civis" },
|
||||
|
Loading…
Reference in New Issue
Block a user