diff options
author | Kenichi Handa <handa@m17n.org> | 2006-02-07 01:19:06 +0000 |
---|---|---|
committer | Kenichi Handa <handa@m17n.org> | 2006-02-07 01:19:06 +0000 |
commit | d2b4c17d26022daf1a2b3f6ca4f727a23711622d (patch) | |
tree | ef078da1a764d4e24faf26b2dc6b92ed99f668dd /src/term.c | |
parent | ea37fbb817c487fea0ca3691df0b9ae70e86d5be (diff) | |
download | emacs-d2b4c17d26022daf1a2b3f6ca4f727a23711622d.tar.gz |
(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.
Diffstat (limited to 'src/term.c')
-rw-r--r-- | src/term.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/src/term.c b/src/term.c index 8c6250c522e..2b44653b961 100644 --- a/src/term.c +++ b/src/term.c @@ -1634,10 +1634,10 @@ static void produce_stretch_glyph P_ ((struct 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) @@ -1657,7 +1657,7 @@ 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); @@ -1708,6 +1708,9 @@ produce_glyphs (it) 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; @@ -1737,13 +1740,11 @@ produce_glyphs (it) { 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; @@ -1751,14 +1752,30 @@ produce_glyphs (it) } 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 { @@ -1843,17 +1860,15 @@ produce_stretch_glyph (it) 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; |