summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDusan Popovic <dpx@binaryapparatus.com>2021-11-20 22:03:30 +0000
committerBram Moolenaar <Bram@vim.org>2021-11-20 22:03:30 +0000
commit3c19b5050040fb74e4e39048f17dce853fdafc08 (patch)
tree76b85bb13a0fa6cbc9628ca853c035cfe925b7af
parentd604d78e7b2e63d118814d0fa0b4b702ec52aeed (diff)
downloadvim-git-3c19b5050040fb74e4e39048f17dce853fdafc08.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.c31
-rw-r--r--src/version.c2
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,