diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 7c90935390f..c3f8b65833e 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -80,6 +80,7 @@ C_ASSERT( sizeof(struct packed_NCCALCSIZE_PARAMS) >= sizeof(NCCALCSIZE_PARAMS) + C_ASSERT( sizeof(struct packed_MSG) >= sizeof(MSG) ); C_ASSERT( sizeof(struct packed_MDINEXTMENU) >= sizeof(MDINEXTMENU) ); C_ASSERT( sizeof(struct packed_MDICREATESTRUCTW) >= sizeof(MDICREATESTRUCTW) ); +C_ASSERT( sizeof(struct packed_COMBOBOXINFO) >= sizeof(COMBOBOXINFO) ); C_ASSERT( sizeof(struct packed_hook_extra_info) >= sizeof(struct hook_extra_info) ); union packed_structs @@ -96,6 +97,7 @@ union packed_structs struct packed_MSG msg; struct packed_MDINEXTMENU mnm; struct packed_MDICREATESTRUCTW mcs; + struct packed_COMBOBOXINFO cbi; struct packed_hook_extra_info hook; }; @@ -161,7 +163,7 @@ static const unsigned int message_pointer_flags[] = SET(CB_INSERTSTRING) | SET(CB_FINDSTRING) | SET(CB_SELECTSTRING) | SET(CB_GETDROPPEDCONTROLRECT) | SET(CB_FINDSTRINGEXACT), /* 0x160 - 0x17f */ - 0, + SET(CB_GETCOMBOBOXINFO), /* 0x180 - 0x19f */ SET(LB_ADDSTRING) | SET(LB_INSERTSTRING) | SET(LB_GETTEXT) | SET(LB_SELECTSTRING) | SET(LB_DIR) | SET(LB_FINDSTRING) | @@ -373,6 +375,12 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( &ps->hook, &h_extra, sizeof(h_extra) ); break; } + case CB_GETCOMBOBOXINFO: + { + COMBOBOXINFO cbi = { sizeof(COMBOBOXINFO) }; + memcpy( ps, &cbi, sizeof(cbi) ); + break; + } default: return TRUE; /* message doesn't need any unpacking */ } @@ -616,6 +624,8 @@ static size_t pack_message( HWND hwnd, UINT message, WPARAM wparam, LPARAM lpara case CB_GETLBTEXT: if (!combobox_has_strings( hwnd )) return sizeof(ULONG_PTR); return (send_message( hwnd, CB_GETLBTEXTLEN, wparam, 0 ) + 1) * sizeof(WCHAR); + case CB_GETCOMBOBOXINFO: + return sizeof(data->ps.cbi); case LB_ADDSTRING: case LB_INSERTSTRING: case LB_FINDSTRING: @@ -763,6 +773,18 @@ static void pack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, case LB_GETTEXT: push_data( data, (WCHAR *)lparam, (res + 1) * sizeof(WCHAR) ); break; + case CB_GETCOMBOBOXINFO: + { + COMBOBOXINFO *cbi = (COMBOBOXINFO *)lparam; + data->ps.cbi.rcItem = cbi->rcItem; + data->ps.cbi.rcButton = cbi->rcButton; + data->ps.cbi.stateButton = cbi->stateButton; + data->ps.cbi.hwndCombo = wine_server_user_handle( cbi->hwndCombo ); + data->ps.cbi.hwndItem = wine_server_user_handle( cbi->hwndItem ); + data->ps.cbi.hwndList = wine_server_user_handle( cbi->hwndList ); + push_data( data, &data->ps.cbi, sizeof(data->ps.cbi) ); + break; + } case WM_GETMINMAXINFO: push_data( data, (MINMAXINFO *)lparam, sizeof(MINMAXINFO) ); break; @@ -981,6 +1003,19 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, case CB_GETLBTEXT: memcpy( (WCHAR *)lparam, buffer, size ); break; + case CB_GETCOMBOBOXINFO: + if (lparam && size >= sizeof(ps->cbi) && + ((COMBOBOXINFO*)lparam)->cbSize == sizeof(COMBOBOXINFO)) + { + COMBOBOXINFO *cbi = (COMBOBOXINFO *)lparam; + cbi->rcItem = ps->cbi.rcItem; + cbi->rcButton = ps->cbi.rcButton; + cbi->stateButton = ps->cbi.stateButton; + cbi->hwndCombo = wine_server_ptr_handle( ps->cbi.hwndCombo ); + cbi->hwndItem = wine_server_ptr_handle( ps->cbi.hwndItem ); + cbi->hwndList = wine_server_ptr_handle( ps->cbi.hwndList ); + } + break; case WM_NEXTMENU: if (size >= sizeof(ps->mnm)) { @@ -1088,6 +1123,9 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case WM_WINDOWPOSCHANGED: copy_size = sizeof(WINDOWPOS); break; + case CB_GETCOMBOBOXINFO: + copy_size = sizeof(COMBOBOXINFO); + break; case WM_STYLECHANGING: copy_size = sizeof(STYLESTRUCT); break; diff --git a/include/ntuser.h b/include/ntuser.h index 31317026cd8..cc6126e53db 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -669,6 +669,17 @@ struct packed_MDICREATESTRUCTW ULONGLONG lParam; }; +struct packed_COMBOBOXINFO +{ + DWORD cbSize; + RECT rcItem; + RECT rcButton; + DWORD stateButton; + ULONGLONG hwndCombo; + ULONGLONG hwndItem; + ULONGLONG hwndList; +}; + HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags ); BOOL WINAPI NtUserAddClipboardFormatListener( HWND hwnd );