--- branches/KDE/4.1/kdelibs/kdecore/kernel/kglobal.cpp 2008/08/01 00:12:03 840376 +++ branches/KDE/4.1/kdelibs/kdecore/kernel/kglobal.cpp 2008/08/01 00:14:54 840377 @@ -251,11 +251,14 @@ /** * This counter indicates when to quit the application. - * It starts at 1, is decremented in KMainWindow when the last window is closed, but - * is incremented by operations that should outlive the last window closed - * (e.g. a file copy for a file manager, or 'compacting folders on exit' for a mail client). + * It starts at 0, is incremented by KMainWindow, systray icons, running jobs, etc. + * and decremented again when those things are destroyed. + * This mechanism allows dialogs and jobs to outlive the last window closed + * e.g. a file copy for a file manager, or 'compacting folders on exit' for a mail client, + * the job progress widget with "keep open" checked, etc. */ -static int s_refCount = 1; +static int s_refCount = 0; +static bool s_allowQuit = false; void KGlobal::ref() { @@ -267,9 +270,14 @@ { --s_refCount; //kDebug() << "KGlobal::deref() : refCount = " << s_refCount; - if (s_refCount <= 0) { + if (s_refCount <= 0 && s_allowQuit) { QCoreApplication::instance()->quit(); } } +void KGlobal::setAllowQuit(bool allowQuit) +{ + s_allowQuit = allowQuit; +} + #undef PRIVATE_DATA --- branches/KDE/4.1/kdelibs/kdeui/widgets/kmainwindow.cpp 2008/08/01 00:12:03 840376 +++ branches/KDE/4.1/kdelibs/kdeui/widgets/kmainwindow.cpp 2008/08/01 00:14:54 840377 @@ -226,6 +226,11 @@ { KGlobal::ref(); + // We set allow quit to true, so when the refcounting reaches 0 the application instance will + // be exited. This has a similar purpose than setQuitOnLastWindowClosed (from + // QApplication), but it honors (de)refing from KGlobal. + KGlobal::setAllowQuit(true); + q = _q; q->setAnimated(KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects);