]> git.armaanb.net Git - st.git/blobdiff - x.c
Apply ligatures patch
[st.git] / x.c
diff --git a/x.c b/x.c
index 718604067917b7b470a1618cedc72da379ebee37..9c18effcd7ce53dc4937e4eba014c9860a5c7a62 100644 (file)
--- a/x.c
+++ b/x.c
@@ -19,6 +19,7 @@ char *argv0;
 #include "arg.h"
 #include "st.h"
 #include "win.h"
+#include "hb.h"
 
 /* types used in config.h */
 typedef struct {
@@ -1033,6 +1034,9 @@ xunloadfont(Font *f)
 void
 xunloadfonts(void)
 {
+       /* Clear Harfbuzz font cache. */
+       hbunloadfonts();
+
        /* Free the loaded fonts in the font cache.  */
        while (frclen > 0)
                XftFontClose(xw.dpy, frc[--frclen].font);
@@ -1232,7 +1236,7 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
                mode = glyphs[i].mode;
 
                /* Skip dummy wide-character spacing. */
-               if (mode == ATTR_WDUMMY)
+               if (mode & ATTR_WDUMMY)
                        continue;
 
                /* Determine font for glyph if different from previous glyph. */
@@ -1339,6 +1343,9 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
                numspecs++;
        }
 
+       /* Harfbuzz transformation for ligatures. */
+       hbtransform(specs, glyphs, len, x, y);
+
        return numspecs;
 }
 
@@ -1488,14 +1495,17 @@ xdrawglyph(Glyph g, int x, int y)
 }
 
 void
-xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
+xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int len)
 {
        Color drawcol;
 
        /* remove the old cursor */
        if (selected(ox, oy))
                og.mode ^= ATTR_REVERSE;
-       xdrawglyph(og, ox, oy);
+
+       /* Redraw the line where cursor was previously.
+        * It will restore the ligatures broken by the cursor. */
+       xdrawline(line, 0, oy, len);
 
        if (IS_SET(MODE_HIDE))
                return;