[PATCH v3 0/1] MR10627: winemac.drv, wintab32: Some fixes for Cocoa-initiated quits
The EA app was refusing to exit when quit via Cocoa for two reasons: - the wintab32 window was responding 0 to WM_QUERYENDSESSION - the app itself closes a window in response to WM_QUERYENDSESSION, and we weren't expecting the corresponding WM_ENDSESSION to fail -- v3: winemac.drv: Handle windows becoming invalid between WM_QUERYENDSESSION and WM_ENDSESSION. https://gitlab.winehq.org/wine/wine/-/merge_requests/10627
From: Tim Clem <tclem@codeweavers.com> We already handle invalid windows at QUERYENDSESSION time in macdrv_app_quit_request, but some apps (e.g. the EA launcher) close windows in response to QUERYENDSESSION, and we shouldn't abort quitting in that case. --- dlls/winemac.drv/dllmain.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dlls/winemac.drv/dllmain.c b/dlls/winemac.drv/dllmain.c index eb6efedab17..bbd528d53b9 100644 --- a/dlls/winemac.drv/dllmain.c +++ b/dlls/winemac.drv/dllmain.c @@ -141,9 +141,15 @@ static void CALLBACK quit_callback(HWND hwnd, UINT msg, ULONG_PTR data, LRESULT if (!SendMessageCallbackW(qi->wins[i], WM_ENDSESSION, qi->result, qi->flags, quit_callback, (ULONG_PTR)qi)) { - WARN("failed to send WM_ENDSESSION to win %p; error 0x%08lx\n", - qi->wins[i], RtlGetLastWin32Error()); - quit_callback(qi->wins[i], WM_ENDSESSION, (ULONG_PTR)qi, 0); + DWORD error = RtlGetLastWin32Error(); + BOOL invalid = (error == ERROR_INVALID_WINDOW_HANDLE); + if (invalid) + TRACE("failed to send WM_ENDSESSION to win %p because it's invalid; assuming success\n", + qi->wins[i]); + else + WARN("failed to send WM_ENDSESSION to win %p; error 0x%08lx; assuming refusal\n", + qi->wins[i], error); + quit_callback(qi->wins[i], WM_ENDSESSION, (ULONG_PTR)qi, invalid); } } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10627
On Wed Apr 15 16:15:50 2026 +0000, Brendan Shanks wrote:
The winemac change looks good. For wintab it does seem like that should be a message-only window, as far as I can tell it's only used to receive messages from winex11. Also, maybe the window class registration and creation can be moved to `LoadTablet()` instead of `DllMain()` (I assume the EA App links to wintab but doesn't actually call anything from it?) Yah I think that makes sense. It's probably not a good idea to create a window from PROCESS_ATTACH; we've recently seen a deadlock even registering a class from it (see !9822). I'll spin that off into its own MR.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10627#note_136314
This merge request was approved by Brendan Shanks. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10627
participants (3)
-
Brendan Shanks (@bshanks) -
Tim Clem -
Tim Clem (@tclem)