# HG changeset patch # User Bram Moolenaar # Date 1637446503 -3600 # Node ID c3b046ce88fd10006d86e8385b033e08e47abde8 # Parent 851db50bd99b237b023cbaa7462129978d48424d patch 8.2.3635: GTK: composing underline does not show Commit: https://github.com/vim/vim/commit/3c19b5050040fb74e4e39048f17dce853fdafc08 Author: Dusan Popovic 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) diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c --- 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 { diff --git a/src/version.c b/src/version.c --- 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,