diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/w32console.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/w32console.c b/src/w32console.c index ea30853bade..36a6ced2983 100644 --- a/src/w32console.c +++ b/src/w32console.c | |||
| @@ -140,23 +140,36 @@ w32con_clear_frame (struct frame *f) | |||
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | 142 | ||
| 143 | static struct glyph glyph_base[256]; | 143 | static struct glyph glyph_base[80]; |
| 144 | static struct glyph *glyphs = glyph_base; | ||
| 145 | static size_t glyphs_len = ARRAYELTS (glyph_base); | ||
| 144 | static BOOL ceol_initialized = FALSE; | 146 | static BOOL ceol_initialized = FALSE; |
| 145 | 147 | ||
| 146 | /* Clear from Cursor to end (what's "standout marker"?). */ | 148 | /* Clear from Cursor to end (what's "standout marker"?). */ |
| 147 | static void | 149 | static void |
| 148 | w32con_clear_end_of_line (struct frame *f, int end) | 150 | w32con_clear_end_of_line (struct frame *f, int end) |
| 149 | { | 151 | { |
| 152 | /* Time to reallocate our "empty row"? With today's large screens, | ||
| 153 | it is not unthinkable to see TTY frames well in excess of | ||
| 154 | 80-character width. */ | ||
| 155 | if (end - cursor_coords.X > glyphs_len) | ||
| 156 | { | ||
| 157 | if (glyphs == glyph_base) | ||
| 158 | glyphs = NULL; | ||
| 159 | glyphs = xrealloc (glyphs, FRAME_COLS (f) * sizeof (struct glyph)); | ||
| 160 | glyphs_len = FRAME_COLS (f); | ||
| 161 | ceol_initialized = FALSE; | ||
| 162 | } | ||
| 150 | if (!ceol_initialized) | 163 | if (!ceol_initialized) |
| 151 | { | 164 | { |
| 152 | int i; | 165 | int i; |
| 153 | for (i = 0; i < 256; i++) | 166 | for (i = 0; i < glyphs_len; i++) |
| 154 | { | 167 | { |
| 155 | memcpy (&glyph_base[i], &space_glyph, sizeof (struct glyph)); | 168 | memcpy (&glyphs[i], &space_glyph, sizeof (struct glyph)); |
| 156 | } | 169 | } |
| 157 | ceol_initialized = TRUE; | 170 | ceol_initialized = TRUE; |
| 158 | } | 171 | } |
| 159 | w32con_write_glyphs (f, glyph_base, end - cursor_coords.X); /* fencepost ? */ | 172 | w32con_write_glyphs (f, glyphs, end - cursor_coords.X); |
| 160 | } | 173 | } |
| 161 | 174 | ||
| 162 | /* Insert n lines at vpos. if n is negative delete -n lines. */ | 175 | /* Insert n lines at vpos. if n is negative delete -n lines. */ |
| @@ -772,6 +785,15 @@ initialize_w32_display (struct terminal *term, int *width, int *height) | |||
| 772 | *width = 1 + info.srWindow.Right - info.srWindow.Left; | 785 | *width = 1 + info.srWindow.Right - info.srWindow.Left; |
| 773 | } | 786 | } |
| 774 | 787 | ||
| 788 | /* Force reinitialization of the "empty row" buffer, in case they | ||
| 789 | dumped from a running session. */ | ||
| 790 | if (glyphs != glyph_base) | ||
| 791 | { | ||
| 792 | glyphs = NULL; | ||
| 793 | glyphs_len = 0; | ||
| 794 | ceol_initialized = FALSE; | ||
| 795 | } | ||
| 796 | |||
| 775 | if (os_subtype == OS_NT) | 797 | if (os_subtype == OS_NT) |
| 776 | w32_console_unicode_input = 1; | 798 | w32_console_unicode_input = 1; |
| 777 | else | 799 | else |