diff --git a/src/conio/ansi_cio.c b/src/conio/ansi_cio.c index b4e47878bc3e141d5937ef6ca8a74aa028ff091d..1cfd4dc56a111cf9aa5651d3ce812c084c0ddda0 100644 --- a/src/conio/ansi_cio.c +++ b/src/conio/ansi_cio.c @@ -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) { +#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; diff --git a/src/conio/win32cio.c b/src/conio/win32cio.c index b7a820704ff1ddf9ac85f03497011840122c2716..feae83dedbd3c3b43d74c5ab9b52548522eb9ee9 100644 --- a/src/conio/win32cio.c +++ b/src/conio/win32cio.c @@ -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);