/* * SPDX-FileCopyrightText: 2015 Marco Martin * SPDX-FileCopyrightText: 2018 Bhushan Shah * SPDX-FileCopyrightText: 2021 Devin Lin * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "shellutil.h" #include "windowutil.h" #include #include #include #include #include #include #include #include #include #include #define FORMAT24H "HH:mm:ss" ShellUtil::ShellUtil(QObject *parent) : QObject{parent} , m_launchingApp{nullptr} , m_localeConfig{KSharedConfig::openConfig(QStringLiteral("kdeglobals"), KConfig::SimpleConfig)} { m_localeConfigWatcher = KConfigWatcher::create(m_localeConfig); // watch for changes to locale config, to update 12/24 hour time connect(m_localeConfigWatcher.data(), &KConfigWatcher::configChanged, this, [this](const KConfigGroup &group, const QByteArrayList &names) -> void { if (group.name() == "Locale") { // we have to reparse for new changes (from system settings) m_localeConfig->reparseConfiguration(); Q_EMIT isSystem24HourFormatChanged(); } }); } ShellUtil *ShellUtil::instance() { static ShellUtil *inst = new ShellUtil(nullptr); return inst; } void ShellUtil::stackItemBefore(QQuickItem *item1, QQuickItem *item2) { if (!item1 || !item2 || item1 == item2 || item1->parentItem() != item2->parentItem()) { return; } item1->stackBefore(item2); } void ShellUtil::stackItemAfter(QQuickItem *item1, QQuickItem *item2) { if (!item1 || !item2 || item1 == item2 || item1->parentItem() != item2->parentItem()) { return; } item1->stackAfter(item2); } void ShellUtil::executeCommand(const QString &command) { qWarning() << "Executing" << command; const QStringList commandAndArguments = QProcess::splitCommand(command); QProcess::startDetached(commandAndArguments.front(), commandAndArguments.mid(1)); } bool ShellUtil::isSystem24HourFormat() { KConfigGroup localeSettings = KConfigGroup(m_localeConfig, "Locale"); QString timeFormat = localeSettings.readEntry("TimeFormat", QStringLiteral(FORMAT24H)); return timeFormat == QStringLiteral(FORMAT24H); } void ShellUtil::launchApp(const QString &storageId) { // try to activate a running window first auto windows = WindowUtil::instance()->windowsFromStorageId(storageId); if (!windows.empty()) { windows[0]->requestActivate(); return; } // now try launching the window KService::Ptr service = KService::serviceByStorageId(storageId); if (!service) { qWarning() << "Could not find" << storageId; return; } auto job = new KIO::ApplicationLauncherJob(service, this); job->setUiDelegate(new KNotificationJobUiDelegate(KJobUiDelegate::AutoHandlingEnabled)); job->start(); setLaunchingApp(job); } bool ShellUtil::isLaunchingApp() { return m_launchingApp != nullptr; } void ShellUtil::setLaunchingApp(KIO::ApplicationLauncherJob *launcherJob) { m_launchingAppPids = {}; m_launchingApp = launcherJob; // do not assume that the pointer is valid, KJobs destroy themselves connect(launcherJob, &KIO::ApplicationLauncherJob::result, this, [this](auto *job) { m_launchingAppPids = m_launchingApp->pids(); }); Q_EMIT isLaunchingAppChanged(); } void ShellUtil::cancelLaunchingApp() { for (auto pid : m_launchingAppPids) { QProcess::execute("kill", {QString::number(pid)}); } clearLaunchingApp(); } void ShellUtil::clearLaunchingApp() { m_launchingApp = nullptr; Q_EMIT isLaunchingAppChanged(); }