/* Clear the frame. */ static void w32con_clear_frame (struct frame *f) { COORD dest; int n; DWORD r; CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &info); /* Remember that the screen buffer might be wider than the window. */ n = FRAME_LINES (f) * info.dwSize.X; dest.X = dest.Y = 0; FillConsoleOutputAttribute (cur_screen, char_attr_normal, n, dest, &r); FillConsoleOutputCharacter (cur_screen, ' ', n, dest, &r); w32con_move_cursor (f, 0, 0); }
static void w32con_write_glyphs (register struct glyph *string, register int len) { int produced, consumed; 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; while (len > 0) { /* Identify a run of glyphs with the same face. */ int face_id = string->face_id; int n; for (n = 1; n < len; ++n) if (string[n].face_id != face_id) break; /* 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; } }
/* Insert n lines at vpos. if n is negative delete -n lines. */ static void w32con_ins_del_lines (int vpos, int n) { int i, nb; SMALL_RECT scroll; COORD dest; CHAR_INFO fill; struct frame * f = PICK_FRAME (); if (n < 0) { scroll.Top = vpos - n; scroll.Bottom = FRAME_LINES (f); dest.Y = vpos; } else { scroll.Top = vpos; scroll.Bottom = FRAME_LINES (f) - n; dest.Y = vpos + n; } scroll.Left = 0; scroll.Right = FRAME_COLS (f); dest.X = 0; fill.Char.AsciiChar = 0x20; fill.Attributes = char_attr_normal; ScrollConsoleScreenBuffer (cur_screen, &scroll, NULL, dest, &fill); /* Here we have to deal with a w32 console flake: If the scroll region looks like abc and we scroll c to a and fill with d we get cbd... if we scroll block c one line at a time to a, we get cdd... Emacs expects cdd consistently... So we have to deal with that here... (this also occurs scrolling the same way in the other direction. */ if (n > 0) { if (scroll.Bottom < dest.Y) { for (i = scroll.Bottom; i < dest.Y; i++) { w32con_move_cursor (i, 0); w32con_clear_end_of_line (FRAME_COLS (f)); } } } else { nb = dest.Y + (scroll.Bottom - scroll.Top) + 1; if (nb < scroll.Top) { for (i = nb; i < scroll.Top; i++) { w32con_move_cursor (i, 0); w32con_clear_end_of_line (FRAME_COLS (f)); } } } cursor_coords.X = 0; cursor_coords.Y = vpos; }