1
0
forked from aniani/vim

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)
This commit is contained in:
Dusan Popovic
2021-11-20 22:03:30 +00:00
committed by Bram Moolenaar
parent d604d78e7b
commit 3c19b50500
2 changed files with 22 additions and 11 deletions

View 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
{