Skip to content

Commit

Permalink
Windows: keep console input mode separate from output mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
gwsw committed Oct 2, 2023
1 parent e4822f7 commit 308cd52
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 21 deletions.
29 changes: 14 additions & 15 deletions screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,8 @@ static int sy_fg_color; /* Color of system text (before less) */
static int sy_bg_color;
public int sgr_mode; /* Honor ANSI sequences rather than using above */
#if MSDOS_COMPILER==WIN32C
public DWORD init_console_mode; /* The initial console output mode */
public DWORD curr_console_mode; /* The current console output mode */
static DWORD init_console_output_mode;
extern DWORD curr_console_input_mode;
public int vt_enabled = -1; /* Is virtual terminal processing available? */
#endif
#else
Expand Down Expand Up @@ -284,7 +284,6 @@ extern int hilite_search;
#if MSDOS_COMPILER==WIN32C
extern int wscroll;
extern HANDLE tty;
extern DWORD console_mode;
#ifndef ENABLE_EXTENDED_FLAGS
#define ENABLE_EXTENDED_FLAGS 0x80
#define ENABLE_QUICK_EDIT_MODE 0x40
Expand Down Expand Up @@ -1171,7 +1170,7 @@ public void get_term(void)
* before any file operations have been done on fd0.
*/
SET_BINARY(0);
GetConsoleMode(con_out, &init_console_mode);
GetConsoleMode(con_out, &init_console_output_mode);
GetConsoleScreenBufferInfo(con_out, &scr);
curr_attr = scr.wAttributes;
sy_bg_color = (curr_attr & BG_COLORS) >> 4; /* normalize */
Expand Down Expand Up @@ -1565,16 +1564,15 @@ static void initcolor(void)
*/
static void win32_init_vt_term(void)
{
DWORD console_mode;
DWORD console_output_mode;

if (vt_enabled == 0 || (vt_enabled == 1 && con_out == con_out_ours))
return;

console_mode = curr_console_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
vt_enabled = SetConsoleMode(con_out, console_mode);
console_output_mode = init_console_output_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
vt_enabled = SetConsoleMode(con_out, console_output_mode);
if (vt_enabled)
{
curr_console_mode = console_mode;
auto_wrap = 0;
ignaw = 1;
}
Expand All @@ -1583,7 +1581,7 @@ static void win32_init_vt_term(void)
static void win32_deinit_vt_term(void)
{
if (vt_enabled == 1 && con_out == con_out_save)
SetConsoleMode(con_out, init_console_mode);
SetConsoleMode(con_out, init_console_output_mode);
}

/*
Expand Down Expand Up @@ -1700,9 +1698,8 @@ public void init_mouse(void)
ltputs(sc_s_mousecap, sc_height, putchr);
#else
#if MSDOS_COMPILER==WIN32C
curr_console_mode = ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS; /* disable quick edit */
SetConsoleMode(tty, curr_console_mode);

curr_console_input_mode = (curr_console_input_mode | ENABLE_MOUSE_INPUT) & ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(tty, curr_console_input_mode);
#endif
#endif
}
Expand All @@ -1717,8 +1714,8 @@ public void deinit_mouse(void)
ltputs(sc_e_mousecap, sc_height, putchr);
#else
#if MSDOS_COMPILER==WIN32C
curr_console_mode = ENABLE_PROCESSED_INPUT | ENABLE_EXTENDED_FLAGS | (curr_console_mode & ENABLE_QUICK_EDIT_MODE);
SetConsoleMode(tty, curr_console_mode);
curr_console_input_mode = (curr_console_input_mode | ENABLE_QUICK_EDIT_MODE) & ~ENABLE_MOUSE_INPUT;
SetConsoleMode(tty, curr_console_input_mode);
#endif
#endif
}
Expand Down Expand Up @@ -3035,11 +3032,13 @@ public int win32_kbhit(void)
for (;;)
{
DWORD nread;
DWORD console_input_mode;
/*
* When an input pipe closes, cmd may reset the console mode,
* so set the mode every time we read input.
*/
SetConsoleMode(tty, curr_console_mode);
if (GetConsoleMode(tty, &console_input_mode) && console_input_mode != curr_console_input_mode)
SetConsoleMode(tty, curr_console_input_mode);
PeekConsoleInputW(tty, &xip.ir, 1, &nread);
if (nread == 0)
return (FALSE);
Expand Down
13 changes: 7 additions & 6 deletions ttyin.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
#endif
#include <windows.h>
public HANDLE tty;
extern DWORD init_console_mode;
extern DWORD curr_console_mode;
static DWORD init_console_input_mode;
public DWORD curr_console_input_mode;
#else
public int tty;
#endif
Expand Down Expand Up @@ -89,8 +89,9 @@ public void open_getchr(void)
FILE_SHARE_READ, &sa,
OPEN_EXISTING, 0L, NULL);
/* Make sure we get Ctrl+C events. */
curr_console_mode = ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT;
SetConsoleMode(tty, curr_console_mode);
GetConsoleMode(tty, &init_console_input_mode);
curr_console_input_mode = ENABLE_PROCESSED_INPUT | ENABLE_EXTENDED_FLAGS | ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(tty, curr_console_input_mode);
#else
#if MSDOS_COMPILER
extern int fd0;
Expand Down Expand Up @@ -120,7 +121,7 @@ public void open_getchr(void)
public void close_getchr(void)
{
#if MSDOS_COMPILER==WIN32C
SetConsoleMode(tty, init_console_mode);
SetConsoleMode(tty, init_console_input_mode);
CloseHandle(tty);
#endif
}
Expand All @@ -134,7 +135,7 @@ public int pclose(FILE *f)
int result;

result = _pclose(f);
SetConsoleMode(tty, curr_console_mode);
SetConsoleMode(tty, curr_console_input_mode);
return result;
}
#endif
Expand Down

0 comments on commit 308cd52

Please sign in to comment.