A thread is used to send mouse clicks to test mouse click handling for menu. If the thread sends mouse clicks before pop-up menu initialization, it would report send input failure and skip the tests.
This patch make the message send thread sleeps for a while when failure and retry. Also the sleep at the start of the loop is not necessary, thus removed.
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/user32/tests/menu.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c index 54a5ea232a..3f882d83c7 100644 --- a/dlls/user32/tests/menu.c +++ b/dlls/user32/tests/menu.c @@ -2253,7 +2253,7 @@ static struct menu_mouse_tests_s { { INPUT_MOUSE, {{1, 0}, {2, 0}, {0}}, {0}, TRUE, FALSE }, { INPUT_MOUSE, {{3, 0}, {0}}, {0}, FALSE, FALSE }, { INPUT_MOUSE, {{1, 0}, {2, 0}, {0}}, {0}, TRUE, FALSE }, - { INPUT_MOUSE, {{3, 1}, {0}}, {0}, TRUE, TRUE }, + { INPUT_MOUSE, {{3, 1}, {0}}, {0}, TRUE, FALSE }, { INPUT_MOUSE, {{1, 1}, {0}}, {0}, FALSE, FALSE }, { -1 } }; @@ -2302,12 +2302,11 @@ static DWORD WINAPI test_menu_input_thread(LPVOID lpParameter) int i, j; HANDLE hWnd = lpParameter;
- Sleep(500); /* mixed keyboard/mouse test */ for (i = 0; menu_tests[i].type != -1; i++) { BOOL ret = TRUE; - int elapsed = 0; + int elapsed;
got_input = i && menu_tests[i-1].bMenuVisible;
@@ -2315,8 +2314,18 @@ static DWORD WINAPI test_menu_input_thread(LPVOID lpParameter) for (j = 0; menu_tests[i].wVk[j] != 0; j++) send_key(menu_tests[i].wVk[j]); else + { + elapsed = 0; for (j = 0; menu_tests[i].menu_item_pairs[j].uMenu != 0; j++) - if (!(ret = click_menu(hWnd, &menu_tests[i].menu_item_pairs[j]))) break; + if (!(ret = click_menu(hWnd, &menu_tests[i].menu_item_pairs[j]))) + { + /* Maybe clicking too fast before menu is initialized. Sleep 100 ms and retry */ + if (elapsed > 500) break; + j--; + elapsed += 100; + Sleep(100); + } + }
if (!ret) { @@ -2324,6 +2333,8 @@ static DWORD WINAPI test_menu_input_thread(LPVOID lpParameter) PostMessageA( hWnd, WM_CANCELMODE, 0, 0 ); return 0; } + + elapsed = 0; while (menu_tests[i].bMenuVisible != bMenuVisible) { if (elapsed > 200)