From c504990a77e7222cf3ca8bb5ffe180baba62003b Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Fri, 28 May 2021 10:07:54 -0700 Subject: [PATCH] win32: disable quickedit mode when enabling mouse support The Windows conpty layer now allows terminal emulators other than the classic conhost.exe to host win32 console applications that use mouse events. For mouse events to function correctly, mouse input needs to be enabled and quick edit mode needs to be disabled. This commit teaches vim to make this change when it enables mouse mode. I have no special knowledge of vim, and this patch is roughly based on the suggested changes in this discussion: https://groups.google.com/g/vim_dev/c/bQ7jfMwa8Zg The intent is to enable mouse input and disable quickedit when enabling mouse mode, and to disable mouse input and restore the prior quickedit mode state when mouse mode is disabled. refs: https://github.com/microsoft/terminal/pull/9970 --- src/os_win32.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/os_win32.c b/src/os_win32.c index 8a1ed72d7c0cd..c5bbc2bf2bb00 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -1180,6 +1180,8 @@ static int g_fMouseActive = FALSE; // mouse enabled static int g_nMouseClick = -1; // mouse status static int g_xMouse; // mouse x coordinate static int g_yMouse; // mouse y coordinate +static DWORD g_cmodein = 0; // Original console input mode +static DWORD g_cmodeout = 0; // Original console output mode /* * Enable or disable mouse input @@ -1200,11 +1202,17 @@ mch_setmouse(int on) GetConsoleMode(g_hConIn, &cmodein); if (g_fMouseActive) + { cmodein |= ENABLE_MOUSE_INPUT; + cmodein &= ~ENABLE_QUICK_EDIT_MODE; + } else + { cmodein &= ~ENABLE_MOUSE_INPUT; + cmodein |= g_cmodein & ENABLE_QUICK_EDIT_MODE; + } - SetConsoleMode(g_hConIn, cmodein); + SetConsoleMode(g_hConIn, cmodein | ENABLE_EXTENDED_FLAGS); } @@ -2782,8 +2790,6 @@ SaveConsoleTitleAndIcon(void) static int g_fWindInitCalled = FALSE; static int g_fTermcapMode = FALSE; static CONSOLE_CURSOR_INFO g_cci; -static DWORD g_cmodein = 0; -static DWORD g_cmodeout = 0; /* * non-GUI version of mch_init(). @@ -2924,7 +2930,7 @@ mch_exit_c(int r) } SetConsoleCursorInfo(g_hConOut, &g_cci); - SetConsoleMode(g_hConIn, g_cmodein); + SetConsoleMode(g_hConIn, g_cmodein | ENABLE_EXTENDED_FLAGS); SetConsoleMode(g_hConOut, g_cmodeout); # ifdef DYNAMIC_GETTEXT @@ -3747,7 +3753,14 @@ mch_settmode(tmode_T tmode) cmodein &= ~(ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT); if (g_fMouseActive) + { cmodein |= ENABLE_MOUSE_INPUT; + cmodein &= ~ENABLE_QUICK_EDIT_MODE; + } + else + { + cmodein |= g_cmodein & ENABLE_QUICK_EDIT_MODE; + } cmodeout &= ~( # ifdef FEAT_TERMGUICOLORS // Do not turn off the ENABLE_PROCESSED_OUTPUT flag when using @@ -3766,7 +3779,7 @@ mch_settmode(tmode_T tmode) cmodeout |= (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT); bEnableHandler = FALSE; } - SetConsoleMode(g_hConIn, cmodein); + SetConsoleMode(g_hConIn, cmodein | ENABLE_EXTENDED_FLAGS); SetConsoleMode(g_hConOut, cmodeout); SetConsoleCtrlHandler(handler_routine, bEnableHandler); @@ -5621,11 +5634,17 @@ termcap_mode_start(void) GetConsoleMode(g_hConIn, &cmodein); if (g_fMouseActive) + { cmodein |= ENABLE_MOUSE_INPUT; + cmodein &= ~ENABLE_QUICK_EDIT_MODE; + } else + { cmodein &= ~ENABLE_MOUSE_INPUT; + cmodein |= g_cmodein & ENABLE_QUICK_EDIT_MODE; + } cmodein |= ENABLE_WINDOW_INPUT; - SetConsoleMode(g_hConIn, cmodein); + SetConsoleMode(g_hConIn, cmodein | ENABLE_EXTENDED_FLAGS); redraw_later_clear(); g_fTermcapMode = TRUE; @@ -5650,7 +5669,8 @@ termcap_mode_end(void) GetConsoleMode(g_hConIn, &cmodein); cmodein &= ~(ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT); - SetConsoleMode(g_hConIn, cmodein); + cmodein |= g_cmodein & ENABLE_QUICK_EDIT_MODE; + SetConsoleMode(g_hConIn, cmodein | ENABLE_EXTENDED_FLAGS); # ifdef FEAT_RESTORE_ORIG_SCREEN cb = exiting ? &g_cbOrig : &g_cbNonTermcap;