]> granicus.if.org Git - vim/commitdiff
patch 8.2.3635: GTK: composing underline does not show v8.2.3635
authorDusan Popovic <dpx@binaryapparatus.com>
Sat, 20 Nov 2021 22:03:30 +0000 (22:03 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 20 Nov 2021 22:03:30 +0000 (22:03 +0000)
Problem:    GTK: composing underline does not show.
Solution:   Include composing character in pango call. A few more
            optimizations for ligatures.  (Dusan Popovic, closes #9171,
            closes #9147)

src/gui_gtk_x11.c
src/version.c

index 6135657fa20df9f9397a51b9710fbde30adf2aac..40d771231679272bca9d7fe91d0487601e42cc5a 100644 (file)
@@ -5504,7 +5504,6 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags)
     int                should_need_pango = FALSE;
     int                slen;
     int                is_ligature;
-    int                next_is_ligature;
     int                is_utf8;
     char_u     backup_ch;
 
@@ -5564,8 +5563,16 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags)
                    // substrings
     byte_sum = 0;
     cs = s;
-    // look ahead, 0=ascii 1=unicode/ligatures
-    needs_pango = ((*cs & 0x80) || gui.ligatures_map[*cs]);
+    // First char decides starting needs_pango mode, 0=ascii 1=utf8/ligatures.
+    // Even if it is ligature char, two chars or more make ligature.
+    // Ascii followed by utf8 is also going trough pango.
+    is_utf8 = (*cs & 0x80);
+    is_ligature = gui.ligatures_map[*cs] && (len > 1);
+    if (is_ligature)
+       is_ligature = gui.ligatures_map[*(cs + 1)];
+    if (!is_utf8 && len > 1)
+       is_utf8 = (*(cs + 1) & 0x80) != 0;
+    needs_pango = is_utf8 || is_ligature;
 
     // split string into ascii and non-ascii (ligatures + utf-8) substrings,
     // print glyphs or use Pango
@@ -5579,17 +5586,15 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags)
            if (is_ligature && !needs_pango)
            {
                if ((slen + 1) < (len - byte_sum))
-               {
-                   next_is_ligature = gui.ligatures_map[*(cs + slen + 1)];
-                   if (!next_is_ligature)
-                       is_ligature = 0;
-               }
+                   is_ligature = gui.ligatures_map[*(cs + slen + 1)];
                else
-               {
                    is_ligature = 0;
-               }
            }
            is_utf8 = *(cs + slen) & 0x80;
+           // ascii followed by utf8 could be combining
+           // if so send it trough pango
+           if ((!is_utf8) && ((slen + 1) < (len - byte_sum)))
+               is_utf8 = (*(cs + slen + 1) & 0x80);
            should_need_pango = (is_ligature || is_utf8);
            if (needs_pango != should_need_pango) // mode switch
                break;
@@ -5599,7 +5604,7 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags)
                {
                    slen++; // ligature char by char
                }
-               else
+               else if (is_utf8)
                {
                    if ((*(cs + slen) & 0xC0) == 0x80)
                    {
@@ -5633,6 +5638,10 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags)
                        slen++;
                    }
                }
+               else
+               {
+                   slen++;
+               }
            }
            else
            {
index fbbc961bc6bb30d86eec935b37f7af7bc718f04b..1efddd81fdd9dc1634e6021b8980cb1118c93234 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3635,
 /**/
     3634,
 /**/