+2006-02-07 Kenichi Handa <handa@m17n.org>
+
+ * term.c (append_glyph): Refer to it->char_to_display instead of
+ it->c.
+ (produce_glyphs): Set the character to print in
+ it->char_to_display. Handle
+ unibyte-display-via-language-environment.
+ (produce_stretch_glyph): Set the character to print in
+ it->char_to_display.
+
2006-02-06 Kenichi Handa <handa@m17n.org>
* lread.c (openp): Initialized encoded_fn before GCPRO it.
/* Append glyphs to IT's glyph_row. Called from produce_glyphs for
- terminal frames if IT->glyph_row != NULL. IT->c is the character
- for which to produce glyphs; IT->face_id contains the character's
- face. Padding glyphs are appended if IT->c has a IT->pixel_width >
- 1. */
+ terminal frames if IT->glyph_row != NULL. IT->char_to_display is
+ the character for which to produce glyphs; IT->face_id contains the
+ character's face. Padding glyphs are appended if IT->c has a
+ IT->pixel_width > 1. */
static void
append_glyph (it)
{
glyph->type = CHAR_GLYPH;
glyph->pixel_width = 1;
- glyph->u.ch = it->c;
+ glyph->u.ch = it->char_to_display;
glyph->face_id = it->face_id;
glyph->padding_p = i > 0;
glyph->charpos = CHARPOS (it->position);
xassert (it->what == IT_CHARACTER
|| it->what == IT_COMPOSITION);
+ /* Maybe translate single-byte characters to multibyte. */
+ it->char_to_display = it->c;
+
if (it->c >= 040 && it->c < 0177)
{
it->pixel_width = it->nglyphs = 1;
{
int n = nspaces;
- it->c = ' ';
+ it->char_to_display = ' ';
it->pixel_width = it->len = 1;
while (n--)
append_glyph (it);
-
- it->c = '\t';
}
it->pixel_width = nspaces;
}
else if (SINGLE_BYTE_CHAR_P (it->c))
{
- /* Coming here means that it->c is from display table, thus we
- must send the code as is to the terminal. Although there's
- no way to know how many columns it occupies on a screen, it
- is a good assumption that a single byte code has 1-column
- width. */
- it->pixel_width = it->nglyphs = 1;
- if (it->glyph_row)
- append_glyph (it);
+ if (unibyte_display_via_language_environment
+ && (it->c >= 0240
+ || !NILP (Vnonascii_translation_table)))
+ {
+ int charset;
+
+ it->char_to_display = unibyte_char_to_multibyte (it->c);
+ charset = CHAR_CHARSET (it->char_to_display);
+ it->pixel_width = CHARSET_WIDTH (charset);
+ it->nglyphs = it->pixel_width;
+ if (it->glyph_row)
+ append_glyph (it);
+ }
+ else
+ {
+ /* Coming here means that it->c is from display table, thus we
+ must send the code as is to the terminal. Although there's
+ no way to know how many columns it occupies on a screen, it
+ is a good assumption that a single byte code has 1-column
+ width. */
+ it->pixel_width = it->nglyphs = 1;
+ if (it->glyph_row)
+ append_glyph (it);
+ }
}
else
{
Lisp_Object o_object = it->object;
Lisp_Object object = it->stack[it->sp - 1].string;
int n = width;
- int c = it->c;
if (!STRINGP (object))
object = it->w->buffer;
it->object = object;
- it->c = ' ';
+ it->char_to_display = ' ';
it->pixel_width = it->len = 1;
while (n--)
append_glyph (it);
it->object = o_object;
- it->c = c;
}
it->pixel_width = width;
it->nglyphs = width;