Ken Thomases : winemac: Ignore failure to send or 0 result from WM_QUERYENDSESSION if target window was destroyed.

Alexandre Julliard julliard at winehq.org
Fri Jan 17 11:55:32 CST 2014


Module: wine
Branch: master
Commit: ed3ed035197347fd36f6c89fa94ab23aec22bf9d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ed3ed035197347fd36f6c89fa94ab23aec22bf9d

Author: Ken Thomases <ken at codeweavers.com>
Date:   Thu Jan 16 20:38:14 2014 -0600

winemac: Ignore failure to send or 0 result from WM_QUERYENDSESSION if target window was destroyed.

---

 dlls/winemac.drv/window.c |   18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c
index 5a1d5a7..d63e83f 100644
--- a/dlls/winemac.drv/window.c
+++ b/dlls/winemac.drv/window.c
@@ -2260,6 +2260,12 @@ static void CALLBACK quit_callback(HWND hwnd, UINT msg, ULONG_PTR data, LRESULT
         TRACE("got WM_QUERYENDSESSION result %ld from win %p (%u of %u done)\n", result,
               hwnd, qi->done, qi->count);
 
+        if (!result && !IsWindow(hwnd))
+        {
+            TRACE("win %p no longer exists; ignoring apparent refusal\n", hwnd);
+            result = TRUE;
+        }
+
         if (!result && qi->result)
         {
             qi->result = FALSE;
@@ -2360,9 +2366,15 @@ void macdrv_app_quit_requested(const macdrv_event *event)
         if (!SendMessageCallbackW(qi->wins[i], WM_QUERYENDSESSION, 0, qi->flags,
                                   quit_callback, (ULONG_PTR)qi))
         {
-            WARN("failed to send WM_QUERYENDSESSION to win %p; error 0x%08x; assuming refusal\n",
-                 qi->wins[i], GetLastError());
-            quit_callback(qi->wins[i], WM_QUERYENDSESSION, (ULONG_PTR)qi, FALSE);
+            DWORD error = GetLastError();
+            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%08x; assuming refusal\n",
+                     qi->wins[i], error);
+            quit_callback(qi->wins[i], WM_QUERYENDSESSION, (ULONG_PTR)qi, invalid);
         }
     }
 




More information about the wine-cvs mailing list