[plasma/plasma-workspace] /: Import autostart KCM from plasma-desktop.

Henri Chain null at kde.org
Wed Apr 21 09:48:13 BST 2021


Git commit f0bcd8cf623f154b821d9e4e7dab16d2d3bb7886 by Henri Chain.
Committed on 21/04/2021 at 08:40.
Pushed by hchain into branch 'master'.

Import autostart KCM from plasma-desktop.

Taken from commit 4ce9a4a915511acbd41450da486d8e5d5bae10da in plasma-desktop

The commit history of the KCM can be followed in 9db1c0593e84cdb705fc61cddbdc4e5a9c318b97

A  +3    -0    doc/kcontrol/autostart/CMakeLists.txt
A  +156  -0    doc/kcontrol/autostart/index.docbook
A  +3    -0    kcms/autostart/AUTHORS
A  +16   -0    kcms/autostart/CMakeLists.txt
A  +3    -0    kcms/autostart/Messages.sh
A  +70   -0    kcms/autostart/autostart.cpp     [License: GPL (v2+)]
A  +48   -0    kcms/autostart/autostart.h     [License: GPL (v2+)]
A  +435  -0    kcms/autostart/autostartmodel.cpp     [License: GPL (v2+)]
A  +87   -0    kcms/autostart/autostartmodel.h     [License: GPL (v2+)]
A  +206  -0    kcms/autostart/package/contents/ui/main.qml     [License: GPL (v2+)]
A  +195  -0    kcms/autostart/package/metadata.desktop

https://invent.kde.org/plasma/plasma-workspace/commit/f0bcd8cf623f154b821d9e4e7dab16d2d3bb7886

