emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/w32console.c


From: Kenichi Handa
Subject: [Emacs-diffs] Changes to emacs/src/w32console.c
Date: Wed, 01 Dec 2004 05:54:56 -0500

Index: emacs/src/w32console.c
diff -c emacs/src/w32console.c:1.39 emacs/src/w32console.c:1.40
*** emacs/src/w32console.c:1.39 Tue May 18 19:48:51 2004
--- emacs/src/w32console.c      Wed Dec  1 10:48:38 2004
***************
*** 294,299 ****
--- 294,302 ----
      }
  }
  
+ extern unsigned char *encode_terminal_code P_ ((struct glyph *, int, 
+                                               struct coding-system *));
+ 
  static void
  w32con_write_glyphs (register struct glyph *string, register int len)
  {
***************
*** 301,312 ****
    DWORD r;
    struct frame * f = PICK_FRAME ();
    WORD char_attr;
!   unsigned char conversion_buffer[1024];
!   int conversion_buffer_size = sizeof conversion_buffer;
  
    if (len <= 0)
      return;
  
    /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at
       the tail.  */
    terminal_coding.mode &= ~CODING_MODE_LAST_BLOCK;
--- 304,320 ----
    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;
***************
*** 324,392 ****
        /* Turn appearance modes of the face of the run on.  */
        char_attr = w32_face_attributes (f, face_id);
  
!       while (n > 0)
!         {
!         /* We use a fixed size (1024 bytes) of conversion buffer.
!            Usually it is sufficient, but if not, we just repeat the
!            loop.  */
!         produced = encode_terminal_code (string, conversion_buffer,
!                                          n, conversion_buffer_size,
!                                          &consumed);
!         if (produced > 0)
            {
!               /* 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, conversion_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))
!     {
!       terminal_coding.mode |= CODING_MODE_LAST_BLOCK;
!       encode_coding (&terminal_coding, "", conversion_buffer,
!                    0, conversion_buffer_size);
!       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, conversion_buffer,
!                                             produced, cursor_coords, &r))
!             {
!               printf ("Failed writing console characters: %d\n",
!                       GetLastError ());
!               fflush (stdout);
!             }
!         }
      }
  }
  
--- 332,368 ----
        /* Turn appearance modes of the face of the run on.  */
        char_attr = w32_face_attributes (f, face_id);
  
!       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))
            {
!             printf ("Failed writing console attributes: %d\n",
!                     GetLastError ());
!             fflush (stdout);
!           }
! 
!         /* Write the characters.  */
!         if (!WriteConsoleOutputCharacter (cur_screen, conversion_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;
      }
  }
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]