[PATCH 0/2] 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 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10627
From: Tim Clem <tclem@codeweavers.com> Otherwise the WineTabletClass window prevents quitting via Cocoa from macdrv. --- dlls/wintab32/wintab32.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/wintab32/wintab32.c b/dlls/wintab32/wintab32.c index 15040b9ca9c..8a2af241f74 100644 --- a/dlls/wintab32/wintab32.c +++ b/dlls/wintab32/wintab32.c @@ -102,6 +102,7 @@ static LRESULT WINAPI TABLET_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, switch(uMsg) { case WM_NCCREATE: + case WM_QUERYENDSESSION: return TRUE; case WT_PACKET: -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10627
From: Tim Clem <tclem@codeweavers.com> We already handle this scenario in macdrv_app_quit_request, but some apps (e.g. the EA launcher) close windows in response to WM_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..ba348b6ec23 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_QUERYENDSESSION to win %p because it's invalid; assuming success\n", + qi->wins[i]); + else + WARN("failed to send WM_QUERYENDSESSION 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
participants (2)
-
Tim Clem -
Tim Clem (@tclem)