diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index 0cd00de5410..b477e47f6eb 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -517,53 +517,11 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa case WM_SETICON: { - HICON ret; - WND *wndPtr = WIN_GetPtr( hwnd ); - - switch(wParam) - { - case ICON_SMALL: - ret = wndPtr->hIconSmall; - if (ret && !lParam && wndPtr->hIcon) - { - wndPtr->hIconSmall2 = CopyImage( wndPtr->hIcon, IMAGE_ICON, - GetSystemMetrics( SM_CXSMICON ), - GetSystemMetrics( SM_CYSMICON ), 0 ); - } - else if (lParam && wndPtr->hIconSmall2) - { - DestroyIcon( wndPtr->hIconSmall2 ); - wndPtr->hIconSmall2 = NULL; - } - wndPtr->hIconSmall = (HICON)lParam; - break; - case ICON_BIG: - ret = wndPtr->hIcon; - if (wndPtr->hIconSmall2) - { - DestroyIcon( wndPtr->hIconSmall2 ); - wndPtr->hIconSmall2 = NULL; - } - if (lParam && !wndPtr->hIconSmall) - { - wndPtr->hIconSmall2 = CopyImage( (HICON)lParam, IMAGE_ICON, - GetSystemMetrics( SM_CXSMICON ), - GetSystemMetrics( SM_CYSMICON ), 0 ); - } - wndPtr->hIcon = (HICON)lParam; - break; - default: - ret = 0; - break; - } - WIN_ReleasePtr( wndPtr ); - - USER_Driver->pSetWindowIcon( hwnd, wParam, (HICON)lParam ); - + LRESULT res = NtUserMessageCall( hwnd, msg, wParam, lParam, + 0, FNID_DEFWINDOWPROC, FALSE ); if( (GetWindowLongW( hwnd, GWL_STYLE ) & WS_CAPTION) == WS_CAPTION ) NC_HandleNCPaint( hwnd , (HRGN)1 ); /* Repaint caption */ - - return (LRESULT)ret; + return res; } case WM_GETICON: diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c index 8d356139c11..e913897bbbe 100644 --- a/dlls/user32/driver.c +++ b/dlls/user32/driver.c @@ -69,10 +69,6 @@ static void CDECL nulldrv_UpdateClipboard(void) { } -static void CDECL nulldrv_SetWindowIcon( HWND hwnd, UINT type, HICON icon ) -{ -} - static LRESULT CDECL nulldrv_SysCommand( HWND hwnd, WPARAM wparam, LPARAM lparam ) { return -1; @@ -130,7 +126,7 @@ static struct user_driver_funcs lazy_load_driver = NULL, NULL, NULL, - nulldrv_SetWindowIcon, + NULL, NULL, NULL, NULL, @@ -166,7 +162,6 @@ void CDECL __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT v do { if (!driver->p##name) driver->p##name = nulldrv_##name; } while(0) SET_USER_FUNC(UpdateClipboard); - SET_USER_FUNC(SetWindowIcon); SET_USER_FUNC(SysCommand); #undef SET_USER_FUNC diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index 314f8ea1d13..68ac46c7e8f 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -74,6 +74,54 @@ static BOOL set_window_text( HWND hwnd, const void *text, BOOL ansi ) return TRUE; } +static HICON set_window_icon( HWND hwnd, WPARAM type, HICON icon ) +{ + HICON ret = 0; + WND *win; + + if (!(win = get_win_ptr( hwnd ))) return 0; + + switch (type) + { + case ICON_SMALL: + ret = win->hIconSmall; + if (ret && !icon && win->hIcon && user_callbacks) + { + win->hIconSmall2 = user_callbacks->pCopyImage( win->hIcon, IMAGE_ICON, + get_system_metrics( SM_CXSMICON ), + get_system_metrics( SM_CYSMICON ), 0 ); + } + else if (icon && win->hIconSmall2) + { + NtUserDestroyCursor( win->hIconSmall2, 0 ); + win->hIconSmall2 = NULL; + } + win->hIconSmall = icon; + break; + + case ICON_BIG: + ret = win->hIcon; + if (win->hIconSmall2) + { + NtUserDestroyCursor( win->hIconSmall2, 0 ); + win->hIconSmall2 = NULL; + } + if (icon && !win->hIconSmall && user_callbacks) + { + win->hIconSmall2 = user_callbacks->pCopyImage( icon, IMAGE_ICON, + get_system_metrics( SM_CXSMICON ), + get_system_metrics( SM_CYSMICON ), 0 ); + } + win->hIcon = icon; + break; + } + release_win_ptr( win ); + + user_driver->pSetWindowIcon( hwnd, type, icon ); + return ret; +} + + LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL ansi ) { LRESULT result = 0; @@ -104,6 +152,10 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, case WM_SETTEXT: result = set_window_text( hwnd, (void *)lparam, ansi ); break; + + case WM_SETICON: + result = (LRESULT)set_window_icon( hwnd, wparam, (HICON)lparam ); + break; } return result;