From: Alex Schwartz <alexschwartz01@gmail.com> --- dlls/winewayland.drv/window.c | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index afb5f4d3395..4e6ef379b3f 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -433,6 +433,24 @@ BOOL WAYLAND_WindowPosChanging(HWND hwnd, UINT swp_flags, BOOL shaped, const str return TRUE; } +static HICON get_icon_info(HICON icon, ICONINFO *ii) +{ + return icon && NtUserGetIconInfo(icon, ii, NULL, NULL, NULL, 0) ? icon : NULL; +} + +static HICON get_window_icon(HWND hwnd, UINT type, HICON icon, ICONINFO *ret) +{ + if ((icon = get_icon_info( icon, ret ))) return icon; + if ((icon = get_icon_info( (HICON)send_message( hwnd, WM_GETICON, type, 0 ), ret ))) return icon; + if ((icon = get_icon_info( (HICON)NtUserGetClassLongPtrW( hwnd, GCLP_HICON ), ret ))) return icon; + if (type == ICON_BIG) + { + icon = LoadImageW( 0, (const WCHAR *)IDI_WINLOGO, IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE ); + return get_icon_info( icon, ret ); + } + return NULL; +} + /*********************************************************************** * WAYLAND_WindowPosChanged */ @@ -443,7 +461,7 @@ void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UIN struct wayland_surface *toplevel_surface; struct wayland_client_surface *client; struct wayland_win_data *data, *toplevel_data; - BOOL managed, fullscreen = swp_flags & WINE_SWP_FULLSCREEN; + BOOL managed, needs_icon, fullscreen = swp_flags & WINE_SWP_FULLSCREEN; TRACE("hwnd %p new_rects %s after %p flags %08x\n", hwnd, debugstr_window_rects(new_rects), insert_after, swp_flags); @@ -481,7 +499,27 @@ void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UIN wayland_win_data_update_wayland_state(data); } + needs_icon = data->wayland_surface && !data->wayland_surface->big_icon_buffer && + wayland_surface_is_toplevel(data->wayland_surface) && + process_wayland.xdg_toplevel_icon_manager_v1; + wayland_win_data_release(data); + + if (needs_icon) + { + HICON big, small; + ICONINFO ii, ii_small; + big = get_window_icon(hwnd, ICON_BIG, 0, &ii); + small = get_window_icon(hwnd, ICON_SMALL, 0, &ii_small); + + if((data = wayland_win_data_get(hwnd))) + { + if (big) wayland_surface_set_icon(data->wayland_surface, ICON_BIG, &ii); + if (small) wayland_surface_set_icon(data->wayland_surface, ICON_SMALL, &ii_small); + + wayland_win_data_release(data); + } + } } static void wayland_configure_window(HWND hwnd) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9830