summaryrefslogtreecommitdiffstats
path: root/kinit/autostart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kinit/autostart.cpp')
-rw-r--r--kinit/autostart.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/kinit/autostart.cpp b/kinit/autostart.cpp
new file mode 100644
index 000000000..0b39a3275
--- /dev/null
+++ b/kinit/autostart.cpp
@@ -0,0 +1,207 @@
+/*
+ *
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
+ *
+ * $Id$
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "autostart.h"
+
+#include <kconfig.h>
+#include <kdesktopfile.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+class AutoStartItem
+{
+public:
+ QString name;
+ QString service;
+ QString startAfter;
+ int phase;
+};
+
+class AutoStartList: public QPtrList<AutoStartItem>
+{
+public:
+ AutoStartList() { }
+};
+
+AutoStart::AutoStart( bool new_startup )
+ : m_newStartup( new_startup ), m_phase( new_startup ? -1 : 0), m_phasedone(false)
+{
+ m_startList = new AutoStartList;
+ m_startList->setAutoDelete(true);
+ KGlobal::dirs()->addResourceType("autostart", "share/autostart");
+}
+
+AutoStart::~AutoStart()
+{
+ delete m_startList;
+}
+
+void
+AutoStart::setPhase(int phase)
+{
+ if (phase > m_phase)
+ {
+ m_phase = phase;
+ m_phasedone = false;
+ }
+}
+
+void AutoStart::setPhaseDone()
+{
+ m_phasedone = true;
+}
+
+static QString extractName(QString path)
+{
+ int i = path.findRev('/');
+ if (i >= 0)
+ path = path.mid(i+1);
+ i = path.findRev('.');
+ if (i >= 0)
+ path = path.left(i);
+ return path;
+}
+
+static bool startCondition(const QString &condition)
+{
+ if (condition.isEmpty())
+ return true;
+
+ QStringList list = QStringList::split(':', condition, true);
+ if (list.count() < 4)
+ return true;
+ if (list[0].isEmpty() || list[2].isEmpty())
+ return true;
+
+ KConfig config(list[0], true, false);
+ if (!list[1].isEmpty())
+ config.setGroup(list[1]);
+
+ bool defaultValue = (list[3].lower() == "true");
+
+ return config.readBoolEntry(list[2], defaultValue);
+}
+
+void
+AutoStart::loadAutoStartList()
+{
+ QStringList files = KGlobal::dirs()->findAllResources("autostart", "*.desktop", false, true);
+
+ for(QStringList::ConstIterator it = files.begin();
+ it != files.end();
+ ++it)
+ {
+ KDesktopFile config(*it, true);
+ if (!startCondition(config.readEntry("X-KDE-autostart-condition")))
+ continue;
+ if (!config.tryExec())
+ continue;
+ if (config.readBoolEntry("Hidden", false))
+ continue;
+
+ if (config.hasKey("OnlyShowIn"))
+ {
+ if (!config.readListEntry("OnlyShowIn", ';').contains("KDE"))
+ continue;
+ }
+ if (config.hasKey("NotShowIn"))
+ {
+ if (config.readListEntry("NotShowIn", ';').contains("KDE"))
+ continue;
+ }
+
+ AutoStartItem *item = new AutoStartItem;
+ item->name = extractName(*it);
+ item->service = *it;
+ item->startAfter = config.readEntry("X-KDE-autostart-after");
+ if( m_newStartup )
+ {
+ item->phase = config.readNumEntry("X-KDE-autostart-phase", 2);
+ if (item->phase < 0)
+ item->phase = 0;
+ }
+ else
+ {
+ item->phase = config.readNumEntry("X-KDE-autostart-phase", 1);
+ if (item->phase < 1)
+ item->phase = 1;
+ }
+ m_startList->append(item);
+ }
+}
+
+QString
+AutoStart::startService()
+{
+ if (m_startList->isEmpty())
+ return 0;
+
+ while(!m_started.isEmpty())
+ {
+
+ // Check for items that depend on previously started items
+ QString lastItem = m_started[0];
+ for(AutoStartItem *item = m_startList->first();
+ item; item = m_startList->next())
+ {
+ if (item->phase == m_phase
+ && item->startAfter == lastItem)
+ {
+ m_started.prepend(item->name);
+ QString service = item->service;
+ m_startList->remove();
+ return service;
+ }
+ }
+ m_started.remove(m_started.begin());
+ }
+
+ // Check for items that don't depend on anything
+ AutoStartItem *item;
+ for(item = m_startList->first();
+ item; item = m_startList->next())
+ {
+ if (item->phase == m_phase
+ && item->startAfter.isEmpty())
+ {
+ m_started.prepend(item->name);
+ QString service = item->service;
+ m_startList->remove();
+ return service;
+ }
+ }
+
+ // Just start something in this phase
+ for(item = m_startList->first();
+ item; item = m_startList->next())
+ {
+ if (item->phase == m_phase)
+ {
+ m_started.prepend(item->name);
+ QString service = item->service;
+ m_startList->remove();
+ return service;
+ }
+ }
+
+ return 0;
+}