diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/w32console.c | 108 |
1 files changed, 46 insertions, 62 deletions
diff --git a/src/w32console.c b/src/w32console.c index 97ff55907d1..b26790c630c 100644 --- a/src/w32console.c +++ b/src/w32console.c @@ -64,24 +64,18 @@ static void set_terminal_modes (void); static void set_terminal_window (int size); static void update_begin (FRAME_PTR f); static void update_end (FRAME_PTR f); -static void reset_kbd (void); -static void unset_kbd (void); static int hl_mode (int new_highlight); -void -DebPrint () -{ -} - -/* Init hook called in init_keyboard. */ -void (*keyboard_init_hook)(void) = reset_kbd; - COORD cursor_coords; HANDLE prev_screen, cur_screen; UCHAR char_attr, char_attr_normal, char_attr_reverse; HANDLE keyboard_handle; DWORD prev_console_mode; +#ifndef USE_SEPARATE_SCREEN +CONSOLE_CURSOR_INFO prev_console_cursor; +#endif + /* Setting this as the ctrl handler prevents emacs from being killed when someone hits ^C in a 'suspended' session (child shell). @@ -90,7 +84,9 @@ DWORD prev_console_mode; BOOL ctrl_c_handler (unsigned long type) { - return (type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT); + /* Only ignore "interrupt" events when running interactively. */ + return (!noninteractive + && (type == CTRL_C_EVENT || type == CTRL_BREAK_EVENT)); } /* If we're updating a frame, use it as the current frame @@ -453,20 +449,16 @@ SOUND is nil to use the normal beep.") return sound; } - -/* Put our console back up, for ending a suspended session. */ -void -take_console (void) -{ - reset_kbd (); - SetConsoleActiveScreenBuffer (cur_screen); -} void reset_terminal_modes (void) { - unset_kbd (); +#ifdef USE_SEPARATE_SCREEN SetConsoleActiveScreenBuffer (prev_screen); +#else + SetConsoleCursorInfo (prev_screen, &prev_console_cursor); +#endif + SetConsoleMode (keyboard_handle, prev_console_mode); } void @@ -474,29 +466,18 @@ set_terminal_modes (void) { CONSOLE_CURSOR_INFO cci; - if (cur_screen == NULL) - { - reset_kbd (); - cur_screen = CreateConsoleScreenBuffer (GENERIC_READ | GENERIC_WRITE, - 0, NULL, - CONSOLE_TEXTMODE_BUFFER, - NULL); + /* make cursor big and visible (100 on Win95 makes it disappear) */ + cci.dwSize = 99; + cci.bVisible = TRUE; + (void) SetConsoleCursorInfo (cur_screen, &cci); - if (cur_screen == INVALID_HANDLE_VALUE) - { - printf ("CreateConsoleScreenBuffer failed in ResetTerm\n"); - printf ("LastError = 0x%lx\n", GetLastError ()); - fflush (stdout); - exit (0); - } + SetConsoleActiveScreenBuffer (cur_screen); - SetConsoleActiveScreenBuffer (cur_screen); + SetConsoleMode (keyboard_handle, ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT); - /* make cursor big and visible (100 on Windows 95 makes it disappear) */ - cci.dwSize = 99; - cci.bVisible = TRUE; - (void) SetConsoleCursorInfo (cur_screen, &cci); - } + /* Initialize input mode: interrupt_input off, no flow control, allow + 8 bit character input, standard quit char. */ + Fset_input_mode (Qnil, Qnil, make_number (2), Qnil); } /* hmmm... perhaps these let us bracket screen changes so that we can flush @@ -519,23 +500,6 @@ set_terminal_window (int size) { } -void -unset_kbd (void) -{ - SetConsoleMode (keyboard_handle, prev_console_mode); -} - -void -reset_kbd (void) -{ - keyboard_handle = GetStdHandle (STD_INPUT_HANDLE); - GetConsoleMode (keyboard_handle, &prev_console_mode); - SetConsoleMode (keyboard_handle, ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT); - - /* Try to use interrupt input; if we can't, then start polling. */ - Fset_input_mode (Qt, Qnil, Qt, Qnil); -} - typedef int (*term_hook) (); void @@ -563,11 +527,31 @@ initialize_w32_display (void) read_socket_hook = w32_console_read_socket; mouse_position_hook = w32_mouse_position; - + + /* Remember original console settings. */ + keyboard_handle = GetStdHandle (STD_INPUT_HANDLE); + GetConsoleMode (keyboard_handle, &prev_console_mode); + prev_screen = GetStdHandle (STD_OUTPUT_HANDLE); - set_terminal_modes (); - +#ifdef USE_SEPARATE_SCREEN + cur_screen = CreateConsoleScreenBuffer (GENERIC_READ | GENERIC_WRITE, + 0, NULL, + CONSOLE_TEXTMODE_BUFFER, + NULL); + + if (cur_screen == INVALID_HANDLE_VALUE) + { + printf ("CreateConsoleScreenBuffer failed in ResetTerm\n"); + printf ("LastError = 0x%lx\n", GetLastError ()); + fflush (stdout); + exit (0); + } +#else + cur_screen = prev_screen; + GetConsoleCursorInfo (prev_screen, &prev_console_cursor); +#endif + GetConsoleScreenBufferInfo (cur_screen, &info); meta_key = 1; @@ -578,9 +562,9 @@ initialize_w32_display (void) FRAME_HEIGHT (selected_frame) = info.dwSize.Y; /* lines per page */ SET_FRAME_WIDTH (selected_frame, info.dwSize.X); /* characters per line */ - move_cursor (0, 0); +// move_cursor (0, 0); - clear_frame (); +// clear_frame (); } DEFUN ("set-screen-color", Fset_screen_color, Sset_screen_color, 2, 2, 0, |