From aee31bf1068104d11065752ded7278f0423821ec Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Sat, 11 Dec 2004 02:13:31 +0000 Subject: Sync to the change in HEAD on 2004-12-01. --- src/w32console.c | 103 ++++++++++++++++++++----------------------------------- 1 file changed, 37 insertions(+), 66 deletions(-) (limited to 'src/w32console.c') diff --git a/src/w32console.c b/src/w32console.c index 170ce5508be..e16a89e52a9 100644 --- a/src/w32console.c +++ b/src/w32console.c @@ -294,8 +294,6 @@ w32con_insert_glyphs (register struct glyph *start, register int len) } } -extern unsigned char *terminal_encode_buffer; - extern unsigned char *encode_terminal_code P_ ((struct glyph *, int, struct coding_system *)); @@ -306,10 +304,17 @@ w32con_write_glyphs (register struct glyph *string, register int len) DWORD r; struct frame * f = PICK_FRAME (); WORD char_attr; + unsigned char *conversion_buffer; + struct coding_system *coding; if (len <= 0) return; + /* If terminal_coding does any conversion, use it, otherwise use + safe_terminal_coding. We can't use CODING_REQUIRE_ENCODING here + because it always return 1 if the member src_multibyte is 1. */ + coding = (terminal_coding.common_flags & CODING_REQUIRE_ENCODING_MASK + ? &terminal_coding : &safe_terminal_coding); /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at the tail. */ terminal_coding.mode &= ~CODING_MODE_LAST_BLOCK; @@ -327,71 +332,37 @@ w32con_write_glyphs (register struct glyph *string, register int len) /* Turn appearance modes of the face of the run on. */ char_attr = w32_face_attributes (f, face_id); - while (n > 0) - { - produced = encode_terminal_code (string, - n, - &consumed); - if (produced > 0) + if (n == len) + /* This is the last run. */ + coding->mode |= CODING_MODE_LAST_BLOCK; + conversion_buffer = encode_terminal_code (string, n, coding); + if (coding->produced > 0) + { + /* Set the attribute for these characters. */ + if (!FillConsoleOutputAttribute (cur_screen, char_attr, + coding->produced, cursor_coords, + &r)) { - /* Set the attribute for these characters. */ - if (!FillConsoleOutputAttribute (cur_screen, char_attr, - produced, cursor_coords, &r)) - { - printf ("Failed writing console attributes: %d\n", - GetLastError ()); - fflush (stdout); - } - - /* Write the characters. */ - if (!WriteConsoleOutputCharacter (cur_screen, terminal_encode_buffer, - produced, cursor_coords, &r)) - { - printf ("Failed writing console characters: %d\n", - GetLastError ()); - fflush (stdout); - } - - cursor_coords.X += produced; - w32con_move_cursor (cursor_coords.Y, cursor_coords.X); - } - len -= consumed; - n -= consumed; - string += consumed; - } - } - - /* We may have to output some codes to terminate the writing. */ - if (CODING_REQUIRE_FLUSHING (&terminal_coding)) - { - Lisp_Object blank_string = build_string (""); - int conversion_buffer_size = 1024; - - terminal_coding.mode |= CODING_MODE_LAST_BLOCK; - terminal_coding.destination = (unsigned char *) xmalloc (conversion_buffer_size); - encode_coding_object (&terminal_coding, blank_string, 0, 0, - 0, conversion_buffer_size, Qnil); - if (terminal_coding.produced > 0) - { - if (!FillConsoleOutputAttribute (cur_screen, char_attr_normal, - terminal_coding.produced, - cursor_coords, &r)) - { - printf ("Failed writing console attributes: %d\n", - GetLastError ()); - fflush (stdout); - } - - /* Write the characters. */ - if (!WriteConsoleOutputCharacter (cur_screen, terminal_coding.destination, - produced, cursor_coords, &r)) - { - printf ("Failed writing console characters: %d\n", - GetLastError ()); - fflush (stdout); - } - } - xfree (terminal_coding.destination); + printf ("Failed writing console attributes: %d\n", + GetLastError ()); + fflush (stdout); + } + + /* Write the characters. */ + if (!WriteConsoleOutputCharacter (cur_screen, terminal_encode_buffer, + coding->produced, cursor_coords, + &r)) + { + printf ("Failed writing console characters: %d\n", + GetLastError ()); + fflush (stdout); + } + + cursor_coords.X += coding->produced; + w32con_move_cursor (cursor_coords.Y, cursor_coords.X); + } + len -= n; + string += n; } } -- cgit v1.2.3-70-g09d2