[PATCH] Skip ZERO_WIDTH_CHAR to avoid rendering artifacts with background colors
Ross Schlaikjer
rossschlaikjer at gmail.com
Tue Jun 30 12:52:33 CEST 2026
Hello,
I was seeing artifacting over text input when using an NPM TUI that was
drawing zero-width spaces (U+200B) over the input as some kind of cursor
rendering trick. The outline of the placeholder glyph would display
repeatedly as a ghost outline, not disappearing until I resized the window
to force a redraw.
It seems like the rxvt_font_default::draw() method handles zero-width
characters by just skipping them, so I applied this to the _xft and _x11
versions as well, which appears to have fixed the issue (my font is
xft:Unifont:pixelsize=24).
Screenshots of the terminal before/after the patch:
Before: https://www.xvjpf.org/rxvt_zwsp_before.png
After: https://www.xvjpf.org/rxvt_zwsp_after.png
Hopefully this patch (appended) is generally useful.
Best,
- Ross
--
diff --git a/src/rxvtfont.C b/src/rxvtfont.C
index 2a36e96..8e4ae8b 100644
--- a/src/rxvtfont.C
+++ b/src/rxvtfont.C
@@ -1064,6 +1064,10 @@ rxvt_font_x11::draw (rxvt_drawable &d, int x, int y,
int base = ascent; // sorry, incorrect: term->fbase;
+ // skip zero-width characters to avoid rendering artifacts with
background colors
+ while (len && *text == ZERO_WIDTH_CHAR)
+ text++, len--;
+
XGCValues v;
v.foreground = term->pix_colors[fg];
v.font = f->fid;
@@ -1452,6 +1456,10 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
while (len && *text == NOCHAR)
text++, len--, cwidth += term->fwidth;
+ if (chr == ZERO_WIDTH_CHAR)
+ // skip zero-width characters to avoid rendering artifacts with
background colors
+ continue;
+
if (chr != ' ') // skip spaces
{
// handle non-bmp chars when text_t is 16 bit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.schmorp.de/pipermail/rxvt-unicode/attachments/20260630/153dce82/attachment.htm>
More information about the rxvt-unicode
mailing list