This test is not reliable on my Debian desktop. http://test.winehq.org/data/3b40c03a8f0e3dcbb236d59125b115b2501086f8/linux_f...
inputprocessor.c:2117: Test failed: OnSetFocus expected current focus 0x12b070 got 0x12b0d0 inputprocessor.c:538: Test failed: Unexpected ThreadMgrEventSink_OnSetFocus sink inputprocessor.c:549: Test failed: Sink reports wrong previous focus
If I run it in a loop it fails about once every twelve times:
i=0;while ../../../tools/runtest inputprocessor.c && [ $i -lt 100 ];do i=`expr $i + 1`; echo $i; done
Introducing a single Sleep(50) as shown below makes it totally reliable here.
ShowWindow(wnd3,SW_SHOWNORMAL); SetFocus(wnd3); + Sleep(50); processPendingMessages();
test_CurrentFocus = FOCUS_SAVE; test_PrevFocus = FOCUS_SAVE; test_OnSetFocus = SINK_SAVE; SetFocus(wnd1); processPendingMessages(); sink_check_saved(&test_OnSetFocus,dm2,dm1,"OnSetFocus"); /* ^^^ Line that fails! */
That seems pretty hacky though. I suspect this is all because processPendingMessages() will exit if there's no pending message right after we call SetFocus() without giving enough time for the asynchronous X event to arrive.
But I'm surprised that a single Sleep() fixes the issue, especially where it's placed. Also I don't know anything about msctf so I'm unsure how ThreadMgrEventSink_OnSetFocus() figures in all this.
So should I just submit a patch to add that Sleep()?
Or would it be better to change processPendingMessages() to look more like user32/tests/msg.c's flush_events() function although it looks like it's overkill for now?
Francois Gouget fgouget@free.fr writes:
Or would it be better to change processPendingMessages() to look more like user32/tests/msg.c's flush_events() function although it looks like it's overkill for now?
That's preferable, yes.