--- a/startkde/plasma-session/startup.cpp +++ b/startkde/plasma-session/startup.cpp @@ -203,7 +203,7 @@ Startup::Startup(QObject *parent) const AutoStart autostart; // Keep for KF5; remove in KF6 (KInit will be gone then) - QProcess::execute(QStringLiteral(CMAKE_INSTALL_FULL_LIBEXECDIR_KF5 "/start_kdeinit_wrapper"), QStringList()); + QProcess::execute(QStringLiteral("/usr/libexec/kf5/start_kdeinit_wrapper"), QStringList()); KJob *windowManagerJob = nullptr; if (qEnvironmentVariable("XDG_SESSION_TYPE") != QLatin1String("wayland")) { --- a/startkde/startplasma-wayland.cpp +++ b/startkde/startplasma-wayland.cpp @@ -14,6 +14,7 @@ int main(int argc, char **argv) { + QProcess::execute(QStringLiteral("/usr/bin/dbus-restart-kde5"), QStringList()); QCoreApplication app(argc, argv); createConfigDirectory(); --- a/startkde/startplasma-x11.cpp +++ b/startkde/startplasma-x11.cpp @@ -23,6 +23,7 @@ int main(int argc, char **argv) signal(SIGHUP, sighupHandler); qputenv("QT_NO_XDG_DESKTOP_PORTAL", QByteArrayLiteral("1")); + QProcess::execute(QStringLiteral("/usr/bin/dbus-restart-kde5"), QStringList()); QCoreApplication app(argc, argv); // Check if a Plasma session already is running and whether it's possible to connect to X --- a/startkde/startplasma.cpp +++ b/startkde/startplasma.cpp @@ -37,6 +37,52 @@ #include "../kcms/lookandfeel/lookandfeelmanager.h" #include "debug.h" +void __insert_to_environment_variable(const QByteArray &var_name, const QString& add_value, const QStringList& after_names = QStringList(), bool insert_after=true) { + if(var_name.isEmpty() || add_value.isEmpty() ) + return; + QString initial_var(qEnvironmentVariable(var_name)); + QStringList initial_list(initial_var.split(QStringLiteral(":"), Qt::SkipEmptyParts, Qt::CaseSensitive)); + QStringList result_list; + bool is_addon_inserted = false; + for(QString part: initial_list) { + while( part.endsWith(QStringLiteral("/"), Qt::CaseSensitive) ) { + part.chop(1); + } + if( part == add_value ) { + return; + } + if( is_addon_inserted ) { + result_list << part; + } else { + for(const QString &aftername: after_names) { + if( part == aftername ) { + if( insert_after ) { + result_list << part << add_value; + } else { + result_list << add_value << part; + } + is_addon_inserted = true; + break; + } + } + if( !is_addon_inserted ) { + result_list << part; + } + } + } + if( !is_addon_inserted ) { + if( insert_after ) { + result_list.append(add_value); + } else { + result_list.prepend(add_value); + } + is_addon_inserted = true; + } + if( is_addon_inserted ) { + qputenv(var_name, result_list.join(QStringLiteral(":")).toLatin1()); + } +} + QTextStream out(stderr); void sigtermHandler(int signalNumber) @@ -50,7 +96,7 @@ void sigtermHandler(int signalNumber) void messageBox(const QString &text) { out << text; - runSync(QStringLiteral("xmessage"), {QStringLiteral("-geometry"), QStringLiteral("500x100"), text}); + runSync(QStringLiteral("xmessage"), {QStringLiteral("-center"), QStringLiteral("-geometry"), QStringLiteral("500x100"), text}); } QStringList allServices(const QLatin1String &prefix) @@ -131,7 +177,7 @@ void sourceFiles(const QStringList &file if (filteredFiles.isEmpty()) return; - filteredFiles.prepend(QStringLiteral(CMAKE_INSTALL_FULL_LIBEXECDIR "/plasma-sourceenv.sh")); + filteredFiles.prepend(QStringLiteral("/usr/libexec/kf5/plasma-sourceenv.sh")); QProcess p; p.start(QStringLiteral("/bin/sh"), filteredFiles); @@ -156,6 +202,30 @@ void sourceFiles(const QStringList &file void createConfigDirectory() { + __insert_to_environment_variable("PATH", QStringLiteral("/usr/lib/kf5/bin"), QStringList() << QStringLiteral("/usr/local/bin"), true); + __insert_to_environment_variable("PATH", QStringLiteral("/usr/lib/kf5/bin"), QStringList() << QStringLiteral("/usr/bin") << QStringLiteral("/bin"), false); + + __insert_to_environment_variable("LIBEXEC_PATH", QStringLiteral("/usr/libexec")); + __insert_to_environment_variable("LIBEXEC_PATH", QStringLiteral("/usr/libexec/kf5"), QStringList() << QStringLiteral("/usr/libexec"), false); + + if (QFileInfo(QStringLiteral("/usr/lib/openssh/kf5-ksshaskpass")).isExecutable()) { + qputenv("SSH_ASKPASS", "/usr/lib/openssh/kf5-ksshaskpass"); + } + + __insert_to_environment_variable("XDG_DATA_DIRS", QStringLiteral("/usr/share")); + __insert_to_environment_variable("XDG_DATA_DIRS", QStringLiteral("/usr/share/kf5"), QStringList() << QStringLiteral("/usr/share"), false); + + __insert_to_environment_variable("XDG_CONFIG_DIRS", QStringLiteral("/etc/xdg")); + __insert_to_environment_variable("XDG_CONFIG_DIRS", QStringLiteral("/etc/kf5/xdg"), QStringList() << QStringLiteral("/etc/xdg"), false); + + QString local_data_path(QDir::homePath().append(QStringLiteral("/.local/share"))); + if( QDir(local_data_path).exists() ) { + QString local_data_path_kf5(local_data_path.append(QStringLiteral("/kf5"))); + if( !QFileInfo(local_data_path_kf5).exists() ) { + QFile::link(QStringLiteral("./"), local_data_path_kf5); + } + } + const QString configDir = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation); if (!QDir().mkpath(configDir)) out << "Could not create config directory XDG_CONFIG_HOME: " << configDir << '\n'; @@ -197,7 +267,7 @@ void setupCursor(bool wayland) const auto kcminputrc_mouse_cursortheme = inputCfg.readEntry("cursorTheme", QStringLiteral("breeze_cursors")); if (!kcminputrc_mouse_cursortheme.isEmpty()) { #ifdef XCURSOR_PATH - QByteArray path(XCURSOR_PATH); + QByteArray path("/usr/share/kf5/icons:$XCURSOR_PATH:~/.icons:/usr/share/icons"); path.replace("$XCURSOR_PATH", qgetenv("XCURSOR_PATH")); qputenv("XCURSOR_PATH", path); #endif @@ -690,7 +760,7 @@ bool startPlasmaSession(bool wayland) } }); - startPlasmaSession->start(QStringLiteral(CMAKE_INSTALL_FULL_BINDIR "/plasma_session"), plasmaSessionOptions); + startPlasmaSession->start(QStringLiteral("/usr/lib/kf5/bin/plasma_session"), plasmaSessionOptions); } else { qCDebug(PLASMA_STARTUP) << "Using systemd boot"; const QString platform = wayland ? QStringLiteral("wayland") : QStringLiteral("x11");