|
|
|
@ -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)
|
|
|
|
|