X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/32c82ac0a18004dac223729f6e3a77a197814086..b221615bc47647612a1a0999b5c9b7cfc699fce6:/src/w32console.c diff --git a/src/w32console.c b/src/w32console.c index 1f9a5cb2d5..0ad9c755e2 100644 --- a/src/w32console.c +++ b/src/w32console.c @@ -58,8 +58,6 @@ static void clear_to_end (void); static void clear_frame (void); static void clear_end_of_line (int); static void ins_del_lines (int vpos, int n); -static void change_line_highlight (int, int, int, int); -static void reassert_line_highlight (int, int); static void insert_glyphs (struct glyph *start, int len); static void write_glyphs (struct glyph *string, int len); static void delete_glyphs (int n); @@ -70,7 +68,6 @@ static void set_terminal_window (int size); static void update_begin (struct frame * f); static void update_end (struct frame * f); static WORD w32_face_attributes (struct frame *f, int face_id); -static int hl_mode (int new_highlight); static COORD cursor_coords; static HANDLE prev_screen, cur_screen; @@ -111,7 +108,7 @@ move_cursor (int row, int col) { cursor_coords.X = col; cursor_coords.Y = row; - + if (updating_frame == (struct frame *) NULL) { SetConsoleCursorPosition (cur_screen, cursor_coords); @@ -123,9 +120,9 @@ void clear_to_end (void) { struct frame * f = PICK_FRAME (); - - clear_end_of_line (FRAME_WIDTH (f) - 1); - ins_del_lines (cursor_coords.Y, FRAME_HEIGHT (f) - cursor_coords.Y - 1); + + clear_end_of_line (FRAME_COLS (f) - 1); + ins_del_lines (cursor_coords.Y, FRAME_LINES (f) - cursor_coords.Y - 1); } /* Clear the frame. */ @@ -140,10 +137,8 @@ clear_frame (void) GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &info); - hl_mode (0); - /* Remember that the screen buffer might be wider than the window. */ - n = FRAME_HEIGHT (f) * info.dwSize.X; + n = FRAME_LINES (f) * info.dwSize.X; dest.X = dest.Y = 0; FillConsoleOutputAttribute (cur_screen, char_attr_normal, n, dest, &r); @@ -176,7 +171,7 @@ clear_end_of_line (int end) void ins_del_lines (int vpos, int n) { - int i, nb, save_highlight; + int i, nb; SMALL_RECT scroll; COORD dest; CHAR_INFO fill; @@ -185,25 +180,23 @@ ins_del_lines (int vpos, int n) if (n < 0) { scroll.Top = vpos - n; - scroll.Bottom = FRAME_HEIGHT (f); + scroll.Bottom = FRAME_LINES (f); dest.Y = vpos; } else { scroll.Top = vpos; - scroll.Bottom = FRAME_HEIGHT (f) - n; + scroll.Bottom = FRAME_LINES (f) - n; dest.Y = vpos + n; } scroll.Left = 0; - scroll.Right = FRAME_WIDTH (f); - + scroll.Right = FRAME_COLS (f); + dest.X = 0; - - save_highlight = hl_mode (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 @@ -220,7 +213,7 @@ ins_del_lines (int vpos, int n) for (i = scroll.Bottom; i < dest.Y; i++) { move_cursor (i, 0); - clear_end_of_line (FRAME_WIDTH (f)); + clear_end_of_line (FRAME_COLS (f)); } } } @@ -229,52 +222,17 @@ ins_del_lines (int vpos, int n) nb = dest.Y + (scroll.Bottom - scroll.Top) + 1; if (nb < scroll.Top) - { + { for (i = nb; i < scroll.Top; i++) { move_cursor (i, 0); - clear_end_of_line (FRAME_WIDTH (f)); + clear_end_of_line (FRAME_COLS (f)); } } } - + cursor_coords.X = 0; cursor_coords.Y = vpos; - - hl_mode (save_highlight); -} - -/* Changes attribute to use when drawing characters to control. */ -static int -hl_mode (int new_highlight) -{ - static int highlight = 0; - int old_highlight; - - old_highlight = highlight; - highlight = (new_highlight != 0); - - return old_highlight; -} - -/* Call this when about to modify line at position VPOS and change whether it - is highlighted. */ -void -change_line_highlight (int new_highlight, int vpos, int y, - int first_unused_hpos) -{ - hl_mode (new_highlight); - move_cursor (vpos, 0); - clear_end_of_line (first_unused_hpos); -} - -/* External interface to control of standout mode. Call this when about to - * modify line at position VPOS and not change whether it is highlighted. */ -void -reassert_line_highlight (int highlight, int vpos) -{ - hl_mode (highlight); - vpos; /* pedantic compiler silencer */ } #undef LEFT @@ -291,24 +249,24 @@ scroll_line (int dist, int direction) COORD dest; CHAR_INFO fill; struct frame * f = PICK_FRAME (); - + scroll.Top = cursor_coords.Y; scroll.Bottom = cursor_coords.Y; - + if (direction == LEFT) { scroll.Left = cursor_coords.X + dist; - scroll.Right = FRAME_WIDTH (f) - 1; + scroll.Right = FRAME_COLS (f) - 1; } else { scroll.Left = cursor_coords.X; - scroll.Right = FRAME_WIDTH (f) - dist - 1; + scroll.Right = FRAME_COLS (f) - dist - 1; } - + dest.X = cursor_coords.X; dest.Y = cursor_coords.Y; - + fill.Char.AsciiChar = 0x20; fill.Attributes = char_attr_normal; @@ -327,7 +285,7 @@ insert_glyphs (register struct glyph *start, register int len) { /* Print the first len characters of start, cursor_coords.X adjusted by write_glyphs. */ - + write_glyphs (start, len); } else @@ -358,7 +316,7 @@ write_glyphs (register struct glyph *string, register int len) /* 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; @@ -378,7 +336,7 @@ write_glyphs (register struct glyph *string, register int len) { /* Set the attribute for these characters. */ if (!FillConsoleOutputAttribute (cur_screen, char_attr, - produced, cursor_coords, &r)) + produced, cursor_coords, &r)) { printf ("Failed writing console attributes: %d\n", GetLastError ()); @@ -396,7 +354,7 @@ write_glyphs (register struct glyph *string, register int len) cursor_coords.X += produced; move_cursor (cursor_coords.Y, cursor_coords.X); - } + } len -= consumed; n -= consumed; string += consumed; @@ -413,7 +371,7 @@ write_glyphs (register struct glyph *string, register int len) { if (!FillConsoleOutputAttribute (cur_screen, char_attr_normal, terminal_coding.produced, - cursor_coords, &r)) + cursor_coords, &r)) { printf ("Failed writing console attributes: %d\n", GetLastError ()); @@ -436,8 +394,8 @@ write_glyphs (register struct glyph *string, register int len) void delete_glyphs (int n) { - /* delete chars means scroll chars from cursor_coords.X + n to - cursor_coords.X, anything beyond the edge of the screen should + /* delete chars means scroll chars from cursor_coords.X + n to + cursor_coords.X, anything beyond the edge of the screen should come out empty... */ scroll_line (n, LEFT); @@ -449,7 +407,7 @@ static unsigned int sound_type = 0xFFFFFFFF; void w32_sys_ring_bell (void) { - if (sound_type == 0xFFFFFFFF) + if (sound_type == 0xFFFFFFFF) { Beep (666, 100); } @@ -462,27 +420,27 @@ w32_sys_ring_bell (void) } DEFUN ("set-message-beep", Fset_message_beep, Sset_message_beep, 1, 1, 0, - "Set the sound generated when the bell is rung.\n\ -SOUND is 'asterisk, 'exclamation, 'hand, 'question, 'ok, or 'silent\n\ -to use the corresponding system sound for the bell. The 'silent sound\n\ -prevents Emacs from making any sound at all.\n\ -SOUND is nil to use the normal beep.") + doc: /* Set the sound generated when the bell is rung. +SOUND is 'asterisk, 'exclamation, 'hand, 'question, 'ok, or 'silent +to use the corresponding system sound for the bell. The 'silent sound +prevents Emacs from making any sound at all. +SOUND is nil to use the normal beep. */) (sound) Lisp_Object sound; { - CHECK_SYMBOL (sound, 0); + CHECK_SYMBOL (sound); - if (NILP (sound)) + if (NILP (sound)) sound_type = 0xFFFFFFFF; else if (EQ (sound, intern ("asterisk"))) sound_type = MB_ICONASTERISK; - else if (EQ (sound, intern ("exclamation"))) + else if (EQ (sound, intern ("exclamation"))) sound_type = MB_ICONEXCLAMATION; - else if (EQ (sound, intern ("hand"))) + else if (EQ (sound, intern ("hand"))) sound_type = MB_ICONHAND; - else if (EQ (sound, intern ("question"))) + else if (EQ (sound, intern ("question"))) sound_type = MB_ICONQUESTION; - else if (EQ (sound, intern ("ok"))) + else if (EQ (sound, intern ("ok"))) sound_type = MB_OK; else if (EQ (sound, intern ("silent"))) sound_type = MB_EMACS_SILENT; @@ -491,12 +449,10 @@ SOUND is nil to use the normal beep.") return sound; } - + void reset_terminal_modes (void) { - hl_mode (0); - #ifdef USE_SEPARATE_SCREEN SetConsoleActiveScreenBuffer (prev_screen); #else @@ -510,8 +466,6 @@ set_terminal_modes (void) { CONSOLE_CURSOR_INFO cci; - hl_mode (0); - /* make cursor big and visible (100 on Win95 makes it disappear) */ cci.dwSize = 99; cci.bVisible = TRUE; @@ -528,18 +482,16 @@ set_terminal_modes (void) /* hmmm... perhaps these let us bracket screen changes so that we can flush clumps rather than one-character-at-a-time... - + we'll start with not moving the cursor while an update is in progress. */ void update_begin (struct frame * f) { - hl_mode (0); } void update_end (struct frame * f) { - hl_mode (0); SetConsoleCursorPosition (cur_screen, cursor_coords); } @@ -561,12 +513,8 @@ w32_face_attributes (f, face_id) int face_id; { WORD char_attr; - int highlight_on_p; struct face *face = FACE_FROM_ID (f, face_id); - highlight_on_p = hl_mode (0); - hl_mode (highlight_on_p); - xassert (face != NULL); char_attr = char_attr_normal; @@ -577,7 +525,7 @@ w32_face_attributes (f, face_id) if (face->background != FACE_TTY_DEFAULT_BG_COLOR && face->background != FACE_TTY_DEFAULT_COLOR) - char_attr = (char_attr & 0xff0f) + ((face->background % 16) << 4); + char_attr = (char_attr & 0xff0f) + ((face->background % 16) << 4); /* NTEMACS_TODO: Faces defined during startup get both foreground @@ -586,7 +534,7 @@ w32_face_attributes (f, face_id) if (((char_attr & 0x00f0) >> 4) == (char_attr & 0x000f)) char_attr ^= 0x0007; - if (face->tty_reverse_p || highlight_on_p) + if (face->tty_reverse_p) char_attr = (char_attr & 0xff00) + ((char_attr & 0x000f) << 4) + ((char_attr & 0x00f0) >> 4); @@ -625,15 +573,13 @@ void initialize_w32_display (void) { CONSOLE_SCREEN_BUFFER_INFO info; - + cursor_to_hook = move_cursor; raw_cursor_to_hook = move_cursor; clear_to_end_hook = clear_to_end; clear_frame_hook = clear_frame; clear_end_of_line_hook = clear_end_of_line; ins_del_lines_hook = ins_del_lines; - change_line_highlight_hook = change_line_highlight; - reassert_line_highlight_hook = reassert_line_highlight; insert_glyphs_hook = insert_glyphs; write_glyphs_hook = write_glyphs; delete_glyphs_hook = delete_glyphs; @@ -643,10 +589,9 @@ initialize_w32_display (void) set_terminal_window_hook = set_terminal_window; update_begin_hook = update_begin; update_end_hook = update_end; - + read_socket_hook = w32_console_read_socket; mouse_position_hook = w32_console_mouse_position; - estimate_mode_line_height_hook = 0; /* Initialize interrupt_handle. */ init_crit (); @@ -656,7 +601,7 @@ initialize_w32_display (void) GetConsoleMode (keyboard_handle, &prev_console_mode); prev_screen = GetStdHandle (STD_OUTPUT_HANDLE); - + #ifdef USE_SEPARATE_SCREEN cur_screen = CreateConsoleScreenBuffer (GENERIC_READ | GENERIC_WRITE, 0, NULL, @@ -710,23 +655,22 @@ initialize_w32_display (void) } GetConsoleScreenBufferInfo (cur_screen, &info); - + meta_key = 1; char_attr_normal = info.wAttributes; - hl_mode (0); if (w32_use_full_screen_buffer) { - FRAME_HEIGHT (SELECTED_FRAME ()) = info.dwSize.Y; /* lines per page */ - SET_FRAME_WIDTH (SELECTED_FRAME (), info.dwSize.X); /* characters per line */ + FRAME_LINES (SELECTED_FRAME ()) = info.dwSize.Y; /* lines per page */ + SET_FRAME_COLS (SELECTED_FRAME (), info.dwSize.X); /* characters per line */ } else { /* Lines per page. Use buffer coords instead of buffer size. */ - FRAME_HEIGHT (SELECTED_FRAME ()) = 1 + info.srWindow.Bottom - - info.srWindow.Top; + FRAME_LINES (SELECTED_FRAME ()) = 1 + info.srWindow.Bottom - + info.srWindow.Top; /* Characters per line. Use buffer coords instead of buffer size. */ - SET_FRAME_WIDTH (SELECTED_FRAME (), 1 + info.srWindow.Right - + SET_FRAME_COLS (SELECTED_FRAME (), 1 + info.srWindow.Right - info.srWindow.Left); } @@ -737,7 +681,7 @@ initialize_w32_display (void) } DEFUN ("set-screen-color", Fset_screen_color, Sset_screen_color, 2, 2, 0, - "Set screen colors.") + doc: /* Set screen colors. */) (foreground, background) Lisp_Object foreground; Lisp_Object background; @@ -749,7 +693,7 @@ DEFUN ("set-screen-color", Fset_screen_color, Sset_screen_color, 2, 2, 0, } DEFUN ("set-cursor-size", Fset_cursor_size, Sset_cursor_size, 1, 1, 0, - "Set cursor size.") + doc: /* Set cursor size. */) (size) Lisp_Object size; { @@ -757,37 +701,20 @@ DEFUN ("set-cursor-size", Fset_cursor_size, Sset_cursor_size, 1, 1, 0, cci.dwSize = XFASTINT (size); cci.bVisible = TRUE; (void) SetConsoleCursorInfo (cur_screen, &cci); - - return Qt; -} -#ifndef HAVE_NTGUI -void -pixel_to_glyph_coords (struct frame * f, int pix_x, int pix_y, int *x, int *y, - void *bounds, int noclip) -{ - *x = pix_x; - *y = pix_y; -} - -void -glyph_to_pixel_coords (struct window * f, int x, int y, int *pix_x, int *pix_y) -{ - *pix_x = x; - *pix_y = y; + return Qt; } -#endif /* !HAVE_NTGUI */ void syms_of_ntterm () { DEFVAR_BOOL ("w32-use-full-screen-buffer", &w32_use_full_screen_buffer, - "Non-nil means make terminal frames use the full screen buffer dimensions.\n\ -This is desirable when running Emacs over telnet, and is the default.\n\ -A value of nil means use the current console window dimensions; this\n\ -may be preferrable when working directly at the console with a large\n\ -scroll-back buffer."); + doc: /* Non-nil means make terminal frames use the full screen buffer dimensions. +This is desirable when running Emacs over telnet, and is the default. +A value of nil means use the current console window dimensions; this +may be preferrable when working directly at the console with a large +scroll-back buffer. */); w32_use_full_screen_buffer = 1; defsubr (&Sset_screen_color);