[PATCH v2 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 -- v2: 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> 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 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
Alternatively perhaps the wintab window should become message-only so it doesn't get enumerated with EnumWindows and there aren't repercussions from it not calling DefWindowProc? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10627#note_135972
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?) -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10627#note_136228
participants (3)
-
Brendan Shanks (@bshanks) -
Tim Clem -
Tim Clem (@tclem)