changeset 2507:2070b63605a7 vim73

Fix: with newer GTK versions accented characters were drawn too much to the left.
author Bram Moolenaar <bram@vim.org>
date Sat, 07 Aug 2010 15:46:45 +0200
parents 11730666460d
children 7e008c174cc3
files runtime/doc/todo.txt src/gui_gtk_x11.c
diffstat 2 files changed, 12 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -45,9 +45,6 @@ Patch to make more characters work in di
 
 Should readfile() ignore BOM when not in binary mode?
 
-GTK: accented characters are drawn one character too much to the left. (Boyko
-Bantchev, 2010 Aug 5)
-
 Bug: searching for tags file uses 'suffixesadd', should not happen. (Dominique
 Pelle, 2010 June 28)
 
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -4809,6 +4809,10 @@ setup_zero_width_cluster(PangoItem *item
 	glyph->geometry.y_offset  = logical_rect.height
 		- (gui.char_height - p_linespace) * PANGO_SCALE;
     }
+    else
+	/* If the accent width is smaller than the cluster width, position it
+	 * in the middle. */
+	glyph->geometry.x_offset = -width + MAX(0, width - ink_rect.width) / 2;
 }
 
     static void
@@ -4989,9 +4993,6 @@ not_ascii:
 	int		cluster_width;
 	int		last_glyph_rbearing;
 	int		cells = 0;  /* cells occupied by current cluster */
-#if 0
-	int		monospace13 = STRICMP(p_guifont, "monospace 13") == 0;
-#endif
 
 	/* Safety check: pango crashes when invoked with invalid utf-8
 	 * characters. */
@@ -5107,21 +5108,17 @@ not_ascii:
 		    int width;
 
 		    /* There is a previous glyph, so we deal with combining
-		     * characters the canonical way.  That is, setting the
-		     * width of the previous glyph to 0. */
-		    glyphs->glyphs[i - 1].geometry.width = 0;
+		     * characters the canonical way.
+		     * Older versions of Pango used a positive x_offset,
+		     * then set the width of the previous glyph to zero.
+		     * Newer versions of Pango use a negative x_offset.
+		     * For both adjust the x_offset to position the glyph in
+		     * the middle.  */
+		    if (glyph->geometry.x_offset >= 0)
+			glyphs->glyphs[i - 1].geometry.width = 0;
 		    width = cells * gui.char_width * PANGO_SCALE;
 		    glyph->geometry.x_offset +=
 					    MAX(0, width - cluster_width) / 2;
-#if 0
-		    /* Dirty hack: for "monospace 13" font there is a bug that
-		     * draws composing chars in the wrong position.  Add
-		     * "width" to the offset to work around that. */
-		    if (monospace13)
-			glyph->geometry.x_offset = width;
-#endif
-
-		    glyph->geometry.width = width;
 		}
 		else /* i == 0 "cannot happen" */
 		{