summaryrefslogtreecommitdiff
path: root/src/term.c
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2006-02-07 01:19:06 +0000
committerKenichi Handa <handa@m17n.org>2006-02-07 01:19:06 +0000
commitd2b4c17d26022daf1a2b3f6ca4f727a23711622d (patch)
treeef078da1a764d4e24faf26b2dc6b92ed99f668dd /src/term.c
parentea37fbb817c487fea0ca3691df0b9ae70e86d5be (diff)
downloademacs-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.c53
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;