summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBradley T. Hughes <bradley.hughes@nokia.com>2012-06-08 13:32:22 +0200
committerQt by Nokia <qt-info@nokia.com>2012-06-12 04:29:56 +0200
commit0fb84aa7a9ca3ff0bb96d6d7bb7b959d47c3ddcf (patch)
treeaf1722ae2a23a10bf8f8e95c3b34a7e26af0af67 /src
parent3abf49cdc84b47a66347efeb7fe58e252ca55e11 (diff)
Cocoa: do not terminate applications prematurely
Re-enable application termination as it was in Qt 4. QApplication::exec() must return to main() so that the destructors in main() are run. The QApplicationPrivate::canQuit() function from Qt 4's qapplication_mac.mm is gone, so bring back this function in QCocoaApplicationDelegate instead. Change-Id: I1c21894d59061687c36ab49bcb2e4e3ae0752fa4 Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm44
1 files changed, 34 insertions, 10 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
index 3855563bab..e3b93af2e5 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
+++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
@@ -76,10 +76,12 @@
#import "qcocoaapplicationdelegate.h"
#import "qnswindowdelegate.h"
+#import "qcocoamenuloader.h"
#include <qevent.h>
#include <qurl.h>
#include <qdebug.h>
#include <qguiapplication.h>
+#include <private/qguiapplication_p.h>
#include "qt_mac_p.h"
#include <QtGui/QWindowSystemInterface>
@@ -169,28 +171,52 @@ static void cleanupCocoaApplicationDelegate()
return [[qtMenuLoader retain] autorelease];
}
-// This function will only be called when NSApp is actually running. Before
-// that, the kAEQuitApplication Apple event will be sent to
-// QApplicationPrivate::globalAppleEventProcessor in qapplication_mac.mm
+- (BOOL) canQuit
+{
+ [[NSApp mainMenu] cancelTracking];
+
+ bool handle_quit = true;
+ NSMenuItem *quitMenuItem = [[[QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) sharedDelegate] menuLoader] quitMenuItem];
+ if (!QGuiApplicationPrivate::instance()->modalWindowList.isEmpty()
+ && [quitMenuItem isEnabled]) {
+ int visible = 0;
+ const QWindowList tlws = QGuiApplication::topLevelWindows();
+ for (int i = 0; i < tlws.size(); ++i) {
+ if (tlws.at(i)->isVisible())
+ ++visible;
+ }
+ handle_quit = (visible <= 1);
+ }
+
+ if (handle_quit) {
+ QCloseEvent ev;
+ QGuiApplication::sendEvent(qGuiApp, &ev);
+ if (ev.isAccepted()) {
+ return YES;
+ }
+ }
+
+ return NO;
+}
+
+// This function will only be called when NSApp is actually running.
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
- Q_UNUSED(sender);
-/*
// The reflection delegate gets precedence
if (reflectionDelegate
&& [reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)]) {
return [reflectionDelegate applicationShouldTerminate:sender];
}
- if (qtPrivate->canQuit()) {
+ if ([self canQuit]) {
if (!startedQuit) {
startedQuit = true;
- qAppInstance()->quit();
+ QGuiApplication::exit(0);
startedQuit = false;
}
}
- if (qtPrivate->threadData->eventLoops.size() == 0) {
+ if (QGuiApplicationPrivate::instance()->threadData->eventLoops.isEmpty()) {
// INVARIANT: No event loop is executing. This probably
// means that Qt is used as a plugin, or as a part of a native
// Cocoa application. In any case it should be fine to
@@ -199,8 +225,6 @@ static void cleanupCocoaApplicationDelegate()
}
return NSTerminateCancel;
-*/
- return NSTerminateNow;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification