From: Muraoka Taro Date: Tue, 24 Feb 2026 21:30:43 +0000 (+0000) Subject: patch 9.2.0050: WM_SETFOCUS not handled immediately X-Git-Tag: v9.2.0050^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4a6fa3eade9d30e0bda7e5b7077951da9e75279;p=thirdparty%2Fvim.git patch 9.2.0050: WM_SETFOCUS not handled immediately Problem: In gvim on Windows, a certain problem can occur when the WM_SETFOCUS event sent after an external command is not processed immediately. Solution: After posting WM_SETFOCUS, run the message loop to process it as quickly as possible (Muraoka Taro). The problem is that Test_normal11_showcmd may fail when running the test_normal.vim test. Investigation revealed that the trigger was an external command executed in the previous test, Test_mouse_shape_after_failed_change, when two tests were executed consecutively. In gvim on Windows, a WM_SETFOCUS event will be sent when an external command finishes executing. This WM_SETFOCUS event is not processed immediately, but rather by redraw, which is expected to update showcmd. Because it is queued in typebuf at this time, clear_showcmd(), which expects typebuf to be empty, cannot update showcmd. Also added a test that simulates the above problem. closes: #19167 Signed-off-by: Muraoka Taro Signed-off-by: Christian Brabandt --- diff --git a/src/os_win32.c b/src/os_win32.c index edaf7cb306..6ccd185f08 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -4881,6 +4881,10 @@ mch_system_classic(char *cmd, int options) // Try to get input focus back. Doesn't always work though. PostMessage(hwnd, WM_SETFOCUS, 0, 0); + // To increase the chances that WM_SETFOCUS will work, run the message loop + // here. In addition, it prevents problems caused by delayed WM_SETFOCUS + // processing. + gui_mch_update(); return ret; } diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index 58c1b97832..f41ae0552c 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -4411,4 +4411,33 @@ func Test_pos_percentage_in_turkish_locale() endtry endfunc +" This test simulates the problem with gvim on Windows, observed when +" Test_normal11_showcmd in test_normal.vim is executed consecutively after +" Test_mouse_shape_after_failed_change. +" +" The problem occurred because WM_SETFOCUS was processed slowly, and typebuf +" was not empty when it should have been. +func Test_win32_gui_setfocus_prevent_showcmd() + if !has('win32') || !has('gui_running') + throw 'Skipped: Windows GUI regression test' + endif + + " WM_SETFOCUS event occurs when finish to execute filter command in gvim + exe 'silent !echo foo' + + set showcmd + 10new + call setline(1, ['aaaaa', 'bbbbb', 'ccccc']) + call feedkeys("ggl\lljj", 'xt') + + " showcmd could not be updated because events originating from WM_SETFOCUS + " were stored in typebuf at here. clear_showcmd() executed from redraw, + " will not draw the selection information unless you are in visual mode and + " typebuf is empty. + redraw! + + call assert_match('3x3$', Screenline(&lines)) + call feedkeys("\", 'xt') +endfunc + " vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/version.c b/src/version.c index 620e1a5bd9..076063b4cf 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 50, /**/ 49, /**/