[PATCH 0/5] MR11023: user32: Set builtin class FNID for more controls.
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/static.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/dlls/user32/static.c b/dlls/user32/static.c index 7cb138c0fd3..aeb8ecf91f4 100644 --- a/dlls/user32/static.c +++ b/dlls/user32/static.c @@ -78,6 +78,25 @@ static const pfPaint staticPaintFunc[SS_TYPEMASK+1] = STATIC_PaintEtchedfn, /* SS_ETCHEDFRAME */ }; +static HFONT get_control_font( HWND hwnd ) +{ + return (HFONT)NtUserGetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT) ); +} + +static HFONT set_control_font( HWND hwnd, HFONT font ) +{ + return (HFONT)NtUserSetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(font), (LONG_PTR)font ); +} + +static HANDLE get_control_icon( HWND hwnd ) +{ + return (HFONT)NtUserGetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(HICON) ); +} + +static HANDLE set_control_icon( HWND hwnd, HANDLE icon ) +{ + return (HANDLE)NtUserSetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(icon), (LONG_PTR)icon ); +} /*********************************************************************** * STATIC_SetIcon @@ -94,7 +113,7 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style ) WARN("hicon != 0, but invalid\n"); return 0; } - prevIcon = (HICON)NtUserSetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(hicon), (LONG_PTR)hicon ); + prevIcon = set_control_icon( hwnd, hicon ); if (hicon && !(style & SS_CENTERIMAGE) && !(style & SS_REALSIZECONTROL)) { /* Windows currently doesn't implement SS_RIGHTJUST */ @@ -127,7 +146,7 @@ static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style ) WARN("hBitmap != 0, but it's not a bitmap\n"); return 0; } - hOldBitmap = (HBITMAP)NtUserSetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(hBitmap), (LONG_PTR)hBitmap ); + hOldBitmap = set_control_icon( hwnd, hBitmap ); if (hBitmap && !(style & SS_CENTERIMAGE) && !(style & SS_REALSIZECONTROL)) { BITMAP bm; @@ -162,8 +181,7 @@ static HENHMETAFILE STATIC_SetEnhMetaFile( HWND hwnd, HENHMETAFILE hEnhMetaFile, WARN("hEnhMetaFile != 0, but it's not an enhanced metafile\n"); return 0; } - return (HENHMETAFILE)NtUserSetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(hEnhMetaFile), - (LONG_PTR)hEnhMetaFile ); + return set_control_icon( hwnd, hEnhMetaFile ); } /*********************************************************************** @@ -189,7 +207,7 @@ static HANDLE STATIC_GetImage( HWND hwnd, WPARAM wParam, DWORD style ) default: return NULL; } - return (HANDLE)NtUserGetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(HANDLE) ); + return get_control_icon( hwnd ); } /*********************************************************************** @@ -486,7 +504,7 @@ LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_SETFONT: if (hasTextStyle( full_style )) { - NtUserSetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT), wParam ); + set_control_font( hwnd, (HFONT)wParam ); if (LOWORD(lParam)) NtUserRedrawWindow( hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN ); @@ -494,7 +512,7 @@ LRESULT StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam break; case WM_GETFONT: - return NtUserGetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT) ); + return (LRESULT)get_control_font( hwnd ); case WM_NCHITTEST: if (full_style & SS_NOTIFY) @@ -576,7 +594,7 @@ static void STATIC_PaintOwnerDrawfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD st dis.itemData = 0; GetClientRect( hwnd, &dis.rcItem ); - font = (HFONT)NtUserGetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT) ); + font = get_control_font( hwnd ); if (font) oldFont = SelectObject( hdc, font ); SendMessageW( GetParent(hwnd), WM_DRAWITEM, id, (LPARAM)&dis ); if (font) SelectObject( hdc, oldFont ); @@ -638,7 +656,7 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style ) format |= DT_SINGLELINE | DT_WORD_ELLIPSIS; } - if ((hFont = (HFONT)NtUserGetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT) ))) + if ((hFont = get_control_font( hwnd ))) hOldFont = SelectObject( hdc, hFont ); if ((style & SS_TYPEMASK) != SS_SIMPLE) @@ -727,7 +745,7 @@ static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style ) SIZE size; GetClientRect( hwnd, &rc ); - hIcon = (HICON)NtUserGetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(hIcon) ); + hIcon = get_control_icon( hwnd ); if (!hIcon || !get_icon_size( hIcon, &size )) { FillRect(hdc, &rc, hbrush); @@ -754,7 +772,7 @@ static void STATIC_PaintBitmapfn(HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style HDC hMemDC; HBITMAP hBitmap, oldbitmap; - if ((hBitmap = (HBITMAP)NtUserGetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(hBitmap) )) + if ((hBitmap = get_control_icon( hwnd )) && (GetObjectType(hBitmap) == OBJ_BITMAP) && (hMemDC = CreateCompatibleDC( hdc ))) { @@ -794,7 +812,7 @@ static void STATIC_PaintEnhMetafn(HWND hwnd, HDC hdc, HBRUSH hbrush, DWORD style GetClientRect(hwnd, &rc); FillRect(hdc, &rc, hbrush); - if ((hEnhMetaFile = (HENHMETAFILE)NtUserGetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(hEnhMetaFile) ))) + if ((hEnhMetaFile = get_control_icon( hwnd ))) { /* The control's current font is not selected into the device context! */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11023
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/button.c | 45 ++++++++++++++++++++++++--------------- dlls/user32/tests/class.c | 2 +- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/dlls/user32/button.c b/dlls/user32/button.c index f4dbec7767c..2c4bf105963 100644 --- a/dlls/user32/button.c +++ b/dlls/user32/button.c @@ -48,8 +48,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(button); /* GetWindowLong offsets for window extra information */ #define STATE_GWL_OFFSET 0 #define HFONT_GWL_OFFSET (sizeof(LONG)) -#define HIMAGE_GWL_OFFSET (HFONT_GWL_OFFSET+sizeof(HFONT)) -#define NB_EXTRA_BYTES (HIMAGE_GWL_OFFSET+sizeof(HANDLE)) +#define HICON_GWL_OFFSET (HFONT_GWL_OFFSET+sizeof(HFONT)) +#define NB_EXTRA_BYTES (HICON_GWL_OFFSET+sizeof(HICON)) /* undocumented flags */ #define BUTTON_NSTATES 0x0F @@ -110,27 +110,37 @@ static const pfPaint btnPaintFunc[MAX_BTN_TYPE] = }; -static inline LONG get_button_state( HWND hwnd ) +static LONG get_button_state( HWND hwnd ) { - return GetWindowLongW( hwnd, STATE_GWL_OFFSET ); + return NtUserGetPrivateData( hwnd, STATE_GWL_OFFSET, sizeof(LONG) ); } -static inline void set_button_state( HWND hwnd, LONG state ) +static LONG set_button_state( HWND hwnd, LONG state ) { - SetWindowLongW( hwnd, STATE_GWL_OFFSET, state ); + return NtUserSetPrivateData( hwnd, STATE_GWL_OFFSET, sizeof(LONG), state ); } -static inline HFONT get_button_font( HWND hwnd ) +static HFONT get_button_font( HWND hwnd ) { - return (HFONT)GetWindowLongPtrW( hwnd, HFONT_GWL_OFFSET ); + return (HFONT)NtUserGetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT) ); } -static inline void set_button_font( HWND hwnd, HFONT font ) +static HFONT set_button_font( HWND hwnd, HFONT font ) { - SetWindowLongPtrW( hwnd, HFONT_GWL_OFFSET, (LONG_PTR)font ); + return (HFONT)NtUserSetPrivateData( hwnd, HFONT_GWL_OFFSET, sizeof(HFONT), (LONG_PTR)font ); } -static inline UINT get_button_type( LONG window_style ) +static HANDLE get_button_icon( HWND hwnd ) +{ + return (HANDLE)NtUserGetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(HICON) ); +} + +static HANDLE set_button_icon( HWND hwnd, HANDLE icon ) +{ + return (HANDLE)NtUserSetPrivateData( hwnd, HICON_GWL_OFFSET, sizeof(HICON), (LONG_PTR)icon ); +} + +static UINT get_button_type( LONG window_style ) { return (window_style & BS_TYPEMASK); } @@ -168,6 +178,7 @@ LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, HANDLE oldHbitmap; if (!IsWindow( hWnd )) return 0; + if (uMsg == WM_NCCREATE) NtUserSetWindowFNID( hWnd, MAKE_FNID(NTUSER_WNDPROC_BUTTON) ); pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); @@ -432,12 +443,12 @@ LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, default: return 0; } - oldHbitmap = (HBITMAP)SetWindowLongPtrW( hWnd, HIMAGE_GWL_OFFSET, lParam ); + oldHbitmap = set_button_icon( hWnd, (HANDLE)lParam ); NtUserInvalidateRect( hWnd, NULL, FALSE ); return (LRESULT)oldHbitmap; case BM_GETIMAGE: - return GetWindowLongPtrW( hWnd, HIMAGE_GWL_OFFSET ); + return (LRESULT)get_button_icon( hWnd ); case BM_GETCHECK: return get_button_state( hWnd ) & 3; @@ -576,7 +587,7 @@ static UINT BUTTON_CalcLabelRect(HWND hwnd, HDC hdc, RECT *rc) } case BS_ICON: - if (!GetIconInfo((HICON)GetWindowLongPtrW( hwnd, HIMAGE_GWL_OFFSET ), &iconInfo)) + if (!GetIconInfo( get_button_icon( hwnd ), &iconInfo )) goto empty_rect; GetObjectW (iconInfo.hbmColor, sizeof(BITMAP), &bm); @@ -589,7 +600,7 @@ static UINT BUTTON_CalcLabelRect(HWND hwnd, HDC hdc, RECT *rc) break; case BS_BITMAP: - if (!GetObjectW( (HANDLE)GetWindowLongPtrW( hwnd, HIMAGE_GWL_OFFSET ), sizeof(BITMAP), &bm)) + if (!GetObjectW( get_button_icon( hwnd ), sizeof(BITMAP), &bm)) goto empty_rect; r.right = r.left + bm.bmWidth; @@ -691,12 +702,12 @@ static void BUTTON_DrawLabel(HWND hwnd, HDC hdc, UINT dtFlags, const RECT *rc) case BS_ICON: flags |= DST_ICON; - lp = GetWindowLongPtrW( hwnd, HIMAGE_GWL_OFFSET ); + lp = (LPARAM)get_button_icon( hwnd ); break; case BS_BITMAP: flags |= DST_BITMAP; - lp = GetWindowLongPtrW( hwnd, HIMAGE_GWL_OFFSET ); + lp = (LPARAM)get_button_icon( hwnd ); break; default: diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 841b8d681ee..0b0fd92b699 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -2520,7 +2520,7 @@ struct real_class_test static const struct real_class_test class_tests[] = { - { "Button", "Button", FALSE, FALSE, TRUE, TRUE, TRUE }, + { "Button", "Button", FALSE, FALSE, TRUE, TRUE, FALSE }, { "ComboBox", "ComboBox", FALSE, TRUE, TRUE, TRUE, TRUE }, { "Edit", "Edit", FALSE, FALSE, TRUE, TRUE, TRUE }, { "ListBox", "ListBox", FALSE, TRUE, TRUE, TRUE, TRUE }, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11023
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/combo.c | 17 ++++++++++++++--- dlls/user32/tests/class.c | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c index 0d32c9a3f2d..b251402602c 100644 --- a/dlls/user32/combo.c +++ b/dlls/user32/combo.c @@ -69,6 +69,16 @@ static UINT CBitHeight, CBitWidth; static void CBCalcPlacement(HEADCOMBO *combo); static void CBResetPos(HEADCOMBO *combo, BOOL redraw); +static HEADCOMBO *get_control_state( HWND hwnd ) +{ + return (HEADCOMBO *)NtUserGetPrivateData( hwnd, 0, sizeof(HEADCOMBO *) ); +} + +static HEADCOMBO *set_control_state( HWND hwnd, HEADCOMBO *state ) +{ + return (HEADCOMBO *)NtUserSetPrivateData( hwnd, 0, sizeof(HEADCOMBO *), (LONG_PTR)state ); +} + /*********************************************************************** * COMBO_Init * @@ -116,7 +126,7 @@ static LRESULT COMBO_NCCreate(HWND hwnd, LONG style) if( COMBO_Init() && (lphc = calloc( 1, sizeof(HEADCOMBO) )) ) { lphc->self = hwnd; - SetWindowLongPtrW( hwnd, 0, (LONG_PTR)lphc ); + set_control_state( hwnd, lphc ); /* some braindead apps do try to use scrollbar/border flags */ @@ -154,7 +164,7 @@ static LRESULT COMBO_NCDestroy( LPHEADCOMBO lphc ) if( (CB_GETTYPE(lphc) != CBS_SIMPLE) && lphc->hWndLBox ) NtUserDestroyWindow( lphc->hWndLBox ); - SetWindowLongPtrW( lphc->self, 0, 0 ); + set_control_state( lphc->self, NULL ); free( lphc ); } return 0; @@ -1685,12 +1695,13 @@ static LRESULT COMBO_GetComboBoxInfo(const HEADCOMBO *lphc, COMBOBOXINFO *pcbi) */ LRESULT ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode ) { - LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 ); + LPHEADCOMBO lphc = get_control_state( hwnd ); TRACE("[%p]: msg %s wp %08Ix lp %08Ix\n", hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam ); if (!IsWindow(hwnd)) return 0; + if (message == WM_NCCREATE || message == WM_CREATE) NtUserSetWindowFNID( hwnd, MAKE_FNID(NTUSER_WNDPROC_COMBO) ); if( lphc || message == WM_NCCREATE ) switch(message) diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 0b0fd92b699..1021005802a 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -2521,7 +2521,7 @@ struct real_class_test static const struct real_class_test class_tests[] = { { "Button", "Button", FALSE, FALSE, TRUE, TRUE, FALSE }, - { "ComboBox", "ComboBox", FALSE, TRUE, TRUE, TRUE, TRUE }, + { "ComboBox", "ComboBox", FALSE, TRUE, TRUE, TRUE, FALSE }, { "Edit", "Edit", FALSE, FALSE, TRUE, TRUE, TRUE }, { "ListBox", "ListBox", FALSE, TRUE, TRUE, TRUE, TRUE }, { "ScrollBar", "ScrollBar", FALSE, TRUE, FALSE, TRUE, TRUE }, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11023
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/edit.c | 20 ++++++++++++++++---- dlls/user32/tests/class.c | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c index cad14800995..eceefbdce8c 100644 --- a/dlls/user32/edit.c +++ b/dlls/user32/edit.c @@ -147,6 +147,16 @@ static inline BOOL notify_parent(const EDITSTATE *es, INT code) return IsWindow(hwnd); } +static EDITSTATE *get_control_state( HWND hwnd ) +{ + return (EDITSTATE *)NtUserGetPrivateData( hwnd, 0, sizeof(EDITSTATE *) ); +} + +static EDITSTATE *set_control_state( HWND hwnd, EDITSTATE *state ) +{ + return (EDITSTATE *)NtUserSetPrivateData( hwnd, 0, sizeof(EDITSTATE *), (LONG_PTR)state ); +} + static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap); /********************************************************************* @@ -4390,7 +4400,7 @@ static LRESULT EDIT_WM_NCCreate(HWND hwnd, LPCREATESTRUCTW lpcs, BOOL unicode) if (!(es = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*es)))) return FALSE; - SetWindowLongPtrW( hwnd, 0, (LONG_PTR)es ); + set_control_state( hwnd, es ); /* * Note: since the EDITSTATE has not been fully initialized yet, @@ -4479,7 +4489,7 @@ static LRESULT EDIT_WM_NCCreate(HWND hwnd, LPCREATESTRUCTW lpcs, BOOL unicode) return TRUE; cleanup: - SetWindowLongPtrW(es->hwndSelf, 0, 0); + set_control_state( es->hwndSelf, NULL ); EDIT_InvalidateUniscribeData(es); HeapFree(GetProcessHeap(), 0, es->first_line_def); HeapFree(GetProcessHeap(), 0, es->undo_text); @@ -4565,7 +4575,7 @@ static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es) pc = pp; } - SetWindowLongPtrW( es->hwndSelf, 0, 0 ); + set_control_state( es->hwndSelf, NULL ); HeapFree(GetProcessHeap(), 0, es->undo_text); HeapFree(GetProcessHeap(), 0, es); @@ -4590,12 +4600,14 @@ static inline LRESULT DefWindowProcT(HWND hwnd, UINT msg, WPARAM wParam, LPARAM */ LRESULT EditWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) { - EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 ); + EDITSTATE *es = get_control_state( hwnd ); LRESULT result = 0; POINT pt; TRACE("hwnd=%p msg=%x (%s) wparam=%Ix lparam=%Ix\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), wParam, lParam); + if (msg == WM_NCCREATE) NtUserSetWindowFNID( hwnd, MAKE_FNID(NTUSER_WNDPROC_EDIT) ); + if (!es && msg != WM_NCCREATE) return DefWindowProcT(hwnd, msg, wParam, lParam, unicode); diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 1021005802a..47f7b2e722a 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -2522,7 +2522,7 @@ static const struct real_class_test class_tests[] = { { "Button", "Button", FALSE, FALSE, TRUE, TRUE, FALSE }, { "ComboBox", "ComboBox", FALSE, TRUE, TRUE, TRUE, FALSE }, - { "Edit", "Edit", FALSE, FALSE, TRUE, TRUE, TRUE }, + { "Edit", "Edit", FALSE, FALSE, TRUE, TRUE, FALSE }, { "ListBox", "ListBox", FALSE, TRUE, TRUE, TRUE, TRUE }, { "ScrollBar", "ScrollBar", FALSE, TRUE, FALSE, TRUE, TRUE }, { "Static", "Static", TRUE, TRUE, TRUE, TRUE, FALSE }, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11023
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/listbox.c | 20 ++++++++++++++++---- dlls/user32/tests/class.c | 4 ++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c index 7989c2d350c..c569b296842 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c @@ -123,6 +123,16 @@ static TIMER_DIRECTION LISTBOX_Timer = LB_TIMER_NONE; static LRESULT LISTBOX_GetItemRect( const LB_DESCR *descr, INT index, RECT *rect ); +static LB_DESCR *get_control_state( HWND hwnd ) +{ + return (LB_DESCR *)NtUserGetPrivateData( hwnd, 0, sizeof(LB_DESCR *) ); +} + +static LB_DESCR *set_control_state( HWND hwnd, LB_DESCR *state ) +{ + return (LB_DESCR *)NtUserSetPrivateData( hwnd, 0, sizeof(LB_DESCR *), (LONG_PTR)state ); +} + /* For listboxes without LBS_NODATA, an array of LB_ITEMDATA is allocated to store the states of each item into descr->u.items. @@ -2601,7 +2611,7 @@ static BOOL LISTBOX_Create( HWND hwnd, LPHEADCOMBO lphc ) descr->owner = lphc->self; } - SetWindowLongPtrW( descr->self, 0, (LONG_PTR)descr ); + set_control_state( descr->self, descr ); /* if (wnd->dwExStyle & WS_EX_NOPARENTNOTIFY) descr->style &= ~LBS_NOTIFY; */ @@ -2646,7 +2656,7 @@ static BOOL LISTBOX_Create( HWND hwnd, LPHEADCOMBO lphc ) static BOOL LISTBOX_Destroy( LB_DESCR *descr ) { LISTBOX_ResetContent( descr ); - SetWindowLongPtrW( descr->self, 0, 0 ); + set_control_state( descr->self, NULL ); HeapFree( GetProcessHeap(), 0, descr ); return TRUE; } @@ -2657,10 +2667,12 @@ static BOOL LISTBOX_Destroy( LB_DESCR *descr ) */ LRESULT ListBoxWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) { - LB_DESCR *descr = (LB_DESCR *)GetWindowLongPtrW( hwnd, 0 ); + LB_DESCR *descr = get_control_state( hwnd ); HEADCOMBO *lphc = NULL; LRESULT ret; + if (msg == WM_CREATE || msg == WM_NCCREATE) NtUserSetWindowFNID( hwnd, MAKE_FNID(NTUSER_WNDPROC_LISTBOX) ); + if (!descr) { if (!IsWindow(hwnd)) return 0; @@ -2670,7 +2682,7 @@ LRESULT ListBoxWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam CREATESTRUCTW *lpcs = (CREATESTRUCTW *)lParam; if (lpcs->style & LBS_COMBOBOX) lphc = lpcs->lpCreateParams; if (!LISTBOX_Create( hwnd, lphc )) return -1; - TRACE("creating hwnd %p descr %p\n", hwnd, (void *)GetWindowLongPtrW( hwnd, 0 ) ); + TRACE("creating hwnd %p descr %p\n", hwnd, get_control_state( hwnd ) ); return 0; } /* Ignore all other messages before we get a WM_CREATE */ diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 47f7b2e722a..c7a99cc80d4 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -2523,10 +2523,10 @@ static const struct real_class_test class_tests[] = { "Button", "Button", FALSE, FALSE, TRUE, TRUE, FALSE }, { "ComboBox", "ComboBox", FALSE, TRUE, TRUE, TRUE, FALSE }, { "Edit", "Edit", FALSE, FALSE, TRUE, TRUE, FALSE }, - { "ListBox", "ListBox", FALSE, TRUE, TRUE, TRUE, TRUE }, + { "ListBox", "ListBox", FALSE, TRUE, TRUE, TRUE, FALSE }, { "ScrollBar", "ScrollBar", FALSE, TRUE, FALSE, TRUE, TRUE }, { "Static", "Static", TRUE, TRUE, TRUE, TRUE, FALSE }, - { "ComboLBox", "ListBox", FALSE, TRUE, TRUE, TRUE, TRUE }, + { "ComboLBox", "ListBox", FALSE, TRUE, TRUE, TRUE, FALSE }, { "MDIClient", "MDIClient", TRUE, TRUE, TRUE, TRUE, TRUE }, { "#32768", "#32768", FALSE, FALSE, TRUE, TRUE, TRUE }, { "#32770", "#32770", TRUE, TRUE, TRUE, TRUE, TRUE }, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11023
participants (2)
-
Rémi Bernon -
Rémi Bernon (@rbernon)