diff --git a/doc/kcontrol/autostart/CMakeLists.txt b/doc/kcontrol/autostart/CMakeLists.txt
new file mode 100644
index 000000000..fa673b22f
--- /dev/null
+++ b/doc/kcontrol/autostart/CMakeLists.txt
@@ -0,0 +1,3 @@
+########### install files ###############
+#
+kdoctools_create_handbook(index.docbook INSTALL_DESTINATION ${KDE_INSTALL_DOCBUNDLEDIR}/en SUBDIR kcontrol/autostart)
diff --git a/doc/kcontrol/autostart/index.docbook b/doc/kcontrol/autostart/index.docbook
new file mode 100644
index 000000000..e5e7ed442
--- /dev/null
+++ b/doc/kcontrol/autostart/index.docbook
@@ -0,0 +1,156 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.5-Based Variant V1.1//EN"
+"dtd/kdedbx45.dtd" [
+  <!ENTITY % addindex "IGNORE">
+  <!ENTITY % English "INCLUDE">
+]>
+<article id="autostart" lang="&language;">
+<articleinfo>
+<title>Autostart</title>
+<authorgroup>
+<author>&Anne-Marie.Mahfouf;</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2021-04-05</date>
+<releaseinfo>&plasma; 5.20</releaseinfo>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>System Settings</keyword>
+<keyword>autostart</keyword>
+<keyword>desktop file</keyword>
+<keyword>script file</keyword>
+</keywordset>
+</articleinfo>
+
+<sect1 id="kcm_autostart">
+<title>Autostart Manager</title>
+
+<para>This module is a configuration tool for managing what programs start up with your personal &plasma;. It allows you to add programs or scripts so they automatically run during startup or shutdown of your &plasma; session and to manage them.</para>
+
+<note><para>Please note that in this module all changes are immediately applied.</para></note>
+
+<para>The program scans <filename>$HOME/.config/autostart/</filename>,
+<filename class="directory">$HOME/.config/plasma-workspace/env</filename> and <filename class="directory">$HOME/.config/plasma-workspace/shutdown</filename> folders to check what programs and scripts are already there and displays them. It allows you to manage them easily.
+</para>
+
+<note><para>Note that you can change the location of your <filename class="directory">Autostart</filename>
+folder in <menuchoice><guimenu>Applications</guimenu> <guimenuitem>Locations</guimenuitem></menuchoice> 
+in the <guilabel>Personalization</guilabel> category of the &systemsettings; and set a different folder 
+than <filename class="directory">$HOME/.config/autostart</filename>.</para></note>
+
+<para>Please read also <ulink url="help:/kcontrol/kcmsmserver">Desktop Session</ulink> and <ulink url="help:/kcontrol/kded">Background Services</ulink> for information how to configure the startup behavior of your &plasma; session.</para>
+
+<para>Some &kde; applications handle the autostart behavior on their own, ⪚ you can enable or disable autostart of an application in the settings dialog (&kalarm;) or you have to use <menuchoice><guimenu>File</guimenu><guimenuitem>Quit</guimenuitem></menuchoice> (&konversation;, &kopete;), otherwise the application is still running in the systemtray and will be restarted on next login.
+</para>
+
+<sect2 id="migration">
+<title>Migration from &kde; Workspaces 4</title>
+<para>To migrate your personal autostart setting from &kde; Workspaces 4:</para>
+<simplelist>
+<member>Copy desktop files from <filename class="directory">$HOME/.kde/Autostart</filename> to <filename class="directory">$HOME/.config/autostart</filename></member>
+<member>Copy pre startup script files from <filename class="directory">$HOME/.kde/Autostart</filename> to <filename class="directory">$HOME/.config/plasma-workspace/env</filename></member>
+<member>Copy shutdown script files from <filename class="directory">$HOME/.kde/Autostart</filename> to <filename class="directory">$HOME/.config/plasma-workspace/shutdown</filename></member>
+</simplelist>
+</sect2>
+
+<sect2 id="disabling_autostart">
+<title>Disabling Autostart Files Provided by Your Distribution</title>
+<para>The correct way to disable an autostart item, for example the printer-applet if you use printer from time to time, is to copy its <filename class="extension">.desktop</filename> file to your personal autostart folder. Anything of the same name in <filename class="directory">$HOME/.config/autostart</filename> overrides the <filename class="extension">.desktop</filename> file in the default package. Add the following line to the copied <filename class="extension">.desktop</filename> file:</para>
+<programlisting>
+Hidden=true
+</programlisting>
+</sect2>
+
+<sect2 id="current">
+<title>Files display</title>
+<para>The main part of the module displays the programs that are loaded when &plasma; starts and scripts that are run when &plasma; starts or shutdowns.</para>
+
+<variablelist>
+<varlistentry><term><guilabel>Icon</guilabel></term>
+<listitem>
+<para>
+This column shows the icon of the program or script you want to start with &plasma;. The icon is extracted from the Desktop file from the Icon key for a program and is the default icon for a script.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><guilabel>Name</guilabel></term>
+<listitem>
+<para>
+This column shows the name of the program or script you want to start with &plasma;. The name is extracted from the <filename class="extension">.desktop</filename> file from the <literal>Name</literal> key for a program and is the filename for a script.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><guilabel>Properties</guilabel></term>
+<listitem>
+<para>
+This button is only shown when you hover the item with the mouse pointer. The button (only enabled for programs &ie; <filename class="extension">.desktop</filename> files) allows you to change the properties of the program or script. You have general properties, permissions properties, a preview when applicable, and properties related to the application for programs. The default command is extracted from the <filename class="extension">.desktop</filename> file from the <literal>Exec</literal> key.
+</para>
+<para>
+For a script, the command is the path to the script and can not be modified.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><guilabel>Remove</guilabel></term>
+<listitem>
+<para>
+This button is only shown when you hover the item with the mouse pointer. Pressing the <guibutton>−</guibutton> button will immediately remove the Desktop file for the program or the script or symbolic link in the <filename class="directory">Autostart</filename> folder.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</sect2>
+
+<sect2 id="actions">
+<title>Actions</title>
+<para>
+On the bottom, you have the combined <guibutton>Add...</guibutton> button to choose the type of item you want to add. You can add programs and login or logout scripts.
+</para>
+
+<variablelist>
+<varlistentry><term><guimenuitem>Add Program</guimenuitem></term>
+<listitem>
+<para>
+Clicking this item displays the standard &plasma; <guilabel>Choose Application</guilabel> dialog and allows you to choose which program you want to start. After choosing the program, clicking <guibutton>OK</guibutton> brings you the properties for this program. 
+</para>
+<para>
+This will copy the program <filename class="extension">.desktop</filename> file in your <filename class="directory">Autostart</filename> folder. 
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><guimenuitem>Add Login Script...</guimenuitem></term>
+<listitem>
+<para>
+This item opens a dialog that asks you for the location of the script you want to add. Scripts set to run on login are copied or symlinked in <filename class="directory">$HOME/.config/autostart</filename> and will be run during Plasma startup.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term><guimenuitem>Add Logout Script...</guimenuitem></term>
+<listitem>
+<para>
+This item opens a dialog that asks you for the location of the script you want to add. Scripts set on to be run on logout are copied or symlinked in the <filename class="directory">$HOME/.config/plasma-workspace/shutdown</filename> directory and will be automatically run during &plasma; shutdown after the user has logged out.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</sect2>
+</sect1>
+</article>
+
+<!--
+Local Variables:
+mode: xml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+kate: space-indent on; indent-width 2; tab-width 2; indent-mode none;
+-->
diff --git a/kcms/autostart/AUTHORS b/kcms/autostart/AUTHORS
new file mode 100644
index 000000000..040409dba
--- /dev/null
+++ b/kcms/autostart/AUTHORS
@@ -0,0 +1,3 @@
+Stephen Leaf <smileaf at gmail.com>
+Montel Laurent <montel at kde.org>
+Nicolas Fella <nicolas.fella at gmx.de>
diff --git a/kcms/autostart/CMakeLists.txt b/kcms/autostart/CMakeLists.txt
new file mode 100644
index 000000000..93644f68c
--- /dev/null
+++ b/kcms/autostart/CMakeLists.txt
@@ -0,0 +1,16 @@
+# KI18N Translation Domain for this library
+add_definitions(-DTRANSLATION_DOMAIN=\"kcm_autostart\")
+
+set(kcm_autostart_PART_SRCS
+   autostartmodel.cpp
+   autostart.cpp )
+
+add_library(kcm_autostart MODULE ${kcm_autostart_PART_SRCS})
+
+target_link_libraries(kcm_autostart KF5::I18n KF5::KIOCore KF5::KIOWidgets KF5::QuickAddons)
+
+kcoreaddons_desktop_to_json(kcm_autostart "package/metadata.desktop")
+
+install(TARGETS kcm_autostart  DESTINATION ${KDE_INSTALL_PLUGINDIR}/kcms )
+install(FILES package/metadata.desktop RENAME autostart.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR})
+kpackage_install_package(package kcm_autostart kcms)
diff --git a/kcms/autostart/Messages.sh b/kcms/autostart/Messages.sh
new file mode 100644
index 000000000..6a41f58b1
--- /dev/null
+++ b/kcms/autostart/Messages.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+$XGETTEXT `find . -name '*.cpp' -o -name '*.qml'` -o $podir/kcm_autostart.pot
diff --git a/kcms/autostart/autostart.cpp b/kcms/autostart/autostart.cpp
new file mode 100644
index 000000000..50512c821
--- /dev/null
+++ b/kcms/autostart/autostart.cpp
@@ -0,0 +1,70 @@
+/***************************************************************************
+ *   Copyright (C) 2006-2007 by Stephen Leaf                               *
+ *   smileaf at gmail.com                                                     *
+ *   Copyright (C) 2008 by Montel Laurent <montel at kde.org>                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA          *
+ ***************************************************************************/
+#include "autostart.h"
+
+#include <KAboutData>
+#include <KLocalizedString>
+
+K_PLUGIN_CLASS_WITH_JSON(Autostart, "metadata.json")
+
+Autostart::Autostart(QObject *parent, const QVariantList &)
+    : KQuickAddons::ConfigModule(parent)
+    , m_model(new AutostartModel(this))
+{
+    setButtons(Help);
+
+    qmlRegisterUncreatableType<AutostartModel>("org.kde.plasma.kcm.autostart", 1, 0, "AutostartModel", QStringLiteral("Only for enums"));
+
+    KAboutData *about = new KAboutData(QStringLiteral("kcm_autostart"),
+                                       i18n("Autostart"),
+                                       QStringLiteral("1.0"),
+                                       i18n("Session Autostart Manager Control Panel Module"),
+                                       KAboutLicense::GPL,
+                                       i18n("Copyright © 2006–2020 Autostart Manager team"));
+    about->addAuthor(i18n("Stephen Leaf"), QString(), QStringLiteral("smileaf at gmail.com"));
+    about->addAuthor(i18n("Montel Laurent"), i18n("Maintainer"), QStringLiteral("montel at kde.org"));
+    about->addAuthor(i18n("Nicolas Fella"), QString(), QStringLiteral("nicolas.fella at gmx.de"));
+    setAboutData(about);
+}
+
+Autostart::~Autostart()
+{
+}
+
+AutostartModel *Autostart::model() const
+{
+    return m_model;
+}
+
+void Autostart::load()
+{
+    m_model->load();
+}
+
+void Autostart::defaults()
+{
+}
+
+void Autostart::save()
+{
+}
+
+#include "autostart.moc"
diff --git a/kcms/autostart/autostart.h b/kcms/autostart/autostart.h
new file mode 100644
index 000000000..208c9f6e0
--- /dev/null
+++ b/kcms/autostart/autostart.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *   Copyright (C) 2006-2007 by Stephen Leaf                               *
+ *   smileaf at gmail.com                                                     *
+ *   Copyright (C) 2008 by Montel Laurent <montel at kde.org>                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA          *
+ ***************************************************************************/
+
+#ifndef AUTOSTART_H
+#define AUTOSTART_H
+
+#include <KQuickAddons/ConfigModule>
+
+#include "autostartmodel.h"
+
+class Autostart : public KQuickAddons::ConfigModule
+{
+    Q_OBJECT
+    Q_PROPERTY(AutostartModel *model READ model CONSTANT)
+
+public:
+    explicit Autostart(QObject *parent, const QVariantList &);
+    ~Autostart() override;
+
+    void load() override;
+    void save() override;
+    void defaults() override;
+
+    AutostartModel *model() const;
+
+private:
+    AutostartModel *m_model;
+};
+
+#endif
diff --git a/kcms/autostart/autostartmodel.cpp b/kcms/autostart/autostartmodel.cpp
new file mode 100644
index 000000000..94d800c84
--- /dev/null
+++ b/kcms/autostart/autostartmodel.cpp
@@ -0,0 +1,435 @@
+/***************************************************************************
+ *   Copyright (C) 2020 by Méven Car <meven.car at enioka.com>                *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA          *
+ ***************************************************************************/
+#include "autostartmodel.h"
+
+#include <KConfigGroup>
+#include <KDesktopFile>
+#include <KShell>
+#include <QDebug>
+#include <QDir>
+#include <QQuickItem>
+#include <QQuickRenderControl>
+#include <QStandardPaths>
+#include <QWindow>
+
+#include <KFileItem>
+#include <KIO/CopyJob>
+#include <KIO/DeleteJob>
+#include <KLocalizedString>
+#include <KOpenWithDialog>
+#include <KPropertiesDialog>
+
+#include <optional>
+
+// FDO user autostart directories are
+// .config/autostart which has .desktop files executed by klaunch
+
+// Then we have Plasma-specific locations which run scripts
+// .config/autostart-scripts which has scripts executed by ksmserver
+// .config/plasma-workspace/shutdown which has scripts executed by startkde
+// .config/plasma-workspace/env which has scripts executed by startkde
+
+// in the case of pre-startup they have to end in .sh
+// everywhere else it doesn't matter
+
+// the comment above describes how autostart *currently* works, it is not definitive documentation on how autostart *should* work
+
+// share/autostart shouldn't be an option as this should be reserved for global autostart entries
+
+static std::optional<AutostartEntry> loadDesktopEntry(const QString &fileName)
+{
+    KDesktopFile config(fileName);
+    const KConfigGroup grp = config.desktopGroup();
+    const auto name = config.readName();
+
+    const bool hidden = grp.readEntry("Hidden", false);
+
+    if (hidden) {
+        return {};
+    }
+
+    const QStringList notShowList = grp.readXdgListEntry("NotShowIn");
+    const QStringList onlyShowList = grp.readXdgListEntry("OnlyShowIn");
+    const bool enabled = !(notShowList.contains(QLatin1String("KDE")) || (!onlyShowList.isEmpty() && !onlyShowList.contains(QLatin1String("KDE"))));
+
+    if (!enabled) {
+        return {};
+    }
+
+    const auto lstEntry = grp.readXdgListEntry("OnlyShowIn");
+    const bool onlyInPlasma = lstEntry.contains(QLatin1String("KDE"));
+    const QString iconName = config.readIcon();
+
+    const QString tryCommand = grp.readEntry("TryExec");
+
+    // Try to filter out entries that point to nonexistant programs
+    // If TryExec is either found in $PATH or is an absolute file path that exists
+    // This doesn't detect uninstalled Flatpaks for example though
+    if (!tryCommand.isEmpty() && QStandardPaths::findExecutable(tryCommand).isEmpty() && !QFile::exists(tryCommand)) {
+        return {};
+    }
+
+    return std::optional<AutostartEntry>({name,
+                                          AutostartModel::AutostartEntrySource::XdgAutoStart, // .config/autostart load desktop at startup
+                                          enabled,
+                                          fileName,
+                                          onlyInPlasma,
+                                          iconName});
+}
+
+AutostartModel::AutostartModel(QObject *parent)
+    : QAbstractListModel(parent)
+{
+}
+
+QString AutostartModel::XdgAutoStartPath() const
+{
+    return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1String("/autostart/");
+}
+
+void AutostartModel::load()
+{
+    beginResetModel();
+
+    m_entries.clear();
+
+    QDir autostartdir(XdgAutoStartPath());
+    if (!autostartdir.exists()) {
+        autostartdir.mkpath(XdgAutoStartPath());
+    }
+
+    autostartdir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
+
+    const auto filesInfo = autostartdir.entryInfoList();
+    for (const QFileInfo &fi : filesInfo) {
+        if (!KDesktopFile::isDesktopFile(fi.fileName())) {
+            continue;
+        }
+
+        const std::optional<AutostartEntry> entry = loadDesktopEntry(fi.absoluteFilePath());
+
+        if (!entry) {
+            continue;
+        }
+
+        m_entries.push_back(entry.value());
+    }
+
+    loadScriptsFromDir(QStringLiteral("/autostart-scripts/"), AutostartModel::AutostartEntrySource::XdgScripts);
+    // Treat them as XdgScripts so they appear together in the UI
+    loadScriptsFromDir(QStringLiteral("/plasma-workspace/env/"), AutostartModel::AutostartEntrySource::XdgScripts);
+
+    loadScriptsFromDir(QStringLiteral("/plasma-workspace/shutdown/"), AutostartModel::AutostartEntrySource::PlasmaShutdown);
+
+    endResetModel();
+}
+
+void AutostartModel::loadScriptsFromDir(const QString &subDir, AutostartModel::AutostartEntrySource kind)
+{
+    const QString path = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + subDir;
+    QDir dir(path);
+    if (!dir.exists()) {
+        dir.mkpath(path);
+    }
+
+    dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
+
+    const auto autostartDirFilesInfo = dir.entryInfoList();
+    for (const QFileInfo &fi : autostartDirFilesInfo) {
+        QString fileName = fi.absoluteFilePath();
+        const bool isSymlink = fi.isSymLink();
+        if (isSymlink) {
+            fileName = fi.symLinkTarget();
+        }
+
+        m_entries.push_back({fileName, kind, true, fi.absoluteFilePath(), false, QStringLiteral("dialog-scripts")});
+    }
+}
+
+int AutostartModel::rowCount(const QModelIndex &parent) const
+{
+    if (parent.isValid()) {
+        return 0;
+    }
+
+    return m_entries.count();
+}
+
+bool AutostartModel::reloadEntry(const QModelIndex &index, const QString &fileName)
+{
+    if (!checkIndex(index)) {
+        return false;
+    }
+
+    const std::optional<AutostartEntry> newEntry = loadDesktopEntry(fileName);
+
+    if (!newEntry) {
+        return false;
+    }
+
+    m_entries.replace(index.row(), newEntry.value());
+    Q_EMIT dataChanged(index, index);
+    return true;
+}
+
+QVariant AutostartModel::data(const QModelIndex &index, int role) const
+{
+    if (!checkIndex(index)) {
+        return QVariant();
+    }
+
+    const auto &entry = m_entries.at(index.row());
+
+    switch (role) {
+    case Qt::DisplayRole:
+        return entry.name;
+    case Enabled:
+        return entry.enabled;
+    case Source:
+        return entry.source;
+    case FileName:
+        return entry.fileName;
+    case OnlyInPlasma:
+        return entry.onlyInPlasma;
+    case IconName:
+        return entry.iconName;
+    }
+
+    return QVariant();
+}
+
+void AutostartModel::addApplication(const KService::Ptr &service)
+{
+    QString desktopPath;
+    // It is important to ensure that we make an exact copy of an existing
+    // desktop file (if selected) to enable users to override global autostarts.
+    // Also see
+    // https://bugs.launchpad.net/ubuntu/+source/kde-workspace/+bug/923360
+    if (service->desktopEntryName().isEmpty() || service->entryPath().isEmpty()) {
+        // create a new desktop file in s_desktopPath
+        desktopPath = XdgAutoStartPath() + service->name() + QStringLiteral(".desktop");
+
+        KDesktopFile desktopFile(desktopPath);
+        KConfigGroup kcg = desktopFile.desktopGroup();
+        kcg.writeEntry("Name", service->name());
+        kcg.writeEntry("Exec", service->exec());
+        kcg.writeEntry("Icon", service->icon());
+        kcg.writeEntry("Path", "");
+        kcg.writeEntry("Terminal", service->terminal() ? "True" : "False");
+        kcg.writeEntry("Type", "Application");
+        desktopFile.sync();
+
+    } else {
+        desktopPath = XdgAutoStartPath() + service->desktopEntryName() + QStringLiteral(".desktop");
+
+        QFile::remove(desktopPath);
+
+        // copy original desktop file to new path
+        KDesktopFile desktopFile(service->entryPath());
+        auto newDeskTopFile = desktopFile.copyTo(desktopPath);
+        newDeskTopFile->sync();
+    }
+
+    const auto entry = AutostartEntry{service->name(),
+                                      AutostartModel::AutostartEntrySource::XdgAutoStart, // .config/autostart load desktop at startup
+                                      true,
+                                      desktopPath,
+                                      false,
+                                      service->icon()};
+
+    int lastApplication = -1;
+    for (const AutostartEntry &e : qAsConst(m_entries)) {
+        if (e.source == AutostartModel::AutostartEntrySource::XdgScripts) {
+            break;
+        }
+        ++lastApplication;
+    }
+
+    // push before the script items
+    const int index = lastApplication + 1;
+
+    beginInsertRows(QModelIndex(), index, index);
+
+    m_entries.insert(index, entry);
+
+    endInsertRows();
+}
+
+void AutostartModel::showApplicationDialog(QQuickItem *context)
+{
+    KOpenWithDialog *owdlg = new KOpenWithDialog();
+    owdlg->setAttribute(Qt::WA_DeleteOnClose);
+
+    if (context && context->window()) {
+        if (QWindow *actualWindow = QQuickRenderControl::renderWindowFor(context->window())) {
+            owdlg->winId(); // so it creates windowHandle
+            owdlg->windowHandle()->setTransientParent(actualWindow);
+            owdlg->setModal(true);
+        }
+    }
+
+    connect(owdlg, &QDialog::finished, this, [this, owdlg](int result) {
+        if (result != QDialog::Accepted) {
+            return;
+        }
+
+        const KService::Ptr service = owdlg->service();
+
+        Q_ASSERT(service);
+        if (!service) {
+            return; // Don't crash if KOpenWith wasn't able to create service.
+        }
+
+        addApplication(service);
+    });
+    owdlg->open();
+}
+
+void AutostartModel::addScript(const QUrl &url, AutostartModel::AutostartEntrySource kind)
+{
+    const QFileInfo file(url.toLocalFile());
+
+    if (!file.isAbsolute()) {
+        Q_EMIT error(i18n("\"%1\" is not an absolute url.", url.toLocalFile()));
+        return;
+    } else if (!file.exists()) {
+        Q_EMIT error(i18n("\"%1\" does not exist.", url.toLocalFile()));
+        return;
+    } else if (!file.isFile()) {
+        Q_EMIT error(i18n("\"%1\" is not a file.", url.toLocalFile()));
+        return;
+    } else if (!file.isReadable()) {
+        Q_EMIT error(i18n("\"%1\" is not readable.", url.toLocalFile()));
+        return;
+    }
+
+    const QString fileName = url.fileName();
+    int index = 0;
+    QString folder;
+
+    if (kind == AutostartModel::AutostartEntrySource::XdgScripts) {
+        int lastLoginScript = -1;
+        for (const AutostartEntry &e : qAsConst(m_entries)) {
+            if (e.source == AutostartModel::AutostartEntrySource::PlasmaShutdown) {
+                break;
+            }
+            ++lastLoginScript;
+        }
+
+        index = lastLoginScript + 1;
+        folder = QStringLiteral("/autostart-scripts/");
+    } else if (kind == AutostartModel::AutostartEntrySource::PlasmaShutdown) {
+        index = m_entries.size();
+        folder = QStringLiteral("/plasma-workspace/shutdown/");
+    } else {
+        Q_ASSERT(0);
+    }
+
+    QUrl destinationScript = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + folder + fileName);
+    KIO::CopyJob *job = KIO::link(url, destinationScript, KIO::HideProgressInfo);
+    job->setAutoRename(true);
+    job->setProperty("finalUrl", destinationScript);
+
+    connect(job, &KIO::CopyJob::renamed, this, [](KIO::Job *job, const QUrl &from, const QUrl &to) {
+        Q_UNUSED(from)
+        // in case the destination filename had to be renamed
+        job->setProperty("finalUrl", to);
+    });
+
+    connect(job, &KJob::finished, this, [this, index, url, kind](KJob *theJob) {
+        if (theJob->error()) {
+            qWarning() << "Could add script entry" << theJob->errorString();
+            return;
+        }
+
+        beginInsertRows(QModelIndex(), index, index);
+
+        const QUrl dest = theJob->property("finalUrl").toUrl();
+
+        AutostartEntry entry = AutostartEntry{dest.fileName(), kind, true, dest.path(), false, QStringLiteral("dialog-scripts")};
+
+        m_entries.insert(index, entry);
+
+        endInsertRows();
+    });
+
+    job->start();
+}
+
+void AutostartModel::removeEntry(int row)
+{
+    const auto entry = m_entries.at(row);
+
+    KIO::DeleteJob *job = KIO::del(QUrl::fromLocalFile(entry.fileName), KIO::HideProgressInfo);
+
+    connect(job, &KJob::finished, this, [this, row, entry](KJob *theJob) {
+        if (theJob->error()) {
+            qWarning() << "Could not remove entry" << theJob->errorString();
+            return;
+        }
+
+        beginRemoveRows(QModelIndex(), row, row);
+        m_entries.remove(row);
+
+        endRemoveRows();
+    });
+
+    job->start();
+}
+
+QHash<int, QByteArray> AutostartModel::roleNames() const
+{
+    QHash<int, QByteArray> roleNames = QAbstractListModel::roleNames();
+
+    roleNames.insert(Name, QByteArrayLiteral("name"));
+    roleNames.insert(Enabled, QByteArrayLiteral("enabled"));
+    roleNames.insert(Source, QByteArrayLiteral("source"));
+    roleNames.insert(FileName, QByteArrayLiteral("fileName"));
+    roleNames.insert(OnlyInPlasma, QByteArrayLiteral("onlyInPlasma"));
+    roleNames.insert(IconName, QByteArrayLiteral("iconName"));
+
+    return roleNames;
+}
+
+void AutostartModel::editApplication(int row, QQuickItem *context)
+{
+    const QModelIndex idx = index(row, 0);
+
+    const QString fileName = data(idx, AutostartModel::Roles::FileName).toString();
+    KFileItem kfi(QUrl::fromLocalFile(fileName));
+    kfi.setDelayedMimeTypes(true);
+
+    KPropertiesDialog *dlg = new KPropertiesDialog(kfi, nullptr);
+    dlg->setAttribute(Qt::WA_DeleteOnClose);
+
+    if (context && context->window()) {
+        if (QWindow *actualWindow = QQuickRenderControl::renderWindowFor(context->window())) {
+            dlg->winId(); // so it creates windowHandle
+            dlg->windowHandle()->setTransientParent(actualWindow);
+            dlg->setModal(true);
+        }
+    }
+
+    connect(dlg, &QDialog::finished, this, [this, idx, dlg](int result) {
+        if (result == QDialog::Accepted) {
+            reloadEntry(idx, dlg->item().localPath());
+        }
+    });
+    dlg->open();
+}
diff --git a/kcms/autostart/autostartmodel.h b/kcms/autostart/autostartmodel.h
new file mode 100644
index 000000000..201725d5f
--- /dev/null
+++ b/kcms/autostart/autostartmodel.h
@@ -0,0 +1,87 @@
+/***************************************************************************
+ *   Copyright (C) 2020 by Méven Car <meven.car at enioka.com>                *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA          *
+ ***************************************************************************/
+#ifndef AUTOSTARTMODEL_H
+#define AUTOSTARTMODEL_H
+
+#include <QAbstractListModel>
+
+#include <KService>
+
+struct AutostartEntry;
+class QQuickItem;
+
+class AutostartModel : public QAbstractListModel
+{
+    Q_OBJECT
+
+public:
+    explicit AutostartModel(QObject *parent = nullptr);
+
+    enum Roles {
+        Name = Qt::DisplayRole,
+        IconName = Qt::DecorationRole,
+        Enabled = Qt::UserRole + 1,
+        Source,
+        FileName,
+        OnlyInPlasma,
+    };
+
+    enum AutostartEntrySource {
+        XdgAutoStart = 0,
+        XdgScripts = 1,
+        PlasmaShutdown = 2,
+        PlasmaStart = 3,
+    };
+    Q_ENUM(AutostartEntrySource)
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+    QHash<int, QByteArray> roleNames() const override;
+
+    bool reloadEntry(const QModelIndex &index, const QString &fileName);
+
+    Q_INVOKABLE void removeEntry(int row);
+    Q_INVOKABLE void editApplication(int row, QQuickItem *context);
+    Q_INVOKABLE void addScript(const QUrl &url, AutostartEntrySource kind);
+    Q_INVOKABLE void showApplicationDialog(QQuickItem *context);
+
+    void load();
+
+Q_SIGNALS:
+    void error(const QString &message);
+
+private:
+    void addApplication(const KService::Ptr &service);
+    void loadScriptsFromDir(const QString &subDir, AutostartEntrySource kind);
+    QString XdgAutoStartPath() const;
+
+    QVector<AutostartEntry> m_entries;
+};
+
+struct AutostartEntry {
+    QString name; // Human readable name or script file path. In case of symlinks the target file path
+    AutostartModel::AutostartEntrySource source;
+    bool enabled;
+    QString fileName; // the file backing the entry
+    bool onlyInPlasma;
+    QString iconName;
+};
+Q_DECLARE_TYPEINFO(AutostartEntry, Q_MOVABLE_TYPE);
+
+#endif // AUTOSTARTMODEL_H
diff --git a/kcms/autostart/package/contents/ui/main.qml b/kcms/autostart/package/contents/ui/main.qml
new file mode 100644
index 000000000..644c417cc
--- /dev/null
+++ b/kcms/autostart/package/contents/ui/main.qml
@@ -0,0 +1,206 @@
+/***************************************************************************
+ *   Copyright (C) 2020 by Nicolas Fella <nicolas.fella at gmx.de             *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program 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 General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA          *
+ ***************************************************************************/
+
+import QtQuick 2.10
+import QtQuick.Controls 2.10
+import QtQuick.Layouts 1.11
+import org.kde.kirigami 2.13 as Kirigami
+import QtQuick.Dialogs 1.3
+import org.kde.kcm 1.2 as KCM
+import org.kde.plasma.kcm.autostart 1.0
+
+KCM.ScrollViewKCM {
+
+    id: root
+
+    implicitHeight: Kirigami.Units.gridUnit * 28
+    implicitWidth: Kirigami.Units.gridUnit * 28
+
+    header: Kirigami.InlineMessage {
+        id: errorMessage
+        type: Kirigami.MessageType.Error
+        showCloseButton: true
+
+        Connections {
+            target: kcm.model
+            function onError(message) {
+                errorMessage.visible = true
+                errorMessage.text = message
+            }
+        }
+    }
+
+    view: ListView {
+        clip: true
+        model: kcm.model
+
+        delegate: Kirigami.SwipeListItem {
+
+            Item {
+                Kirigami.Icon {
+                    id: appIcon
+                    source: model.iconName
+                    width: Kirigami.Units.iconSizes.medium
+                    height: Kirigami.Units.iconSizes.medium
+                }
+
+                Label {
+                    height: appIcon.height
+                    text: model.name
+                    elide: Text.ElideRight
+                    anchors.left: appIcon.right
+                    anchors.leftMargin: Kirigami.Units.largeSpacing
+                    anchors.right: parent.right
+                }
+            }
+
+            actions: [
+                Kirigami.Action {
+                    text: i18n("Properties")
+                    icon.name: "document-properties"
+                    onTriggered: kcm.model.editApplication(model.index, root)
+                    visible: model.source === AutostartModel.XdgAutoStart
+                },
+                Kirigami.Action {
+                    text: i18n("Remove")
+                    icon.name: "list-remove"
+                    onTriggered: kcm.model.removeEntry(model.index)
+                }
+            ]
+        }
+
+        section.property: "source"
+        section.delegate: Kirigami.ListSectionHeader {
+            text: {
+                if (section == AutostartModel.XdgAutoStart) {
+                    return i18n("Applications")
+                }
+                if (section == AutostartModel.XdgScripts || section == AutostartModel.PlasmaStart) {
+                    return i18n("Login Scripts")
+                }
+                if (section == AutostartModel.PlasmaShutdown) {
+                    return i18n("Logout Scripts")
+                }
+            }
+        }
+
+        Kirigami.PlaceholderMessage {
+            anchors.centerIn: parent
+            width: parent.width - (Kirigami.Units.largeSpacing * 4)
+            visible: parent.count === 0
+            text: i18n("No user-specified autostart items")
+            explanation: xi18nc("@info", "Click the <interface>Add...</interface> button below to add some")
+        }
+    }
+
+    footer: Row {
+        spacing: Kirigami.Units.largeSpacing
+
+        Loader {
+            id: loginFileDialogLoader
+
+            active: false
+
+            sourceComponent: FileDialog {
+                id: loginFileDialog
+                title: i18n("Choose Login Script")
+                folder: shortcuts.home
+                selectMultiple: false
+                onAccepted: {
+                    kcm.model.addScript(loginFileDialog.fileUrl, AutostartModel.XdgScripts)
+                    loginFileDialogLoader.active = false
+                }
+
+                onRejected: loginFileDialogLoader.active = false
+
+                Component.onCompleted: open()
+            }
+        }
+
+        Loader {
+            id: logoutFileDialogLoader
+
+            active: false
+
+            sourceComponent: FileDialog {
+                id: logoutFileDialog
+                title: i18n("Choose Logout Script")
+                folder: shortcuts.home
+                selectMultiple: false
+                onAccepted: {
+                    kcm.model.addScript(logoutFileDialog.fileUrl, AutostartModel.PlasmaShutdown)
+                    logoutFileDialogLoader.active = false
+                }
+
+                onRejected: logoutFileDialogLoader.active = false
+
+                Component.onCompleted: open()
+            }
+        }
+
+        Button {
+            id: menuButton
+
+            icon.name: "list-add"
+            text: i18n("Add...")
+
+            checkable: true
+            checked: menu.opened
+
+            onPressed: {
+                // Appear above the button, not below it, since the button is at
+                // the bottom of the window and QQC2 items can't leave the window
+
+                // HACK: since we want to position the menu above the button,
+                // we need to know the menu's height, but it only has a height
+                // after the first time it's been shown, so until then, we need
+                // to provide an artificially-synthesized-and-hopefully-good-enough
+                // height value
+                var menuHeight = menu.height && menu.height > 0 ? menu.height : Kirigami.Units.gridUnit * 3
+                menu.popup(menuButton, 0, -menuHeight)
+            }
+        }
+
+        Menu {
+            id: menu
+
+            modal: true
+            dim: false
+
+            MenuItem {
+                text: i18n("Add Application...")
+                icon.name: "list-add"
+
+                onClicked: kcm.model.showApplicationDialog(root)
+            }
+            MenuItem {
+                text: i18n("Add Login Script...")
+                icon.name: "list-add"
+
+                onClicked: loginFileDialogLoader.active = true
+            }
+            MenuItem {
+                text: i18n("Add Logout Script...")
+                icon.name: "list-add"
+
+                onClicked: logoutFileDialogLoader.active = true
+            }
+        }
+    }
+}
diff --git a/kcms/autostart/package/metadata.desktop b/kcms/autostart/package/metadata.desktop
new file mode 100644
index 000000000..7251f5922
--- /dev/null
+++ b/kcms/autostart/package/metadata.desktop
@@ -0,0 +1,195 @@
+[Desktop Entry]
+Name=Autostart
+Name[af]=Outomatiese begin
+Name[ar]=البدء الآليّ
+Name[ast]=Aniciu automáticu
+Name[az]=Avtomatik başlama
+Name[be]=Аўтаматычны запуск
+Name[be at latin]=Aŭtamatyčnaje ŭklučeńnie
+Name[bg]=Автоматично стартиране
+Name[bn]=অটো-স্টার্ট
+Name[bn_IN]=স্বয়ং-আরম্ভ
+Name[br]=Emloc'h
+Name[bs]=Samopokretanje
+Name[ca]=Inici automàtic
+Name[ca at valencia]=Inici automàtic
+Name[cs]=Automatické spuštění
+Name[csb]=Aùtomatné zrëszanié
+Name[cy]=Hunan-gychwyn
+Name[da]=Autostart
+Name[de]=Autostart
+Name[el]=Αυτόματη εκκίνηση
+Name[en_GB]=Autostart
+Name[eo]=Aŭtomata lanĉo
+Name[es]=Autoarranque
+Name[et]=Autostart
+Name[eu]=Hasiera automatikoa
+Name[fa]=آغاز خودکار
+Name[fi]=Automaattikäynnistys
+Name[fr]=Démarrage automatique
+Name[fy]=Auto-úteinsette
+Name[ga]=Tosú uathoibríoch
+Name[gl]=Inicio automático
+Name[gu]=આપમેળેશરૂ
+Name[he]=הפעלה אוטומטית
+Name[hi]=स्वतःप्रारंभ
+Name[hne]=खुद से चालू
+Name[hr]=Automatsko pokretanje
+Name[hsb]=Awtostart
+Name[hu]=Automatikus indítás
+Name[ia]=Auto starta
+Name[id]=Automulai
+Name[is]=Sjálfræsing
+Name[it]=Avvio automatico
+Name[ja]=自動起動
+Name[ka]=ავტოგაშვება
+Name[kk]=Автобастау
+Name[km]=ចាប់ផ្ដើម​ស្វ័យប្រវត្តិ
+Name[kn]=ಸ್ವಯಮಾರಂಭ
+Name[ko]=자동 시작
+Name[ku]=Bixweber Bide Destpêkirin
+Name[lt]=Automatinis paleidimas
+Name[lv]=Autopalaišana
+Name[mai]=स्वतः चालू
+Name[mk]=Автостарт
+Name[ml]=ഓട്ടോസ്റ്റാര്‍ട്ട്
+Name[mr]=स्वप्रारंभ
+Name[ms]=Automula
+Name[nb]=Autostart
+Name[nds]=Autostart
+Name[nl]=Autostart
+Name[nn]=Autostart
+Name[or]=ସ୍ୱୟଂଚାଳନ
+Name[pa]=ਆਟੋ-ਸਟਾਰਟ
+Name[pl]=Samo-uruchamiane
+Name[pt]=Arranque
+Name[pt_BR]=Iniciar automaticamente
+Name[ro]=Pornire automată
+Name[ru]=Автозапуск
+Name[si]=ක්‍ෂණික ඇරඹුම
+Name[sk]=Automatické spustenie
+Name[sl]=Samodejni zagon
+Name[sr]=Самопокретање
+Name[sr at ijekavian]=Самопокретање
+Name[sr at ijekavianlatin]=Samopokretanje
+Name[sr at latin]=Samopokretanje
+Name[sv]=Automatisk start
+Name[ta]=சுயதுவக்கம்
+Name[te]=స్వయంచాలకప్రారంభం
+Name[tg]=Оғози худкор
+Name[th]=เริ่มอัตโนมัติ
+Name[tr]=Otomatik Başlat
+Name[ug]=ئۆزلۈكىدىن قوزغات
+Name[uk]=Автозапуск
+Name[uz]=Avto-boshlash
+Name[uz at cyrillic]=Авто-бошлаш
+Name[vi]=Khởi động tự động
+Name[wa]=Enondaedje tot seu
+Name[xh]=Isiqalo esizenzekelayo
+Name[x-test]=xxAutostartxx
+Name[zh_CN]=自动启动
+Name[zh_TW]=自動啟動
+Comment=Automatically Started Applications
+Comment[ar]=التّطبيقات التي تبدأ آليًّا
+Comment[az]=Avtomatik işə düşən tətbiqlər
+Comment[bs]=Aplikacije pokrenute automatski
+Comment[ca]=Aplicacions iniciades automàticament
+Comment[ca at valencia]=Aplicacions iniciades automàticament
+Comment[cs]=Automaticky spouštěné aplikace
+Comment[da]=Programmer der startes automatisk
+Comment[de]=Automatisch zu startende Anwendungen
+Comment[el]=Εφαρμογές που ξεκινούν αυτόματα
+Comment[en_GB]=Automatically Started Applications
+Comment[es]=Aplicaciones iniciadas automáticamente
+Comment[et]=Automaatselt käivituvad rakendused
+Comment[eu]=Automatikoki abiarazitako aplikazioak
+Comment[fi]=Automaattisesti käynnistetyt ohjelmat
+Comment[fr]=Applications lancées automatiquement
+Comment[gl]=Aplicacións iniciadas automaticamente
+Comment[he]=פתח אוטומטית יישומים
+Comment[hu]=Automatikusan indított alkalmazások
+Comment[ia]=Applicationes initiate automaticamente
+Comment[id]=Secara Otomatis Menjalankan Aplikasi
+Comment[is]=Sjálfkrafa ræst forrit
+Comment[it]=Applicazioni avviate automaticamente
+Comment[ja]=自動的に起動されるアプリケーション
+Comment[ko]=자동으로 시작되는 프로그램
+Comment[lt]=Automatiškai paleidžiamos programos
+Comment[ml]=താനേ തുടങ്ങിയ പ്രയോഗങ്ങൾ
+Comment[mr]=स्वप्रारंभअनुप्रयोग
+Comment[nb]=Programmer som startes automatisk
+Comment[nds]=Automaatsch opropen Programmen
+Comment[nl]=Automatisch gestarte toepassingen
+Comment[nn]=Program som vert starta automatisk
+Comment[pa]=ਆਟੋਮੈਟਿਕ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ
+Comment[pl]=Samoczynnie uruchamiane programy
+Comment[pt]=Aplicações Iniciadas Automaticamente
+Comment[pt_BR]=Aplicativos iniciados automaticamente
+Comment[ro]=Aplicații pornite automat
+Comment[ru]=Автоматический запуск приложений
+Comment[sk]=Automaticky spustené aplikácie
+Comment[sl]=Samodejno zagnani programi
+Comment[sr]=Програми који се аутоматски покрећу
+Comment[sr at ijekavian]=Програми који се аутоматски покрећу
+Comment[sr at ijekavianlatin]=Programi koji se automatski pokreću
+Comment[sr at latin]=Programi koji se automatski pokreću
+Comment[sv]=Program som startas automatiskt
+Comment[tr]=Otomatik Başlatılan Uygulamalar
+Comment[uk]=Програми, що запускаються автоматично
+Comment[vi]=Các ứng dụng được khởi động tự động
+Comment[x-test]=xxAutomatically Started Applicationsxx
+Comment[zh_CN]=自动启动的应用程序
+Comment[zh_TW]=自動啟動應用程式
+Encoding=UTF-8
+Type=Service
+Icon=system-run
+X-KDE-Library=kcm_autostart
+X-KDE-ServiceTypes=KCModule
+X-KDE-FormFactors=desktop
+X-Plasma-MainScript=ui/main.qml
+X-KDE-System-Settings-Parent-Category=session
+X-KDE-ParentApp=kcontrol
+X-KDE-Keywords=Autostart Manager,autostart,startup,system startup,plasma start,cron
+X-KDE-Keywords[az]=Autostart Manager,autostart,startup,system startup,plasma start,cronAvtomatik başlama meneceri, avtomatik başlama, sistemin işə salınması Plasmanın başladılması
+X-KDE-Keywords[ca]=Gestor de l'inici automàtic,inici automàtic,inici,inici del sistema,inici del Plasma,cron
+X-KDE-Keywords[ca at valencia]=Gestor de l'inici automàtic,inici automàtic,inici,inici del sistema,inici del plasma,cron
+X-KDE-Keywords[cs]=správce automatického spuštění,automatické spuštění,spuštění systému,spuštění plasma,cron
+X-KDE-Keywords[da]=autostart,opstart,systemstart,plasma start,cron
+X-KDE-Keywords[de]=Autostartverwaltung,Autostart,Startvorgang,Systemstart,Plasma-Start,Cron
+X-KDE-Keywords[el]=διαχειριστής αυτόματης εκκίνησης,αυτόματη εκκίνηση,έναρξη,έναρξη συστήματος,έναρξη plasma,cron
+X-KDE-Keywords[en_GB]=Autostart Manager,autostart,startup,system startup,plasma start,cron
+X-KDE-Keywords[es]=Gestor de inicio automático,inicio automático,inicio,inicio del sistema,inicio de plasma,cron
+X-KDE-Keywords[et]=Autostardi haldur,autostart,käivitamine,süsteemi käivitamine,plasma käivitamine,cron
+X-KDE-Keywords[eu]=Hasiera automatikoaren kudeatzailea,hasiera automatikoa,abioa,sistemaren abioa,plasma abiatu,cron
+X-KDE-Keywords[fi]=automaattikäynnistys,hallinta,käynnistys,järjestelmän käynnistys,Plasman käynnistys,cron
+X-KDE-Keywords[fr]=Gestionnaire de démarrage, démarrage automatique, démarrage, démarrage du système, démarrage de plasma, cron
+X-KDE-Keywords[gl]=Xestor de inicio, inicio automático, inicio, sistema de arranque, inicio de plasma, cron
+X-KDE-Keywords[hu]=Automatikus indítás kezelő,automatikus indítás,indulás,rendszerindulás,plasma indulás,cron
+X-KDE-Keywords[ia]=Gestor de autoinitio,autoinitio,initio,initio de systema.initio de plasma,cron
+X-KDE-Keywords[id]=Pengelola Automulai,automulai,pemulaian,pemulaian sistem,mulai plasma,cron
+X-KDE-Keywords[it]=Gestore avvio automatico,avvio automatico,avvio,avvio del sistema,avvio di plasma,cron
+X-KDE-Keywords[ja]=自動起動マネージャ,自動起動,起動
+X-KDE-Keywords[ko]=Autostart Manager,autostart,startup,system startup,plasma start,cron,자동 시작,자동시작,시작프로그램,시스템 시작,plasma 시작
+X-KDE-Keywords[lt]=Automatinio paleidimo tvarkytuvė,automatinio paleidimo tvakrytuve,automatinis paleidimas,paleistis,sistemos paleidimas,kde paleidimas,plasma paleidimas,cron
+X-KDE-Keywords[nl]=Autostartbeheerder,autostarten,opstarten,opstarten systeem,opstarten plasma,cron
+X-KDE-Keywords[nn]=autostart-handsaming,autostart,oppstart,systemstart,plasma-start,cron
+X-KDE-Keywords[pl]=Menadżer autostartu,autostart,uruchamianie,uruchamianie systemu,plasma,kde start,cron
+X-KDE-Keywords[pt]=Gestor de arranque,arranque,início,arranque do sistema,início do plasma,cron
+X-KDE-Keywords[pt_BR]=Gerenciado de inicialização,inicialização,início,inicialização do sistema,início do plasma,cron
+X-KDE-Keywords[ro]=gestionar pornire automată,pornire,pornire sistem,pornire plasma,cron
+X-KDE-Keywords[ru]=Autostart Manager,autostart,startup,system startup,kde start,cron,диспетчер автоматического запуска,автоматический запуск,автозапуск,загрузка системы,запуск Plasma
+X-KDE-Keywords[sk]=Správca automatického spustenia,autostart,spustenie,spustenie systému,štart kde,cron
+X-KDE-Keywords[sl]=upravljalnik samodejnega zagona,zagon,samodejni zagon,sistemski zagon,zagon plasme,system startup,plasma start,cron
+X-KDE-Keywords[sr]=Autostart Manager,autostart,startup,system startup,plasma start,cron,самопокретање,менаџер самопокретања,покретање система,покретање Плазме
+X-KDE-Keywords[sr at ijekavian]=Autostart Manager,autostart,startup,system startup,plasma start,cron,самопокретање,менаџер самопокретања,покретање система,покретање Плазме
+X-KDE-Keywords[sr at ijekavianlatin]=Autostart Manager,autostart,startup,system startup,plasma start,cron,samopokretanje,menadžer samopokretanja,pokretanje sistema,pokretanje Plasme
+X-KDE-Keywords[sr at latin]=Autostart Manager,autostart,startup,system startup,plasma start,cron,samopokretanje,menadžer samopokretanja,pokretanje sistema,pokretanje Plasme
+X-KDE-Keywords[sv]=Hantering av autostart,autostart,start,systemstart,plasma-start,cron
+X-KDE-Keywords[tr]=Otomatik Başlatma Yöneticisi, otomatik,başlatma,sistem başlangıcı,plasma başlangıcı,görevler,cron
+X-KDE-Keywords[uk]=Autostart Manager,autostart,startup,system startup,plasma start,cron,керування автозапуском,автозапуск,запуск,запуск системи,запуск плазми
+X-KDE-Keywords[vi]=Autostart Manager,autostart,startup,system startup,plasma start,cron,trình quản lí khởi động tự động,khởi động tự động,khởi động,khởi động hệ thống,khởi động plasma
+X-KDE-Keywords[x-test]=xxAutostart Managerxx,xxautostartxx,xxstartupxx,xxsystem startupxx,xxplasma startxx,xxcronxx
+X-KDE-Keywords[zh_CN]=Autostart Manager,autostart,startup,system startup,plasma start,cron,自动启动管理器,自动启动,启动,系统启动,plasma 启动,任务调度
+X-KDE-Keywords[zh_TW]=Autostart Manager,autostart,startup,system startup,plasma start,cron
+X-DocPath=kcontrol/autostart/index.html
+X-KDE-Weight=30



More information about the kde-doc-english mailing list