st-nowide-20241013-0.8.2.diff (3230B)
1 From 6fb87a9dbdbdc344fec14d026adf2c84853794b3 Mon Sep 17 00:00:00 2001 2 From: 8dcc <8dcc.git@gmail.com> 3 Date: Sun, 13 Oct 2024 14:45:12 +0200 4 Subject: [PATCH] Allow user to not render wide characters 5 6 This patch adds a new terminal mode, NOWIDE. If it's enabled, wide characters 7 will be replaced with a faint question mark. This mode can be enabled or 8 disabled by default with the `renderwide' variable in <config.def.h>, and can be 9 toggled with a keybind (Ctrl+Shift+W by default). 10 11 This mode is specially useful if your font doesn't support wide characters, 12 since rendering them usually makes the terminal really, really slow, specially 13 when scrolling. 14 15 This patch is intended for ST 0.8.2, but it should be easy to port it to newer 16 versions. 17 --- 18 config.def.h | 7 +++++++ 19 st.c | 17 ++++++++++++++++- 20 st.h | 2 ++ 21 3 files changed, 25 insertions(+), 1 deletion(-) 22 23 diff --git a/config.def.h b/config.def.h 24 index 0e01717..bc3f06f 100644 25 --- a/config.def.h 26 +++ b/config.def.h 27 @@ -56,6 +56,12 @@ static unsigned int blinktimeout = 800; 28 */ 29 static unsigned int cursorthickness = 2; 30 31 +/* 32 + * should we render wide characters by default? Can be toggled with the 33 + * `togglewide' shortcut below. 34 + */ 35 +int renderwide = 1; 36 + 37 /* 38 * bell volume. It must be a value between -100 and 100. Use 0 for disabling 39 * it 40 @@ -178,6 +184,7 @@ static Shortcut shortcuts[] = { 41 { TERMMOD, XK_Y, selpaste, {.i = 0} }, 42 { ShiftMask, XK_Insert, selpaste, {.i = 0} }, 43 { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, 44 + { TERMMOD, XK_W, togglewide, {.i = 0} }, 45 }; 46 47 /* 48 diff --git a/st.c b/st.c 49 index b8e6077..c583b5c 100644 50 --- a/st.c 51 +++ b/st.c 52 @@ -52,6 +52,7 @@ enum term_mode { 53 MODE_PRINT = 1 << 5, 54 MODE_UTF8 = 1 << 6, 55 MODE_SIXEL = 1 << 7, 56 + MODE_NOWIDE = 1 << 8, 57 }; 58 59 enum cursor_movement { 60 @@ -1029,6 +1030,8 @@ treset(void) 61 term.top = 0; 62 term.bot = term.row - 1; 63 term.mode = MODE_WRAP|MODE_UTF8; 64 + if (!renderwide) 65 + term.mode |= MODE_NOWIDE; 66 memset(term.trantbl, CS_USA, sizeof(term.trantbl)); 67 term.charset = 0; 68 69 @@ -1980,6 +1983,12 @@ tprinter(char *s, size_t len) 70 } 71 } 72 73 +void 74 +togglewide(const Arg *arg) 75 +{ 76 + term.mode ^= MODE_NOWIDE; 77 +} 78 + 79 void 80 toggleprinter(const Arg *arg) 81 { 82 @@ -2427,7 +2436,13 @@ check_control_code: 83 tsetchar(u, &term.c.attr, term.c.x, term.c.y); 84 85 if (width == 2) { 86 - gp->mode |= ATTR_WIDE; 87 + if (IS_SET(MODE_NOWIDE)) { 88 + gp[0].u = '?'; 89 + gp[0].mode |= ATTR_FAINT; 90 + } else { 91 + gp[0].mode |= ATTR_WIDE; 92 + } 93 + 94 if (term.c.x+1 < term.col) { 95 gp[1].u = '\0'; 96 gp[1].mode = ATTR_WDUMMY; 97 diff --git a/st.h b/st.h 98 index 38c61c4..0691246 100644 99 --- a/st.h 100 +++ b/st.h 101 @@ -83,6 +83,7 @@ void draw(void); 102 void printscreen(const Arg *); 103 void printsel(const Arg *); 104 void sendbreak(const Arg *); 105 +void togglewide(const Arg *); 106 void toggleprinter(const Arg *); 107 108 int tattrset(int); 109 @@ -116,6 +117,7 @@ extern char *stty_args; 110 extern char *vtiden; 111 extern char *worddelimiters; 112 extern int allowaltscreen; 113 +extern int renderwide; 114 extern char *termname; 115 extern unsigned int tabspaces; 116 extern unsigned int defaultfg; 117 -- 118 2.46.2 119