diff options
author | Richard Moe Gustavsen <richard.gustavsen@nokia.com> | 2010-01-08 14:32:01 (GMT) |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@nokia.com> | 2010-01-12 12:49:54 (GMT) |
commit | aca933dea3858c0b6db4a02063583da24e80b6c3 (patch) | |
tree | b60880ba7c6e0bbb4011fb19fd0be780be7aadfe /src/gui/kernel/qapplication_mac.mm | |
parent | ab2f88e3cfbf43afd536b9946a40e936c3dcee35 (diff) | |
download | Qt-aca933dea3858c0b6db4a02063583da24e80b6c3.zip Qt-aca933dea3858c0b6db4a02063583da24e80b6c3.tar.gz Qt-aca933dea3858c0b6db4a02063583da24e80b6c3.tar.bz2 |
Cocoa: application will not quit when using dialogs
When creating a single dialog in the main function, and tell it
to exec, we run a modal dialog. But there is really no other
window on screen to be modal for. So in that case, since this is
a rather common pattern for Qt applications, we allow users to
quit the application from the dock. But this action is sendt as
an apple event. And and that point in time, cocoa has the the
apple event handler, and refuses to close down the application
because it detects a modal window.
Our solution is to install/overwrite the apple event handler for
kAEQuit _after_ cocoa has finished its own installation. But in
order to do this, we need to wait until [NSApplication run] has
started, otherwise it will not take effect. And that is what this
patch essentially does.
Diffstat (limited to 'src/gui/kernel/qapplication_mac.mm')
-rw-r--r-- | src/gui/kernel/qapplication_mac.mm | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm index 688e51f..a815f94 100644 --- a/src/gui/kernel/qapplication_mac.mm +++ b/src/gui/kernel/qapplication_mac.mm @@ -1239,10 +1239,6 @@ void qt_init(QApplicationPrivate *priv, int) [cocoaApp setMenu:[qtMenuLoader menu]]; [newDelegate setMenuLoader:qtMenuLoader]; [qtMenuLoader release]; - - NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager]; - [eventManager setEventHandler:newDelegate andSelector:@selector(getUrl:withReplyEvent:) - forEventClass:kInternetEventClass andEventID:kAEGetURL]; } #endif // Register for Carbon tablet proximity events on the event monitor target. @@ -2435,6 +2431,23 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event #endif } +#ifdef QT_MAC_USE_COCOA +void QApplicationPrivate::setupAppleEvents() +{ + // This function is called from the event dispatcher when NSApplication has + // finished initialization, which appears to be just after [NSApplication run] has + // started to execute. By setting up our apple events handlers this late, we override + // the ones set up by NSApplication. + QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) *newDelegate = [QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) sharedDelegate]; + NSAppleEventManager *eventManager = [NSAppleEventManager sharedAppleEventManager]; + [eventManager setEventHandler:newDelegate andSelector:@selector(appleEventQuit:withReplyEvent:) + forEventClass:kCoreEventClass andEventID:kAEQuitApplication]; + [eventManager setEventHandler:newDelegate andSelector:@selector(getUrl:withReplyEvent:) + forEventClass:kInternetEventClass andEventID:kAEGetURL]; + +} +#endif + // In Carbon this is your one stop for apple events. // In Cocoa, it ISN'T. This is the catch-all Apple Event handler that exists // for the time between instantiating the NSApplication, but before the |