Skip to content
Snippets Groups Projects
Commit 673210b0 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Save and restore the console state for ANSI and Win32Console

Now it doesn't leave the console all messed up.
parent 6c4d4a18
No related branches found
No related tags found
No related merge requests found
Pipeline #6918 failed
......@@ -68,6 +68,12 @@ static int ansi_raw_inch;
static WORD *ansivmem;
static int force_move=1;
static DWORD orig_in_mode;
static DWORD orig_out_mode;
static CONSOLE_SCREEN_BUFFER_INFOEX orig_sbiex = {
.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX),
};
/* Control sequence table definitions. */
typedef struct
{
......@@ -908,12 +914,20 @@ void ansi_textmode(int mode)
ansiy=1;
}
#ifdef __unix__
void ansi_fixterm(void)
{
tcsetattr(STDIN_FILENO,TCSANOW,&tio_default);
#ifdef _WIN32
if (isatty(fileno(stdin)))
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), orig_in_mode);
if (isatty(fileno(stdout))) {
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleMode(h, orig_out_mode);
SetConsoleScreenBufferInfoEx(h, &orig_sbiex);
}
#else
tcsetattr(STDIN_FILENO,TCSANOW,&tio_default);
#endif
}
#ifndef ENABLE_EXTENDED_FLAGS
#define ENABLE_INSERT_MODE 0x0020
......@@ -951,6 +965,7 @@ int ansi_initio_cb(void)
HANDLE h;
if(isatty(fileno(stdin))) {
h = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(h, &orig_in_mode);
conmode = ENABLE_VIRTUAL_TERMINAL_INPUT;
if(!SetConsoleMode(h, conmode))
return(0);
......@@ -958,6 +973,11 @@ int ansi_initio_cb(void)
if(isatty(fileno(stdout))) {
h = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(h, &orig_out_mode);
GetConsoleScreenBufferInfoEx(h, &orig_sbiex);
// FFS Microsoft, get your shut together.
orig_sbiex.srWindow.Bottom++;
orig_sbiex.srWindow.Right++;
conmode = ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT;
if(!SetConsoleMode(h, conmode))
return(0);
......@@ -984,6 +1004,7 @@ int ansi_initio_cb(void)
ansi_writestr_cb(seq, slen);
}
}
atexit(ansi_fixterm);
#else
struct termios tio_raw;
......
......@@ -390,6 +390,9 @@ int win32_getch(void)
static DWORD orig_in_conmode=0;
static DWORD orig_out_conmode=0;
static CONSOLE_SCREEN_BUFFER_INFOEX orig_sbiex = {
.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX),
};
static void * win32_suspendbuf=NULL;
#ifndef CONSOLE_FULLSCREEN_MODE
......@@ -484,12 +487,6 @@ BOOL NT_GetConsoleDisplayMode(DWORD* mode)
}
void RestoreDisplayMode(void)
{
if(orig_display_mode==0)
NT_SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE),CONSOLE_WINDOWED_MODE);
}
void win32_suspend(void)
{
HANDLE h;
......@@ -500,6 +497,16 @@ void win32_suspend(void)
SetConsoleMode(h, orig_in_conmode);
}
void RestoreDisplayMode(void)
{
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
if(orig_display_mode==0)
NT_SetConsoleDisplayMode(h,CONSOLE_WINDOWED_MODE);
win32_suspend();
SetConsoleScreenBufferInfoEx(h, &orig_sbiex);
SetConsoleScreenBufferInfoEx(h, &orig_sbiex);
}
void win32_resume(void)
{
DWORD conmode;
......@@ -545,6 +552,10 @@ int win32_initciolib(int inmode)
if((h=GetStdHandle(STD_OUTPUT_HANDLE))==INVALID_HANDLE_VALUE
|| !GetConsoleMode(h, &orig_out_conmode))
return(0);
GetConsoleScreenBufferInfoEx(h, &orig_sbiex);
// FFS Microsoft, get your shut together.
orig_sbiex.srWindow.Bottom++;
orig_sbiex.srWindow.Right++;
conmode=orig_out_conmode;
conmode&=~ENABLE_PROCESSED_OUTPUT;
conmode&=~ENABLE_WRAP_AT_EOL_OUTPUT;
......@@ -623,8 +634,8 @@ int win32_initciolib(int inmode)
NT_GetConsoleDisplayMode(&orig_display_mode);
if(inmode==CIOLIB_MODE_CONIO_FULLSCREEN) {
NT_SetConsoleDisplayMode(h,CONSOLE_FULLSCREEN_MODE);
atexit(RestoreDisplayMode);
}
atexit(RestoreDisplayMode);
cio_api.mouse=1;
cio_api.options = CONIO_OPT_BRIGHT_BACKGROUND | CONIO_OPT_CUSTOM_CURSOR | CONIO_OPT_SET_TITLE;
return(1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment