CONSOLE: Really support Windows 'ANSI' escape sequences in console sessions
The console mode needs to be set to properly interpret and generate ANSI escape sequences. It is not 100% VT100 compatible, but this is MUCH better than without any support.
This commit is contained in:
parent
d77e3e196e
commit
316565c45b
1 changed files with 34 additions and 8 deletions
|
@ -2049,7 +2049,7 @@ if ((sim_con_tmxr.master == 0) && /* not Telnet? */
|
||||||
(sim_con_ldsc.serport == 0)) { /* and not serial port */
|
(sim_con_ldsc.serport == 0)) { /* and not serial port */
|
||||||
if (sim_log) /* log file? */
|
if (sim_log) /* log file? */
|
||||||
fputc (c, sim_log);
|
fputc (c, sim_log);
|
||||||
sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x02X)\n", sim_isprint (c) ? c : '.', c);
|
sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x%02X)\n", sim_isprint (c) ? c : '.', c);
|
||||||
return sim_os_putchar (c); /* in-window version */
|
return sim_os_putchar (c); /* in-window version */
|
||||||
}
|
}
|
||||||
if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */
|
if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */
|
||||||
|
@ -2072,6 +2072,7 @@ if ((sim_con_tmxr.master == 0) && /* not Telnet? */
|
||||||
(sim_con_ldsc.serport == 0)) { /* and not serial port */
|
(sim_con_ldsc.serport == 0)) { /* and not serial port */
|
||||||
if (sim_log) /* log file? */
|
if (sim_log) /* log file? */
|
||||||
fputc (c, sim_log);
|
fputc (c, sim_log);
|
||||||
|
sim_debug (DBG_XMT, &sim_con_telnet, "sim_putchar('%c' (0x%02X)\n", sim_isprint (c) ? c : '.', c);
|
||||||
return sim_os_putchar (c); /* in-window version */
|
return sim_os_putchar (c); /* in-window version */
|
||||||
}
|
}
|
||||||
if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */
|
if (!sim_con_ldsc.conn) { /* no Telnet or serial connection? */
|
||||||
|
@ -2526,7 +2527,14 @@ return SCPE_OK;
|
||||||
#define RAW_MODE 0
|
#define RAW_MODE 0
|
||||||
static HANDLE std_input;
|
static HANDLE std_input;
|
||||||
static HANDLE std_output;
|
static HANDLE std_output;
|
||||||
static DWORD saved_mode;
|
static DWORD saved_input_mode;
|
||||||
|
static DWORD saved_output_mode;
|
||||||
|
#ifndef ENABLE_VIRTUAL_TERMINAL_INPUT
|
||||||
|
#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200
|
||||||
|
#endif
|
||||||
|
#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
||||||
|
#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Note: This routine catches all the potential events which some aspect
|
/* Note: This routine catches all the potential events which some aspect
|
||||||
of the windows system can generate. The CTRL_C_EVENT won't be
|
of the windows system can generate. The CTRL_C_EVENT won't be
|
||||||
|
@ -2565,17 +2573,28 @@ std_input = GetStdHandle (STD_INPUT_HANDLE);
|
||||||
std_output = GetStdHandle (STD_OUTPUT_HANDLE);
|
std_output = GetStdHandle (STD_OUTPUT_HANDLE);
|
||||||
if ((std_input) && /* Not Background process? */
|
if ((std_input) && /* Not Background process? */
|
||||||
(std_input != INVALID_HANDLE_VALUE))
|
(std_input != INVALID_HANDLE_VALUE))
|
||||||
GetConsoleMode (std_input, &saved_mode); /* Save Mode */
|
GetConsoleMode (std_input, &saved_input_mode); /* Save Input Mode */
|
||||||
|
if ((std_output) && /* Not Background process? */
|
||||||
|
(std_output != INVALID_HANDLE_VALUE))
|
||||||
|
GetConsoleMode (std_output, &saved_output_mode); /* Save Output Mode */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static t_stat sim_os_ttrun (void)
|
static t_stat sim_os_ttrun (void)
|
||||||
{
|
{
|
||||||
if ((std_input) && /* If Not Background process? */
|
if ((std_input) && /* If Not Background process? */
|
||||||
(std_input != INVALID_HANDLE_VALUE) &&
|
(std_input != INVALID_HANDLE_VALUE)) {
|
||||||
(!GetConsoleMode(std_input, &saved_mode) || /* Set mode to RAW */
|
if (!GetConsoleMode(std_input, &saved_input_mode))
|
||||||
!SetConsoleMode(std_input, RAW_MODE)))
|
return SCPE_TTYERR;
|
||||||
return SCPE_TTYERR;
|
if ((!SetConsoleMode(std_input, ENABLE_VIRTUAL_TERMINAL_INPUT)) &&
|
||||||
|
(!SetConsoleMode(std_input, RAW_MODE)))
|
||||||
|
return SCPE_TTYERR;
|
||||||
|
}
|
||||||
|
if ((std_output) && /* If Not Background process? */
|
||||||
|
(std_output != INVALID_HANDLE_VALUE)) {
|
||||||
|
if (GetConsoleMode(std_output, &saved_output_mode))
|
||||||
|
SetConsoleMode(std_output, ENABLE_VIRTUAL_TERMINAL_PROCESSING|ENABLE_PROCESSED_OUTPUT);
|
||||||
|
}
|
||||||
if (sim_log) {
|
if (sim_log) {
|
||||||
fflush (sim_log);
|
fflush (sim_log);
|
||||||
_setmode (_fileno (sim_log), _O_BINARY);
|
_setmode (_fileno (sim_log), _O_BINARY);
|
||||||
|
@ -2593,7 +2612,11 @@ if (sim_log) {
|
||||||
sim_os_set_thread_priority (PRIORITY_NORMAL);
|
sim_os_set_thread_priority (PRIORITY_NORMAL);
|
||||||
if ((std_input) && /* If Not Background process? */
|
if ((std_input) && /* If Not Background process? */
|
||||||
(std_input != INVALID_HANDLE_VALUE) &&
|
(std_input != INVALID_HANDLE_VALUE) &&
|
||||||
(!SetConsoleMode(std_input, saved_mode))) /* Restore Normal mode */
|
(!SetConsoleMode(std_input, saved_input_mode))) /* Restore Normal mode */
|
||||||
|
return SCPE_TTYERR;
|
||||||
|
if ((std_output) && /* If Not Background process? */
|
||||||
|
(std_output != INVALID_HANDLE_VALUE) &&
|
||||||
|
(!SetConsoleMode(std_output, saved_output_mode))) /* Restore Normal mode */
|
||||||
return SCPE_TTYERR;
|
return SCPE_TTYERR;
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
@ -2669,6 +2692,7 @@ return (WAIT_OBJECT_0 == WaitForSingleObject (std_input, ms_timeout));
|
||||||
#define BELL_INTERVAL_MS 500 /* No more than 2 Bell Characters Per Second */
|
#define BELL_INTERVAL_MS 500 /* No more than 2 Bell Characters Per Second */
|
||||||
#define ESC_CHAR 033 /* Escape Character */
|
#define ESC_CHAR 033 /* Escape Character */
|
||||||
#define CSI_CHAR 0233 /* Control Sequence Introducer */
|
#define CSI_CHAR 0233 /* Control Sequence Introducer */
|
||||||
|
#define NUL_CHAR 0000 /* NUL character */
|
||||||
#define ESC_HOLD_USEC_DELAY 8000 /* Escape hold interval */
|
#define ESC_HOLD_USEC_DELAY 8000 /* Escape hold interval */
|
||||||
#define ESC_HOLD_MAX 32 /* Maximum Escape hold buffer */
|
#define ESC_HOLD_MAX 32 /* Maximum Escape hold buffer */
|
||||||
|
|
||||||
|
@ -2701,6 +2725,8 @@ if (c != 0177) {
|
||||||
last_bell_time = now;
|
last_bell_time = now;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case NUL_CHAR:
|
||||||
|
break;
|
||||||
case CSI_CHAR:
|
case CSI_CHAR:
|
||||||
case ESC_CHAR:
|
case ESC_CHAR:
|
||||||
if (out_ptr) {
|
if (out_ptr) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue