commit 4048cfa317cbdbb4523b014f7734352316783f99
parent 1e8125f674f7f90ccdf922832395af2bfe4f6f62
Author: 8dcc <8dcc.git@gmail.com>
Date:   Sun, 13 Oct 2024 15:52:15 +0200
[st][patch] Add nowide patch
Diffstat:
2 files changed, 143 insertions(+), 0 deletions(-)
diff --git a/st.suckless.org/patches/nowide/index.md b/st.suckless.org/patches/nowide/index.md
@@ -0,0 +1,24 @@
+nowide
+======
+
+Description
+-----------
+This patch adds a new terminal mode, /NOWIDE/. If it's enabled, wide characters
+will be replaced with a faint question mark. This mode can be enabled or
+disabled by default with the `renderwide` variable in `config.def.h`, and can be
+toggled with a keybind (`Ctrl+Shift+W` by default).
+
+This mode is specially useful if your font doesn't support wide characters,
+since rendering them usually makes the terminal really, really slow, specially
+when scrolling.
+
+This patch is intended for ST 0.8.2, but it should be easy to port it to newer
+versions.
+
+Download
+--------
+* [st-nowide-20241013-0.8.2.diff](st-nowide-20241013-0.8.2.diff)
+
+Authors
+-------
+* [8dcc](https://github.com/8dcc) - <8dcc.git@gmail.com>
diff --git a/st.suckless.org/patches/nowide/st-nowide-20241013-0.8.2.diff b/st.suckless.org/patches/nowide/st-nowide-20241013-0.8.2.diff
@@ -0,0 +1,119 @@
+From 6fb87a9dbdbdc344fec14d026adf2c84853794b3 Mon Sep 17 00:00:00 2001
+From: 8dcc <8dcc.git@gmail.com>
+Date: Sun, 13 Oct 2024 14:45:12 +0200
+Subject: [PATCH] Allow user to not render wide characters
+
+This patch adds a new terminal mode, NOWIDE. If it's enabled, wide characters
+will be replaced with a faint question mark. This mode can be enabled or
+disabled by default with the `renderwide' variable in <config.def.h>, and can be
+toggled with a keybind (Ctrl+Shift+W by default).
+
+This mode is specially useful if your font doesn't support wide characters,
+since rendering them usually makes the terminal really, really slow, specially
+when scrolling.
+
+This patch is intended for ST 0.8.2, but it should be easy to port it to newer
+versions.
+---
+ config.def.h |  7 +++++++
+ st.c         | 17 ++++++++++++++++-
+ st.h         |  2 ++
+ 3 files changed, 25 insertions(+), 1 deletion(-)
+
+diff --git a/config.def.h b/config.def.h
+index 0e01717..bc3f06f 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -56,6 +56,12 @@ static unsigned int blinktimeout = 800;
+  */
+ static unsigned int cursorthickness = 2;
+ 
++/*
++ * should we render wide characters by default? Can be toggled with the
++ * `togglewide' shortcut below.
++ */
++int renderwide = 1;
++
+ /*
+  * bell volume. It must be a value between -100 and 100. Use 0 for disabling
+  * it
+@@ -178,6 +184,7 @@ static Shortcut shortcuts[] = {
+ 	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
+ 	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
+ 	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
++	{ TERMMOD,              XK_W,           togglewide,     {.i =  0} },
+ };
+ 
+ /*
+diff --git a/st.c b/st.c
+index b8e6077..c583b5c 100644
+--- a/st.c
++++ b/st.c
+@@ -52,6 +52,7 @@ enum term_mode {
+ 	MODE_PRINT       = 1 << 5,
+ 	MODE_UTF8        = 1 << 6,
+ 	MODE_SIXEL       = 1 << 7,
++	MODE_NOWIDE      = 1 << 8,
+ };
+ 
+ enum cursor_movement {
+@@ -1029,6 +1030,8 @@ treset(void)
+ 	term.top = 0;
+ 	term.bot = term.row - 1;
+ 	term.mode = MODE_WRAP|MODE_UTF8;
++	if (!renderwide)
++		term.mode |= MODE_NOWIDE;
+ 	memset(term.trantbl, CS_USA, sizeof(term.trantbl));
+ 	term.charset = 0;
+ 
+@@ -1980,6 +1983,12 @@ tprinter(char *s, size_t len)
+ 	}
+ }
+ 
++void
++togglewide(const Arg *arg)
++{
++	term.mode ^= MODE_NOWIDE;
++}
++
+ void
+ toggleprinter(const Arg *arg)
+ {
+@@ -2427,7 +2436,13 @@ check_control_code:
+ 	tsetchar(u, &term.c.attr, term.c.x, term.c.y);
+ 
+ 	if (width == 2) {
+-		gp->mode |= ATTR_WIDE;
++		if (IS_SET(MODE_NOWIDE))  {
++			gp[0].u = '?';
++			gp[0].mode |= ATTR_FAINT;
++		} else {
++			gp[0].mode |= ATTR_WIDE;
++		}
++
+ 		if (term.c.x+1 < term.col) {
+ 			gp[1].u = '\0';
+ 			gp[1].mode = ATTR_WDUMMY;
+diff --git a/st.h b/st.h
+index 38c61c4..0691246 100644
+--- a/st.h
++++ b/st.h
+@@ -83,6 +83,7 @@ void draw(void);
+ void printscreen(const Arg *);
+ void printsel(const Arg *);
+ void sendbreak(const Arg *);
++void togglewide(const Arg *);
+ void toggleprinter(const Arg *);
+ 
+ int tattrset(int);
+@@ -116,6 +117,7 @@ extern char *stty_args;
+ extern char *vtiden;
+ extern char *worddelimiters;
+ extern int allowaltscreen;
++extern int renderwide;
+ extern char *termname;
+ extern unsigned int tabspaces;
+ extern unsigned int defaultfg;
+-- 
+2.46.2
+