Module: wine Branch: master Commit: dbc00aecec22efb6bf0e3f562ed4a79a0d4cb47f URL: https://gitlab.winehq.org/wine/wine/-/commit/dbc00aecec22efb6bf0e3f562ed4a79...
Author: Gopal Prasad llyyr@yukari.in Date: Wed Feb 28 08:05:50 2024 +0530
winewayland.drv: Set wayland app-id from the process name.
Co-authored-by: Ryan Hendrickson ryan.hendrickson@alum.mit.edu Co-authored-by: Alexandros Frantzis alexandros.frantzis@collabora.com
---
dlls/winewayland.drv/wayland_surface.c | 3 +++ dlls/winewayland.drv/waylanddrv.h | 1 + dlls/winewayland.drv/waylanddrv_main.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+)
diff --git a/dlls/winewayland.drv/wayland_surface.c b/dlls/winewayland.drv/wayland_surface.c index e212e74362a..9f3ad584f4f 100644 --- a/dlls/winewayland.drv/wayland_surface.c +++ b/dlls/winewayland.drv/wayland_surface.c @@ -253,6 +253,9 @@ void wayland_surface_make_toplevel(struct wayland_surface *surface) if (!surface->xdg_toplevel) goto err; xdg_toplevel_add_listener(surface->xdg_toplevel, &xdg_toplevel_listener, surface->hwnd);
+ if (process_name) + xdg_toplevel_set_app_id(surface->xdg_toplevel, process_name); + wl_surface_commit(surface->wl_surface); wl_display_flush(process_wayland.wl_display);
diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 6811b34ab1a..613aae18b22 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -51,6 +51,7 @@ * Globals */
+extern char *process_name; extern struct wayland process_wayland;
/********************************************************************** diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index 7d02497295a..6bddbb509b6 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -24,11 +24,15 @@
#include "config.h"
+#include <stdlib.h> + #include "ntstatus.h" #define WIN32_NO_STATUS
#include "waylanddrv.h"
+char *process_name = NULL; + static const struct user_driver_funcs waylanddrv_funcs = { .pClipCursor = WAYLAND_ClipCursor, @@ -46,12 +50,42 @@ static const struct user_driver_funcs waylanddrv_funcs = .pwine_get_wgl_driver = WAYLAND_wine_get_wgl_driver, };
+static void wayland_init_process_name(void) +{ + WCHAR *p, *appname; + WCHAR appname_lower[MAX_PATH]; + DWORD appname_len; + DWORD appnamez_size; + DWORD utf8_size; + int i; + + appname = NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer; + if ((p = wcsrchr(appname, '/'))) appname = p + 1; + if ((p = wcsrchr(appname, '\'))) appname = p + 1; + appname_len = lstrlenW(appname); + + if (appname_len == 0 || appname_len >= MAX_PATH) return; + + for (i = 0; appname[i]; i++) appname_lower[i] = RtlDowncaseUnicodeChar(appname[i]); + appname_lower[i] = 0; + + appnamez_size = (appname_len + 1) * sizeof(WCHAR); + + if (!RtlUnicodeToUTF8N(NULL, 0, &utf8_size, appname_lower, appnamez_size) && + (process_name = malloc(utf8_size))) + { + RtlUnicodeToUTF8N(process_name, utf8_size, &utf8_size, appname_lower, appnamez_size); + } +} + static NTSTATUS waylanddrv_unix_init(void *arg) { /* Set the user driver functions now so that they are available during * our initialization. We clear them on error. */ __wine_set_user_driver(&waylanddrv_funcs, WINE_GDI_DRIVER_VERSION);
+ wayland_init_process_name(); + if (!wayland_process_init()) goto err;
return 0;