Blob Blame History Raw
diff -up kdelibs-4.1.0/kdecore/kernel/kglobal.cpp.kde#167826 kdelibs-4.1.0/kdecore/kernel/kglobal.cpp
--- kdelibs-4.1.0/kdecore/kernel/kglobal.cpp.kde#167826	2008-05-21 06:08:57.000000000 -0500
+++ kdelibs-4.1.0/kdecore/kernel/kglobal.cpp	2008-08-01 08:15:52.000000000 -0500
@@ -251,11 +251,14 @@ QString KGlobal::caption()
 
 /**
  * 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 @@ void KGlobal::deref()
 {
     --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
diff -up kdelibs-4.1.0/kdecore/kernel/kglobal.h.kde#167826 kdelibs-4.1.0/kdecore/kernel/kglobal.h
--- kdelibs-4.1.0/kdecore/kernel/kglobal.h.kde#167826	2008-05-21 06:08:57.000000000 -0500
+++ kdelibs-4.1.0/kdecore/kernel/kglobal.h	2008-08-01 08:21:49.000000000 -0500
@@ -421,6 +421,13 @@ namespace KGlobal
     KDECORE_EXPORT void deref();
 
     /**
+     * If refcounting reaches 0 (or less), and @p allowQuit is true, the instance of the application
+     * will automatically be exited. Otherwise, the application will not exit automatically.
+     * @since 4.2
+     */
+    KDECORE_EXPORT void setAllowQuit(bool allowQuit);
+
+    /**
      * The component currently active (useful in a multi-component
      * application, such as a KParts application).
      * Don't use this - it's mainly for KAboutDialog and KBugReport.
diff -up kdelibs-4.1.0/kdeui/widgets/kmainwindow.cpp.kde#167826 kdelibs-4.1.0/kdeui/widgets/kmainwindow.cpp
--- kdelibs-4.1.0/kdeui/widgets/kmainwindow.cpp.kde#167826	2008-07-23 03:26:33.000000000 -0500
+++ kdelibs-4.1.0/kdeui/widgets/kmainwindow.cpp	2008-08-01 08:15:52.000000000 -0500
@@ -226,6 +226,11 @@ void KMainWindowPrivate::init(KMainWindo
 {
     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);