diff options
author | Dusan Popovic <dpx@binaryapparatus.com> | 2021-11-20 22:03:30 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-11-20 22:03:30 +0000 |
commit | 3c19b5050040fb74e4e39048f17dce853fdafc08 (patch) | |
tree | 76b85bb13a0fa6cbc9628ca853c035cfe925b7af | |
parent | d604d78e7b2e63d118814d0fa0b4b702ec52aeed (diff) | |
download | vim-git-8.2.3635.tar.gz |
patch 8.2.3635: GTK: composing underline does not showv8.2.3635
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)
-rw-r--r-- | src/gui_gtk_x11.c | 31 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 22 insertions, 11 deletions
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 6135657fa..40d771231 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -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 { diff --git a/src/version.c b/src/version.c index fbbc961bc..1efddd81f 100644 --- 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, |