changeset 26207:c3b046ce88fd v8.2.3635

patch 8.2.3635: GTK: composing underline does not show Commit: https://github.com/vim/vim/commit/3c19b5050040fb74e4e39048f17dce853fdafc08 Author: Dusan Popovic <dpx@binaryapparatus.com> Date: Sat Nov 20 22:03:30 2021 +0000 patch 8.2.3635: GTK: composing underline does not show 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 20 Nov 2021 23:15:03 +0100
parents 851db50bd99b
children 7fc2b49f11e9
files src/gui_gtk_x11.c src/version.c
diffstat 2 files changed, 22 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -5504,7 +5504,6 @@ gui_gtk2_draw_string(int row, int col, c
     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, c
 		    // 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, c
 	    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, c
 		{
 		    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, c
 			slen++;
 		    }
 		}
+		else
+		{
+		    slen++;
+		}
 	    }
 	    else
 	    {
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3635,
+/**/
     3634,
 /**/
     3633,