From: Alex Schwartz <alexschwartz01@gmail.com> --- dlls/win32u/defwnd.c | 4 +-- dlls/win32u/driver.c | 7 +++++ dlls/win32u/window.c | 2 +- dlls/winewayland.drv/waylanddrv.h | 1 + dlls/winewayland.drv/waylanddrv_main.c | 1 + dlls/winewayland.drv/window.c | 38 ++++++++++++++++++-------- dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/window.c | 8 ++++++ dlls/winex11.drv/x11drv.h | 1 + include/wine/gdi_driver.h | 3 +- 10 files changed, 50 insertions(+), 16 deletions(-) diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index 885af182657..2c76f41f9b8 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -420,10 +420,10 @@ static HICON set_window_icon( HWND hwnd, WPARAM type, HICON icon ) icon = win->hIcon; icon_small = win->hIconSmall2 ? win->hIconSmall2 : win->hIconSmall; - win->has_icons = !is_child; + BOOL hasIcons = win->has_icons = !is_child && user_driver->pNeedsToplevelIcon(hwnd); release_win_ptr( win ); - if (!is_child && (icon = get_window_icon_info( hwnd, ICON_BIG, icon, &ii ))) + if (hasIcons && (icon = get_window_icon_info( hwnd, ICON_BIG, icon, &ii ))) { icon_small = get_window_icon_info( hwnd, ICON_SMALL, icon_small, &ii_small ); user_driver->pSetWindowIcons( hwnd, icon, &ii, icon_small, &ii_small ); diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 60aba702d1a..9c942592f13 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -834,6 +834,11 @@ static void nulldrv_SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ) { } +static BOOL nulldrv_NeedsToplevelIcon( HWND hwnd ) +{ + return FALSE; +} + static void nulldrv_SetWindowIcons( HWND hwnd, HICON icon, const ICONINFO *ii, HICON icon_small, const ICONINFO *ii_small ) { } @@ -1293,6 +1298,7 @@ static const struct user_driver_funcs lazy_load_driver = loaderdrv_SetLayeredWindowAttributes, nulldrv_SetParent, loaderdrv_SetWindowRgn, + nulldrv_NeedsToplevelIcon, nulldrv_SetWindowIcons, nulldrv_SetWindowStyle, nulldrv_SetWindowText, @@ -1392,6 +1398,7 @@ void __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version SET_USER_FUNC(SetLayeredWindowAttributes); SET_USER_FUNC(SetParent); SET_USER_FUNC(SetWindowRgn); + SET_USER_FUNC(NeedsToplevelIcon); SET_USER_FUNC(SetWindowIcons); SET_USER_FUNC(SetWindowStyle); SET_USER_FUNC(SetWindowText); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 1464d45697e..943dee68c43 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -2252,7 +2252,7 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru (swp_flags & (SWP_HIDEWINDOW | SWP_SHOWWINDOW | SWP_STATECHANGED | SWP_FRAMECHANGED))) invalidate_dce( win, &old_rects.window ); - if (win->dwStyle & WS_VISIBLE && !is_child && !win->has_icons) + if (win->dwStyle & WS_VISIBLE && !is_child && !win->has_icons && user_driver->pNeedsToplevelIcon(hwnd)) { icon = win->hIcon; icon_small = win->hIconSmall2 ? win->hIconSmall2 : win->hIconSmall; diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 7ab1f58ba64..97f046a6d31 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -445,6 +445,7 @@ BOOL WAYLAND_SetIMECompositionRect(HWND hwnd, RECT rect); void WAYLAND_SetCursor(HWND hwnd, HCURSOR hcursor); BOOL WAYLAND_SetCursorPos(INT x, INT y); void WAYLAND_SetLayeredWindowAttributes(HWND hwnd, COLORREF key, BYTE alpha, DWORD flags); +BOOL WAYLAND_NeedsToplevelIcon(HWND hwnd); void WAYLAND_SetWindowIcons(HWND hwnd, HICON icon, const ICONINFO *ii, HICON icon_small, const ICONINFO *ii_small); void WAYLAND_SetWindowStyle(HWND hwnd, INT offset, STYLESTRUCT *style); void WAYLAND_SetWindowText(HWND hwnd, LPCWSTR text); diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index cdb5dd8a956..69d81560f98 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -45,6 +45,7 @@ static const struct user_driver_funcs waylanddrv_funcs = .pSetCursor = WAYLAND_SetCursor, .pSetCursorPos = WAYLAND_SetCursorPos, .pSetLayeredWindowAttributes = WAYLAND_SetLayeredWindowAttributes, + .pNeedsToplevelIcon = WAYLAND_NeedsToplevelIcon, .pSetWindowIcons = WAYLAND_SetWindowIcons, .pSetWindowStyle = WAYLAND_SetWindowStyle, .pSetWindowText = WAYLAND_SetWindowText, diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index b838fd84191..79f4a32bfe3 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -664,6 +664,26 @@ static enum xdg_toplevel_resize_edge hittest_to_resize_edge(WPARAM hittest) } } +/***************************************************************** + * WAYLAND_IsTopLevel + */ +BOOL WAYLAND_NeedsToplevelIcon(HWND hwnd) +{ + BOOL needs_icon; + + struct wayland_win_data *data; + + if (!(data = wayland_win_data_get(hwnd))) return FALSE; + + needs_icon = data->wayland_surface && + wayland_surface_is_toplevel(data->wayland_surface) && + process_wayland.xdg_toplevel_icon_manager_v1; + + wayland_win_data_release(data); + + return needs_icon; +} + /***************************************************************** * WAYLAND_SetWindowIcons */ @@ -673,18 +693,12 @@ void WAYLAND_SetWindowIcons(HWND hwnd, HICON icon, const ICONINFO *ii, HICON ico TRACE("hwnd=%p icon=%p ii=%p icon_small=%p ii_small=%p\n", hwnd, icon, ii, icon_small, ii_small); - if (process_wayland.xdg_toplevel_icon_manager_v1) - { - if ((data = wayland_win_data_get(hwnd))) - { - if (data->wayland_surface && wayland_surface_is_toplevel(data->wayland_surface)) - { - wayland_surface_set_icon(data->wayland_surface, ICON_BIG, ii); - wayland_surface_set_icon(data->wayland_surface, ICON_SMALL, ii_small); - } - wayland_win_data_release(data); - } - } + if (!(data = wayland_win_data_get(hwnd))) return; + + if (icon) wayland_surface_set_icon(data->wayland_surface, ICON_BIG, ii); + if (icon_small) wayland_surface_set_icon(data->wayland_surface, ICON_SMALL, ii_small); + + wayland_win_data_release(data); } /*********************************************************************** diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 09ef2bf8664..5f65b0a3389 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -698,6 +698,7 @@ static const struct user_driver_funcs x11drv_funcs = .pActivateWindow = X11DRV_ActivateWindow, .pSetLayeredWindowAttributes = X11DRV_SetLayeredWindowAttributes, .pSetParent = X11DRV_SetParent, + .pNeedsToplevelIcon = X11DRV_NeedsToplevelIcon, .pSetWindowIcons = X11DRV_SetWindowIcons, .pSetWindowRgn = X11DRV_SetWindowRgn, .pSetWindowStyle = X11DRV_SetWindowStyle, diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index d256674c9c1..0c6fc22f416 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -3393,6 +3393,14 @@ done: } +/********************************************************************** + * NeedsToplevelIcon (X11DRV.@) + */ +BOOL X11DRV_NeedsToplevelIcon(HWND hwnd) +{ + return TRUE; +} + /********************************************************************** * SetWindowIcons (X11DRV.@) */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 9232988c9c7..221e04d744e 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -238,6 +238,7 @@ extern void X11DRV_SetDesktopWindow( HWND hwnd ); extern void X11DRV_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alpha, DWORD flags ); extern void X11DRV_SetParent( HWND hwnd, HWND parent, HWND old_parent ); +extern BOOL X11DRV_NeedsToplevelIcon( HWND hwnd ); extern void X11DRV_SetWindowIcons( HWND hwnd, HICON icon, const ICONINFO *ii, HICON icon_small, const ICONINFO *ii_small ); extern void X11DRV_SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ); extern void X11DRV_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ); diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 81932436963..03c23cab15e 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -218,7 +218,7 @@ struct gdi_dc_funcs }; /* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 108 +#define WINE_GDI_DRIVER_VERSION 109 #define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ @@ -415,6 +415,7 @@ struct user_driver_funcs void (*pSetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD); void (*pSetParent)(HWND,HWND,HWND); void (*pSetWindowRgn)(HWND,HRGN,BOOL); + BOOL (*pNeedsToplevelIcon)(HWND); void (*pSetWindowIcons)(HWND,HICON,const ICONINFO*,HICON,const ICONINFO*); void (*pSetWindowStyle)(HWND,INT,STYLESTRUCT*); void (*pSetWindowText)(HWND,LPCWSTR); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9832