From: Alexandre Julliard <julliard@winehq.org> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59820 --- dlls/user32/combo.c | 24 ++++++++---------- dlls/user32/tests/combo.c | 51 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c index b251402602c..cb927341222 100644 --- a/dlls/user32/combo.c +++ b/dlls/user32/combo.c @@ -1672,11 +1672,17 @@ static void COMBO_MouseMove( LPHEADCOMBO lphc, WPARAM wParam, LPARAM lParam ) } } -static LRESULT COMBO_GetComboBoxInfo(const HEADCOMBO *lphc, COMBOBOXINFO *pcbi) + +/************************************************************************* + * GetComboBoxInfo (USER32.@) + */ +BOOL WINAPI GetComboBoxInfo( HWND hwnd, COMBOBOXINFO *pcbi ) { - if (!pcbi || (pcbi->cbSize < sizeof(COMBOBOXINFO))) - return FALSE; + HEADCOMBO *lphc = get_control_state( hwnd ); + if (!lphc || !pcbi || (pcbi->cbSize < sizeof(COMBOBOXINFO))) + return FALSE; + TRACE("(%p, %p)\n", hwnd, pcbi); pcbi->rcItem = lphc->textRect; pcbi->rcButton = lphc->buttonRect; pcbi->stateButton = 0; @@ -2078,7 +2084,7 @@ LRESULT ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar case CB_GETEXTENDEDUI: return (lphc->wState & CBF_EUI) != 0; case CB_GETCOMBOBOXINFO: - return COMBO_GetComboBoxInfo(lphc, (COMBOBOXINFO *)lParam); + return GetComboBoxInfo(hwnd, (COMBOBOXINFO *)lParam); case CB_LIMITTEXT: if( lphc->wState & CBF_EDIT ) return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam); @@ -2092,13 +2098,3 @@ LRESULT ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar return unicode ? DefWindowProcW(hwnd, message, wParam, lParam) : DefWindowProcA(hwnd, message, wParam, lParam); } - -/************************************************************************* - * GetComboBoxInfo (USER32.@) - */ -BOOL WINAPI GetComboBoxInfo(HWND hwndCombo, /* [in] handle to combo box */ - PCOMBOBOXINFO pcbi /* [in/out] combo box information */) -{ - TRACE("(%p, %p)\n", hwndCombo, pcbi); - return SendMessageW(hwndCombo, CB_GETCOMBOBOXINFO, 0, (LPARAM)pcbi); -} diff --git a/dlls/user32/tests/combo.c b/dlls/user32/tests/combo.c index 8d93369d79a..cb190e32ae2 100644 --- a/dlls/user32/tests/combo.c +++ b/dlls/user32/tests/combo.c @@ -1026,6 +1026,56 @@ static void test_combo_measureitem(DWORD style) winetest_pop_context(); } +static int got_info; +static WNDPROC old_combo_proc; + +static LRESULT CALLBACK combo_wnd_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) +{ + if (msg == CB_GETCOMBOBOXINFO) got_info++; + return CallWindowProcA( old_combo_proc, hwnd, msg, wparam, lparam ); +} + +static DWORD CALLBACK combo_thread( void *arg ) +{ + unsigned int ret; + COMBOBOXINFO info = { .cbSize = sizeof(COMBOBOXINFO) }; + HWND combo = arg; + + got_info = 0; + ret = GetComboBoxInfo(combo, &info); + ok( ret, "Failed to get combobox info structure.\n" ); + ok( !got_info, "CB_GETCOMBOBOXINFO was sent from other thread\n" ); + return 0; +} + +static void test_combo_info(void) +{ + unsigned int ret; + COMBOBOXINFO info = { .cbSize = sizeof(COMBOBOXINFO) }; + HWND combo; + HANDLE thread; + DWORD id; + + combo = build_combo(CBS_DROPDOWN); + ok(!!combo, "Failed to create combo window.\n"); + + old_combo_proc = (void *)SetWindowLongPtrA( combo, GWLP_WNDPROC, (ULONG_PTR)combo_wnd_proc ); + + got_info = 0; + ret = GetComboBoxInfo( combo, &info ); + ok( ret, "Failed to get combobox info structure.\n" ); + ok( !got_info, "CB_GETCOMBOBOXINFO was sent\n" ); + thread = CreateThread( NULL, 0, combo_thread, combo, 0, &id ); + while (MsgWaitForMultipleObjects( 1, &thread, FALSE, INFINITE, MWMO_WAITALL ) != WAIT_OBJECT_0) + { + MSG msg; + while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + } + CloseHandle( thread ); + SetWindowLongPtrA( combo, GWLP_WNDPROC, (ULONG_PTR)old_combo_proc ); + DestroyWindow( combo ); +} + START_TEST(combo) { brush_red = CreateSolidBrush(RGB(255, 0, 0)); @@ -1054,6 +1104,7 @@ START_TEST(combo) test_combo_measureitem(CBS_DROPDOWNLIST | CBS_OWNERDRAWVARIABLE); test_combo_measureitem(CBS_DROPDOWNLIST); test_combo_measureitem(CBS_DROPDOWN | CBS_OWNERDRAWFIXED); + test_combo_info(); DestroyWindow(hMainWnd); DeleteObject(brush_red); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11162