From 8ef0be9bb1c9c70e2e98307f71e01ddef3116d99 Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 16 Sep 2011 19:18:58 +0000 Subject: [PATCH] Suppress Pango's bidi, by displaying RTL characters one at a time. I hadn't previously noticed, but Pango was helpfully re-reversing text that PuTTY's own bidi module had already reversed, leading to Arabic text being wrongly displayed and also total chaos when you move the cursor over it or try to cut and paste it. git-svn-id: svn://svn.tartarus.org/sgt/putty@9294 cda61777-01e9-0310-a592-d414129be87e --- unix/gtkfont.c | 63 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/unix/gtkfont.c b/unix/gtkfont.c index e80d7acb..af577bda 100644 --- a/unix/gtkfont.c +++ b/unix/gtkfont.c @@ -1114,34 +1114,42 @@ static void pangofont_draw_text(GdkDrawable *target, GdkGC *gc, unifont *font, clen++; n = 1; - /* - * See if that character has the width we expect. - */ - pango_layout_set_text(layout, utfptr, clen); - pango_layout_get_pixel_extents(layout, NULL, &rect); + /* + * If it's a right-to-left character, we must display it on + * its own, to stop Pango helpfully re-reversing our already + * reversed text. + */ + if (!is_rtl(string[0])) { - if (rect.width == cellwidth) { - /* - * Try extracting more characters, for as long as they - * stay well-behaved. - */ - while (clen < utflen) { - int oldclen = clen; - clen++; /* skip UTF-8 introducer byte */ - while (clen < utflen && - (unsigned char)utfptr[clen] >= 0x80 && - (unsigned char)utfptr[clen] < 0xC0) - clen++; - n++; - pango_layout_set_text(layout, utfptr, clen); - pango_layout_get_pixel_extents(layout, NULL, &rect); - if (rect.width != n * cellwidth) { - clen = oldclen; - n--; - break; - } - } - } + /* + * See if that character has the width we expect. + */ + pango_layout_set_text(layout, utfptr, clen); + pango_layout_get_pixel_extents(layout, NULL, &rect); + + if (rect.width == cellwidth) { + /* + * Try extracting more characters, for as long as they + * stay well-behaved. + */ + while (clen < utflen) { + int oldclen = clen; + clen++; /* skip UTF-8 introducer byte */ + while (clen < utflen && + (unsigned char)utfptr[clen] >= 0x80 && + (unsigned char)utfptr[clen] < 0xC0) + clen++; + n++; + pango_layout_set_text(layout, utfptr, clen); + pango_layout_get_pixel_extents(layout, NULL, &rect); + if (rect.width != n * cellwidth) { + clen = oldclen; + n--; + break; + } + } + } + } pango_layout_set_text(layout, utfptr, clen); pango_layout_get_pixel_extents(layout, NULL, &rect); @@ -1153,6 +1161,7 @@ static void pangofont_draw_text(GdkDrawable *target, GdkGC *gc, unifont *font, utflen -= clen; utfptr += clen; + string += n; x += n * cellwidth; } -- 2.11.0