From: chenjiangyi <chenjiangyi@uniontech.com> Signed-off-by: chenjiangyi <chenjiangyi@uniontech.com> --- dlls/winewayland.drv/waylanddrv.h | 1 + dlls/winewayland.drv/waylanddrv_main.c | 1 + dlls/winewayland.drv/window.c | 25 +++++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index ff7f1be7e91..45c71f3cc2c 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -457,6 +457,7 @@ void WAYLAND_SetWindowIcons(HWND hwnd, HICON icon, const ICONINFO *ii, HICON ico void WAYLAND_SetWindowStyle(HWND hwnd, INT offset, STYLESTRUCT *style); void WAYLAND_SetWindowText(HWND hwnd, LPCWSTR text); LRESULT WAYLAND_SysCommand(HWND hwnd, WPARAM wparam, LPARAM lparam, const POINT *pos); +void WAYLAND_UpdateLayeredWindow(HWND hwnd, BYTE alpha, UINT flags); UINT WAYLAND_UpdateDisplayDevices(const struct gdi_device_manager *device_manager, void *param); LRESULT WAYLAND_WindowMessage(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, HWND owner_hint, UINT swp_flags, diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index b7a8a29be70..5fae15c81eb 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -48,6 +48,7 @@ static const struct user_driver_funcs waylanddrv_funcs = .pSetWindowStyle = WAYLAND_SetWindowStyle, .pSetWindowText = WAYLAND_SetWindowText, .pSysCommand = WAYLAND_SysCommand, + .pUpdateLayeredWindow = WAYLAND_UpdateLayeredWindow, .pUpdateDisplayDevices = WAYLAND_UpdateDisplayDevices, .pWindowMessage = WAYLAND_WindowMessage, .pWindowPosChanged = WAYLAND_WindowPosChanged, diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index e016f160cd0..69d7a7c7100 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -839,6 +839,31 @@ LRESULT WAYLAND_SysCommand(HWND hwnd, WPARAM wparam, LPARAM lparam, const POINT return ret; } +/*********************************************************************** + * WAYLAND_UpdateLayeredWindow + */ +void WAYLAND_UpdateLayeredWindow(HWND hwnd, BYTE alpha, UINT flags) +{ + struct wayland_win_data *data; + struct wayland_surface *surface; + uint32_t opacity = UINT32_MAX; + + if (!(data = wayland_win_data_get(hwnd))) return; + + surface = data->wayland_surface; + if (surface && surface->wp_alpha_modifier_surface_v1 && (flags & LWA_ALPHA)) + { + /* Convert BYTE alpha (0-255) to UINT32_MAX range */ + opacity = (UINT32_MAX / 255) * alpha; + wp_alpha_modifier_surface_v1_set_multiplier( + surface->wp_alpha_modifier_surface_v1, opacity); + wl_surface_commit(surface->wl_surface); + wl_display_flush(process_wayland.wl_display); + } + + wayland_win_data_release(data); +} + void set_client_surface(HWND hwnd, struct wayland_client_surface *new_client) { HWND toplevel = NtUserGetAncestor(hwnd, GA_ROOT); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10848