]> git.saurik.com Git - wxWidgets.git/commitdiff
execute the usual cleanup code from EVT_END_SESSION handler under MSW, otherwise...
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 15 Apr 2008 23:30:15 +0000 (23:30 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 15 Apr 2008 23:30:15 +0000 (23:30 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53186 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

interface/event.h
src/msw/app.cpp

index 08a2849d66faf14b709b201fc9d6b6d198f03170..945be51ceabfa575447ba1ad0ea4428b00211ce5 100644 (file)
@@ -2934,16 +2934,28 @@ public:
     This allows the wxWindow::Close function to return @true or @false depending
     on whether the close instruction was honoured or not.
 
+    The EVT_END_SESSION event is slightly different as it is sent by the system
+    when the user session is ending (e.g. because of log out or shutdown) and
+    so all windows are being forcefully closed. At least under MSW, after the
+    handler for this event is executed the program is simply killed by the
+    system. Because of this, the default handler for this event provided by
+    wxWidgets calls all the usual cleanup code (including wxApp::OnExit()) so
+    that it could still be executed and exit()s the process itself, without
+    waiting for being killed. If this behaviour is for some reason undesirable,
+    make sure that you define a handler for this event in your wxApp-derived
+    class and do not call @c event.Skip() in it (but be aware that the system
+    will still kill your application).
+
     @beginEventTable{wxCloseEvent}
     @event{EVT_CLOSE(func)}
         Process a close event, supplying the member function.
         This event applies to wxFrame and wxDialog classes.
     @event{EVT_QUERY_END_SESSION(func)}
         Process a query end session event, supplying the member function.
-        This event applies to wxApp only.
+        This event can be handled in wxApp-derived class only.
     @event{EVT_END_SESSION(func)}
         Process an end session event, supplying the member function.
-        This event applies to wxApp only.
+        This event can be handled in wxApp-derived class only.
     @endEventTable
 
     @library{wxcore}
index 04916f784b59ae248b3f36a6508103043b7869a8..95d953241ce2c6b1671a5f9a278f4be32a480638 100644 (file)
@@ -598,8 +598,17 @@ void wxApp::WakeUpIdle()
 
 void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
 {
-    if (GetTopWindow())
-        GetTopWindow()->Close(true);
+    // Windows will terminate the process soon after we return from
+    // WM_ENDSESSION handler anyhow, so make sure we at least execute our
+    // cleanup code before
+    const int rc = OnExit();
+
+    wxEntryCleanup();
+
+    // calling exit() instead of ExitProcess() or not doing anything at all and
+    // being killed by Windows has the advantage of executing the dtors of
+    // global objects
+    exit(rc);
 }
 
 // Default behaviour: close the application with prompts. The