Subject: bug#3452: 23.0.94; display

From: Kenichi Handa <[email-masked]>
Date: Mon, 08 Jun 2009 20:57:06 +0900

In article <[email-masked]>, Eli Zaretskii <[email-masked]> writes:

> > From: Kenichi Handa <[email-masked]>
> > CC: [email-masked], [email-masked]
> > Date: Mon, 08 Jun 2009 17:10:27 +0900
> > 
> > Not for U+202D, but such combining characters as U+0300 are
> > treated correctly by xterm (not by gnome-terminal).
> > 
> > > > To conclude, I think there's not that much we can do for
> > > > this situation.  I think the current behaviour of
> > > > gnome-terminal (displaying standalone U+202D as a space of
> > > > width 1) is a bug.
> > 
> > > If other terminals behave correctly, I would agree.  But if not,
> > > perhaps we need to work around this, if possible.  For example, we
> > > could have an entry in display tables for these characters.
> > 
> > It seems xterm, gnome-terminal, GNU/Linux console, and
> > mlterm treat U+202D as spacing character, but, Konsole
> > (KDE's terminal) and kterm treats it as non-spacing
> > character.

> Wasn't gnome-terminal the one that started this bug report?

I don't know exactly.  RMS's bug report just says "a 37-line
Linux terminal".

> And you even tell above that gnome-terminal does NOT treat
> U+202D correctly.  So which terminals do?

> If xterm, the Linux console and mlterm do work, then maybe your
> suggestion to do nothing is good enough.

??? I wrote "Konsole and kterm" treats U+202D as non-spacing
character.  I think that is the correct way, and the others
(gnome-terminal, xterm, and Linux console) are wrong.

> Btw, what do you think about my idea to add a display table entry for
> these characters?

A display table is used both for terminal and window system,
but, on a window system, some font may have special glyphs
for those characters.  If we setup a display table for
U+202D, Emacs can't display U+202D by such a glyph on window
system.

So, if we implement some work-around for such terminal as
gnome-terminal, I think it is better to modify
compose-gstring-for-terminal so that it replaces U+202D
(actually all zero-width characters of Unicode category Cf)
with a single SPACE instead of prepending a SPACE.  Please
try the attached patch.

---
Kenichi Handa
[email-masked]

--- composite.el.~1.46.~	2009-04-20 10:11:33.000000000 +0900
+++ composite.el	2009-06-08 20:45:50.000000000 +0900
@@ -681,7 +681,14 @@
 	      (lglyph-set-from-to glyph i i)
 	      (setq i (1+ i))))
 	(if (= (lglyph-width glyph) 0)
-	    (progn
+	    (if (eq (get-char-code-property (lglyph-char glyph)
+					    'general-category)
+		    'Cf)
+		(progn
+		  ;; Compose by replacing with a space.
+		  (lglyph-set-char glyph 32)
+		  (lglyph-set-width glyph 1)
+		  (setq i (1+ i)))
 	      ;; Compose by prepending a space.
 	      (setq gstring (lgstring-insert-glyph gstring i
 						   (lglyph-copy glyph))