summaryrefslogtreecommitdiff
path: root/files/config/suckless/st/x.c.rej
diff options
context:
space:
mode:
authorshipwreckt <me@shipwreckt.co.uk>2025-10-16 22:13:02 +0100
committershipwreckt <me@shipwreckt.co.uk>2025-10-16 22:13:02 +0100
commite63a16b509b05993fc7900b6296ba8601e343976 (patch)
treeb9e1d57e09a111981427bafe3b3223384e358830 /files/config/suckless/st/x.c.rej
parente8b5675eb77aa20027f369ca278457b6a7c2e142 (diff)
More small changes, added thunderbird items.
Diffstat (limited to 'files/config/suckless/st/x.c.rej')
-rw-r--r--files/config/suckless/st/x.c.rej96
1 files changed, 96 insertions, 0 deletions
diff --git a/files/config/suckless/st/x.c.rej b/files/config/suckless/st/x.c.rej
new file mode 100644
index 0000000..fe46ef1
--- /dev/null
+++ b/files/config/suckless/st/x.c.rej
@@ -0,0 +1,96 @@
+--- x.c
++++ x.c
+@@ -1322,12 +1404,15 @@ xinit(int cols, int rows)
+ xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0);
+ if (xsel.xtarget == None)
+ xsel.xtarget = XA_STRING;
++
++ // Initialize the graphics (image display) module.
++ gr_init(xw.dpy, xw.vis, xw.cmap);
+ }
+
+ int
+ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
+ {
+- float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp;
++ float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp;
+ ushort mode, prevmode = USHRT_MAX;
+ Font *font = &dc.font;
+ int frcflags = FRC_NORMAL;
+@@ -1628,18 +1768,68 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
+ r.width = width;
+ XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1);
+
+- /* Render the glyphs. */
+- XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
+-
+- /* Render underline and strikethrough. */
++ /* Decoration color. */
++ Color decor;
++ uint32_t decorcolor = tgetdecorcolor(&base);
++ if (decorcolor == DECOR_DEFAULT_COLOR) {
++ decor = *fg;
++ } else if (IS_TRUECOL(decorcolor)) {
++ colfg.alpha = 0xffff;
++ colfg.red = TRUERED(decorcolor);
++ colfg.green = TRUEGREEN(decorcolor);
++ colfg.blue = TRUEBLUE(decorcolor);
++ XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &decor);
++ } else {
++ decor = dc.col[decorcolor];
++ }
++ decor.color.alpha = 0xffff;
++ decor.pixel |= 0xff << 24;
++
++ /* Float thickness, used as a base to compute other values. */
++ float fthick = dc.font.height / 18.0;
++ /* Integer thickness in pixels. Must not be 0. */
++ int thick = MAX(1, roundf(fthick));
++ /* The default gap between the baseline and a single underline. */
++ int gap = roundf(fthick * 2);
++ /* The total thickness of a double underline. */
++ int doubleh = thick * 2 + ceilf(fthick * 0.5);
++ /* The total thickness of an undercurl. */
++ int curlh = thick * 2 + roundf(fthick * 0.75);
++
++ /* Render the underline before the glyphs. */
+ if (base.mode & ATTR_UNDERLINE) {
+- XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1,
+- width, 1);
++ uint32_t style = tgetdecorstyle(&base);
++ int liney = winy + dc.font.ascent + gap;
++ /* Adjust liney to guarantee that a single underline fits. */
++ liney -= MAX(0, liney + thick - (winy + win.ch));
++ if (style == UNDERLINE_DOUBLE) {
++ liney -= MAX(0, liney + doubleh - (winy + win.ch));
++ XftDrawRect(xw.draw, &decor, winx, liney, width, thick);
++ XftDrawRect(xw.draw, &decor, winx,
++ liney + doubleh - thick, width, thick);
++ } else if (style == UNDERLINE_DOTTED) {
++ xdrawunderdashed(xw.draw, &decor, winx, liney, width,
++ thick * 2, 0.5, thick);
++ } else if (style == UNDERLINE_DASHED) {
++ int wavelen = MAX(2, win.cw * 0.9);
++ xdrawunderdashed(xw.draw, &decor, winx, liney, width,
++ wavelen, 0.65, thick);
++ } else if (style == UNDERLINE_CURLY) {
++ liney -= MAX(0, liney + curlh - (winy + win.ch));
++ xdrawundercurl(xw.draw, &decor, winx, liney, width,
++ curlh, thick);
++ } else {
++ XftDrawRect(xw.draw, &decor, winx, liney, width, thick);
++ }
+ }
+
++ /* Render the glyphs. */
++ XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
++
++ /* Render strikethrough. Alway use the fg color. */
+ if (base.mode & ATTR_STRUCK) {
+- XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3,
+- width, 1);
++ XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3,
++ width, thick);
+ }
+
+ /* Reset clip to none. */