From c2ad4a056c3fecc0643b92755bc851b2fa299c49 Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Sun, 23 Aug 2015 20:19:11 +0900 Subject: [PATCH] Sped up KAlarm startup mechanism. This resolves bug 1610. Signed-off-by: Michele Calgaro --- kalarm/daemon.cpp | 26 ++++++++--------- kalarm/kalarmd/alarmdaemon.cpp | 51 +++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/kalarm/daemon.cpp b/kalarm/daemon.cpp index c5769f94..842514d9 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 Daemon::mQueuedEvents; -TQValueList Daemon::mSavingEvents; +Daemon* Daemon::mInstance = 0; +NotificationHandler* Daemon::mDcopHandler = 0; +TQValueList Daemon::mQueuedEvents; +TQValueList 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 3b7f7456..573cac0d 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 && idcopClient()->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)