summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kalarm/daemon.cpp26
-rw-r--r--kalarm/kalarmd/alarmdaemon.cpp51
2 files changed, 54 insertions, 23 deletions
diff --git a/kalarm/daemon.cpp b/kalarm/daemon.cpp
index c5769f942..842514d9a 100644
--- a/kalarm/daemon.cpp
+++ b/kalarm/daemon.cpp
@@ -64,21 +64,21 @@ class NotificationHandler : public TQObject, virtual public AlarmGuiIface
};
-Daemon* Daemon::mInstance = 0;
-NotificationHandler* Daemon::mDcopHandler = 0;
-TQValueList<TQString> Daemon::mQueuedEvents;
-TQValueList<TQString> Daemon::mSavingEvents;
+Daemon* Daemon::mInstance = 0;
+NotificationHandler* Daemon::mDcopHandler = 0;
+TQValueList<TQString> Daemon::mQueuedEvents;
+TQValueList<TQString> Daemon::mSavingEvents;
TQTimer* Daemon::mStartTimer = 0;
TQTimer* Daemon::mRegisterTimer = 0;
TQTimer* Daemon::mStatusTimer = 0;
-int Daemon::mStatusTimerCount = 0;
-int Daemon::mStatusTimerInterval;
-int Daemon::mStartTimeout = 0;
-Daemon::Status Daemon::mStatus = Daemon::STOPPED;
-bool Daemon::mRunning = false;
-bool Daemon::mCalendarDisabled = false;
-bool Daemon::mEnableCalPending = false;
-bool Daemon::mRegisterFailMsg = false;
+int Daemon::mStatusTimerCount = 0;
+int Daemon::mStatusTimerInterval;
+int Daemon::mStartTimeout = 0;
+Daemon::Status Daemon::mStatus = Daemon::STOPPED;
+bool Daemon::mRunning = false;
+bool Daemon::mCalendarDisabled = false;
+bool Daemon::mEnableCalPending = false;
+bool Daemon::mRegisterFailMsg = false;
// How frequently to check the daemon's status after starting it.
// This is equal to the length of time we wait after the daemon is registered with DCOP
@@ -655,7 +655,7 @@ int Daemon::maxTimeSinceCheck()
=============================================================================*/
NotificationHandler::NotificationHandler()
- : DCOPObject(NOTIFY_DCOP_OBJECT),
+ : DCOPObject(NOTIFY_DCOP_OBJECT),
TQObject()
{
kdDebug(5950) << "NotificationHandler::NotificationHandler()\n";
diff --git a/kalarm/kalarmd/alarmdaemon.cpp b/kalarm/kalarmd/alarmdaemon.cpp
index 3b7f7456f..573cac0d9 100644
--- a/kalarm/kalarmd/alarmdaemon.cpp
+++ b/kalarm/kalarmd/alarmdaemon.cpp
@@ -73,23 +73,54 @@ AlarmDaemon::AlarmDaemon(bool autostart, TQObject *parent, const char *name)
#ifdef AUTOSTART_KALARM
if (autostart)
{
- /* The alarm daemon is being autostarted.
- * Check if KAlarm needs to be autostarted in the system tray.
+ /* The alarm daemon has been autostarted.
+ * Check if also KAlarm needs to be autostarted (by the daemon) in the system tray.
* This should ideally be handled internally by KAlarm, but is done by kalarmd
- * for the following reason:
- * KAlarm needs to be both session restored and autostarted, but KDE doesn't
- * currently cater properly for this - there is no guarantee that the session
- * restoration activation will come before the autostart activation. If they
- * come in the wrong order, KAlarm won't know that it is supposed to restore
- * itself and instead will simply open a new window.
+ * to correctly handle the cases when KAlarm is restored and when it is autostarted.
+ * If the autostart request comes before the restoring one, KAlarm would not know
+ * that it is supposed to restore itself and instead would simply open a new window.
+ * So we first check if the session has been fully restored by the session manager
+ * and if so we can continue safely. If the session hasn't yet been fully restored
+ * or created, we wait for up to 30 seconds and then continue as normal.
*/
TDEConfig kaconfig(locate("config", "kalarmrc"));
kaconfig.setGroup(TQString::fromLatin1("General"));
autostart = kaconfig.readBoolEntry(AUTOSTART_TRAY, false);
if (autostart)
{
- kdDebug(5900) << "AlarmDaemon::AlarmDaemon(): wait to autostart KAlarm\n";
- TQTimer::singleShot(KALARM_AUTOSTART_TIMEOUT * 1000, this, TQT_SLOT(autostartKAlarm()));
+ bool done = false;
+ DCOPClient* client = kapp->dcopClient();
+ if (client->isApplicationRegistered("ksmserver"))
+ {
+ TQByteArray callData;
+ TQCString replyType;
+ TQByteArray replyData;
+ for (int i=0; !done && i<KALARM_AUTOSTART_TIMEOUT; ++i)
+ {
+ // Check if the session has been fully created/restored. If not, wait a little and try again
+ if (!kapp->dcopClient()->call("ksmserver", "ksmserver", "startupCompleted()", callData, replyType, replyData) ||
+ replyType != "bool")
+ {
+ done = true; // In case of DCOP call error, just continue normally
+ }
+ else
+ {
+ bool result;
+ TQDataStream replyStream(replyData, IO_ReadOnly);
+ replyStream >> result;
+ if (result)
+ {
+ done = true; // Session created/restored ==> continue
+ }
+ else
+ {
+ sleep(1); // Session not yet fully created/restored ==> wait and retry
+ }
+ }
+ }
+ // Give some extra time to KAlarm to be fully restored, then proceed as usual
+ TQTimer::singleShot(3000, this, TQT_SLOT(autostartKAlarm()));
+ }
}
}
if (!autostart)