diff --git a/kdecore/kernel/kautostart.cpp b/kdecore/kernel/kautostart.cpp index caf3d356ad..5a4892ad4e 100644 --- a/kdecore/kernel/kautostart.cpp +++ b/kdecore/kernel/kautostart.cpp @@ -1,255 +1,257 @@ /* This file is part of the KDE libraries Copyright (C) 2006 Aaron Seigo This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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 "kautostart.h" #include "kaboutdata.h" #include "kglobal.h" #include "kcomponentdata.h" #include "kdesktopfile.h" #include "kstandarddirs.h" #include "kconfiggroup.h" #include #include class KAutostart::Private { public: Private() : df(0) { } ~Private() { delete df; } QString name; KDesktopFile* df; }; KAutostart::KAutostart(const QString& entryName, QObject* parent) : QObject(parent), d(new Private) { - KGlobal::dirs()->addResourceType("autostart", 0, "share/autostart"); + KGlobal::dirs()->addResourceType("xdgconf-autostart", NULL, "autostart/"); // xdg ones + KGlobal::dirs()->addResourceType("autostart", "xdgconf-autostart", "/"); // merge them + KGlobal::dirs()->addResourceType("autostart", NULL, "share/autostart"); // KDE ones are higher priority if (entryName.isEmpty()) { // XXX sure that the mainComponent is available at this point? d->name = KGlobal::mainComponent().aboutData()->appName(); } else { d->name = entryName; } if (!d->name.endsWith(QLatin1String(".desktop"))) { d->name.append(".desktop"); } d->df = new KDesktopFile( "autostart", d->name); } KAutostart::~KAutostart() { delete d; } void KAutostart::setAutostarts(bool autostart) { d->df->desktopGroup().writeEntry("Hidden", !autostart); } bool KAutostart::autostarts(const QString& environment, Conditions check) const { // check if this is actually a .desktop file bool starts = d->df->desktopGroup().exists(); // check the hidden field starts &= !d->df->desktopGroup().readEntry("Hidden", false); if (!environment.isEmpty()) { starts &= (allowedEnvironments().indexOf(environment) != -1); } if (check == CheckCommand) { starts &= d->df->tryExec(); } return starts; } QString KAutostart::command() const { return d->df->desktopGroup().readEntry( "Exec", QString() ); } void KAutostart::setCommand(const QString& command) { d->df->desktopGroup().writeEntry( "Exec", command ); } QString KAutostart::visibleName() const { return d->df->readName(); } void KAutostart::setVisibleName(const QString& name) { d->df->desktopGroup().writeEntry( "Name", name ); } bool KAutostart::isServiceRegistered(const QString& entryName) { return QFile::exists(KStandardDirs::locate("autostart", entryName + ".desktop")); } QString KAutostart::commandToCheck() const { return d->df->desktopGroup().readPathEntry( "TryExec", QString() ); } void KAutostart::setCommandToCheck(const QString& exec) { d->df->desktopGroup().writePathEntry( "TryExec", exec ); } // do not specialize the readEntry template - // http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100911 KAutostart::StartPhase readEntry(const KConfigGroup &group, const char* key, const KAutostart::StartPhase& aDefault) { const QByteArray data = group.readEntry(key, QByteArray()); if (data.isNull()) return aDefault; if (data == "0" || data == "BaseDesktop") return KAutostart::BaseDesktop; else if (data == "1" || data == "DesktopServices") return KAutostart::DesktopServices; else if (data == "2" || data == "Applications") return KAutostart::Applications; return aDefault; } KAutostart::StartPhase KAutostart::startPhase() const { return readEntry(d->df->desktopGroup(), "X-KDE-autostart-phase", Applications); } void KAutostart::setStartPhase(KAutostart::StartPhase phase) { QByteArray data = "Applications"; switch (phase) { case BaseDesktop: data = "BaseDesktop"; break; case DesktopServices: data = "DesktopServices"; break; case Applications: // This is the default break; } d->df->desktopGroup().writeEntry( "X-KDE-autostart-phase", data ); } QStringList KAutostart::allowedEnvironments() const { return d->df->desktopGroup().readXdgListEntry( "OnlyShowIn" ); } void KAutostart::setAllowedEnvironments(const QStringList& environments) { d->df->desktopGroup().writeXdgListEntry( "OnlyShowIn", environments ); } void KAutostart::addToAllowedEnvironments(const QString& environment) { QStringList envs = allowedEnvironments(); if (envs.contains(environment)) { return; } envs.append(environment); setAllowedEnvironments(envs); } void KAutostart::removeFromAllowedEnvironments(const QString& environment) { QStringList envs = allowedEnvironments(); int index = envs.indexOf(environment); if (index < 0) { return; } envs.removeAt(index); setAllowedEnvironments(envs); } QStringList KAutostart::excludedEnvironments() const { return d->df->desktopGroup().readXdgListEntry("NotShowIn"); } void KAutostart::setExcludedEnvironments(const QStringList& environments) { d->df->desktopGroup().writeXdgListEntry("NotShowIn", environments); } void KAutostart::addToExcludedEnvironments(const QString& environment) { QStringList envs = excludedEnvironments(); if (envs.contains(environment)) { return; } envs.append(environment); setExcludedEnvironments(envs); } void KAutostart::removeFromExcludedEnvironments(const QString& environment) { QStringList envs = excludedEnvironments(); int index = envs.indexOf(environment); if (index < 0) { return; } envs.removeAt(index); setExcludedEnvironments(envs); } #include "kautostart.moc" diff --git a/kinit/autostart.cpp b/kinit/autostart.cpp index 0903ad430d..e94acea85c 100644 --- a/kinit/autostart.cpp +++ b/kinit/autostart.cpp @@ -1,197 +1,199 @@ /* * This file is part of the KDE libraries * Copyright (c) 2001 Waldo Bastian * * 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 #include #include #include #include class AutoStartItem { public: QString name; QString service; QString startAfter; int phase; }; AutoStart::AutoStart() : m_phase(-1), m_phasedone(false) { m_startList = new AutoStartList; - KGlobal::dirs()->addResourceType("autostart", 0, "share/autostart"); + KGlobal::dirs()->addResourceType("xdgconf-autostart", NULL, "autostart/"); // xdg ones + KGlobal::dirs()->addResourceType("autostart", "xdgconf-autostart", "/"); // merge them + KGlobal::dirs()->addResourceType("autostart", 0, "share/autostart"); // KDE ones are higher priority } AutoStart::~AutoStart() { qDeleteAll(*m_startList); m_startList->clear(); 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) // krazy:exclude=passbyvalue { int i = path.lastIndexOf('/'); if (i >= 0) path = path.mid(i+1); i = path.lastIndexOf('.'); if (i >= 0) path = path.left(i); return path; } static bool startCondition(const QString &condition) { if (condition.isEmpty()) return true; QStringList list = condition.split(':'); if (list.count() < 4) return true; if (list[0].isEmpty() || list[2].isEmpty()) return true; KConfig config(list[0], KConfig::NoGlobals); KConfigGroup cg(&config, list[1]); bool defaultValue = (list[3].toLower() == "true"); return cg.readEntry(list[2], defaultValue); } void AutoStart::loadAutoStartList() { QStringList files = KGlobal::dirs()->findAllResources("autostart", "*.desktop", KStandardDirs::NoDuplicates); for(QStringList::ConstIterator it = files.begin(); it != files.end(); ++it) { KDesktopFile config(*it); const KConfigGroup grp = config.desktopGroup(); if (!startCondition(grp.readEntry("X-KDE-autostart-condition"))) continue; if (!config.tryExec()) continue; if (grp.readEntry("Hidden", false)) continue; if (grp.hasKey("OnlyShowIn")) { if (!grp.readXdgListEntry("OnlyShowIn").contains("KDE")) continue; } if (grp.hasKey("NotShowIn")) { if (grp.readXdgListEntry("NotShowIn").contains("KDE")) continue; } AutoStartItem *item = new AutoStartItem; item->name = extractName(*it); item->service = *it; item->startAfter = grp.readEntry("X-KDE-autostart-after"); item->phase = grp.readEntry("X-KDE-autostart-phase", 2); if (item->phase < 0) item->phase = 0; 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]; QMutableListIterator it(*m_startList); while (it.hasNext()) { AutoStartItem *item = it.next(); if (item->phase == m_phase && item->startAfter == lastItem) { m_started.prepend(item->name); QString service = item->service; it.remove(); delete item; return service; } } m_started.removeFirst(); } // Check for items that don't depend on anything AutoStartItem *item; QMutableListIterator it(*m_startList); while (it.hasNext()) { item = it.next(); if (item->phase == m_phase && item->startAfter.isEmpty()) { m_started.prepend(item->name); QString service = item->service; it.remove(); delete item; return service; } } // Just start something in this phase it = *m_startList; while (it.hasNext()) { item = it.next(); if (item->phase == m_phase) { m_started.prepend(item->name); QString service = item->service; it.remove(); delete item; return service; } } return 0; }