aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornicm <nicm>2021-02-05 12:29:18 +0000
committernicm <nicm>2021-02-05 12:29:18 +0000
commit3dddc11603b1bd66b5586b47795716e87921a096 (patch)
tree52a11e2f6c59655ccdb575ffd5ed4ab72d9b97fd
parentbe471c328ea0ae04026e4ff32fda7b7f11c74255 (diff)
downloadrtmux-3dddc11603b1bd66b5586b47795716e87921a096.tar.gz
rtmux-3dddc11603b1bd66b5586b47795716e87921a096.tar.bz2
rtmux-3dddc11603b1bd66b5586b47795716e87921a096.zip
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.
-rw-r--r--grid.c4
-rw-r--r--screen-redraw.c24
-rw-r--r--tmux.14
-rw-r--r--tmux.h1
-rw-r--r--tty-term.c1
5 files changed, 27 insertions, 7 deletions
diff --git a/grid.c b/grid.c
index cce304c9..7744587a 100644
--- a/grid.c
+++ b/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++;
diff --git a/screen-redraw.c b/screen-redraw.c
index 47c1a838..6ddabc52 100644
--- a/screen-redraw.c
+++ b/screen-redraw.c
@@ -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. */
diff --git a/tmux.1 b/tmux.1
index 530cd559..090b9436 100644
--- a/tmux.1
+++ b/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;
diff --git a/tmux.h b/tmux.h
index ce45cece..1cca8c8f 100644
--- a/tmux.h
+++ b/tmux.h
@@ -261,6 +261,7 @@ enum tty_code_code {
TTYC_AX,
TTYC_BCE,
TTYC_BEL,
+ TTYC_BIDI,
TTYC_BLINK,
TTYC_BOLD,
TTYC_CIVIS,
diff --git a/tty-term.c b/tty-term.c
index b4feea60..b989328c 100644
--- a/tty-term.c
+++ b/tty-term.c
@@ -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" },