Subject: bug#8703: truncated unicode glyphs in X11

From: Bertram Felgenhauer <[email-masked]>
Date: Fri, 20 May 2011 13:56:04 +0200

Dear Eli,

Eli Zaretskii wrote:
> > Date: Thu, 19 May 2011 22:17:02 +0200
> > From: Bertram Felgenhauer <[email-masked]>
> > 
> > I have tracked down the regression using git-bisect, and found it
> > was introduced by
> > 
> > http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=5d747e944fd5a15bb36f865efc214024803c5fcf
> 
> For those using bzr, this is revision 100011 on the emacs-23 branch or
> revision 99634.13.1 on the trunk.  Perhaps Handa-san could take a look
> at this, as he made that change.
> 
> > Undoing a single change restores the correct behaviour for me:
> > 
> > diff --git a/src/xdisp.c b/src/xdisp.c
> > index 3c9d385..20365ff 100644
> > --- a/src/xdisp.c
> > +++ b/src/xdisp.c
> > @@ -5926,8 +5926,7 @@ get_next_display_element (struct it *it)
> >                            : STRINGP (it->string) ? IT_STRING_CHARPOS (*it)
> >                            : IT_CHARPOS (*it));
> >  
> > -         it->face_id = FACE_FOR_CHAR (it->f, face, it->char_to_display, pos,
> > -                                      it->string);
> > +         it->face_id = FACE_FOR_CHAR (it->f, face, it->c, pos, it->string);
> 
> Can you tell what are the values of it->c and it->char_to_display at
> this point, for one of the characters hose display is truncated?

For the example screenshot, I found the following cases where
it->c and it->char_to_display differ:

it->c                                  it->char_to_display
 8896 (N-ARY LOGICAL AND)              34 (QUOTATION MARK)
 8801 (IDENTICAL TO)                   32 (SPACE)
10233 (LONG RIGHTWARDS DOUBLE ARROW)   32 (SPACE)

it->char_to_display is the previous character in the string each time,
and indeed there's a possibility that this path is taken but
it->char_to_display was not set by get_next_display_element: when
it->what == IT_COMPOSITION and it->cmp_it.ch < 0.

The following patch also works for me:

diff --git a/src/xdisp.c b/src/xdisp.c
index 3c9d385..c9848fd 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -5902,6 +5902,8 @@ get_next_display_element (struct it *it)
          it->char_to_display = it->c;
        }
     }
+  else if (it->what == IT_COMPOSITION && it->cmp_it.ch < 0)
+    it->char_to_display = it->c;
 
 #ifdef HAVE_WINDOW_SYSTEM
   /* Adjust face id for a multibyte character.  There are no multibyte

For completeness: The behaviour seems to be independent of the font
being used. I tried with the 6x13 system font (which by its fixed
width nature displays fine, btw) and with "DejaVu Sans Mono" which
I used for the screenshots (sorry for not mentioning that in the
original report.)

Thanks,

Bertram