diff options
Diffstat (limited to 'QtLauncher/engine.cpp')
-rw-r--r-- | QtLauncher/engine.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/QtLauncher/engine.cpp b/QtLauncher/engine.cpp new file mode 100644 index 0000000..1aadfa0 --- /dev/null +++ b/QtLauncher/engine.cpp @@ -0,0 +1,76 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "engine.h" + +#include <QFileInfo> +#include <QDir> + +#define ENGINE_STATE_RUNNING QStringLiteral("running") +#define ENGINE_STATE_APPLAUNCHING QStringLiteral("app-launching") +#define ENGINE_STATE_APPRUNNING QStringLiteral("app-running") +#define ENGINE_STATE_APPCLOSING QStringLiteral("app-closing") + +Engine::Engine(QQuickItem *parent) + : QQuickItem(parent) +{ + m_state = ENGINE_STATE_RUNNING; + + connect(&m_process, &QProcess::stateChanged, this, + [=](QProcess::ProcessState newState) { + if (newState == QProcess::Starting) setState(ENGINE_STATE_APPLAUNCHING); + if (newState == QProcess::Running) setState(ENGINE_STATE_APPRUNNING); + if (newState == QProcess::NotRunning) setState(ENGINE_STATE_RUNNING); + } + ); + + connect(&m_process, &QProcess::errorOccurred, this, + [=](QProcess::ProcessError error) { + qWarning() << m_process.readAllStandardError(); + m_process.close(); + setState(ENGINE_STATE_RUNNING); + } + ); +} + +void Engine::setState(const QString &state) +{ + if (state == m_state) + return; + m_state = state; + emit engineStateChanged(m_state); +} + +void Engine::markApplicationsModelReady() +{ + m_state = ENGINE_STATE_RUNNING; + emit engineStateChanged(m_state); +} + +void Engine::launchApplication(const QString &binary, const QString &arguments, const QVariantMap &env) +{ + if (m_state != ENGINE_STATE_RUNNING) + return; + + setState(ENGINE_STATE_APPLAUNCHING); + + QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); + environment.insert("QT_IM_MODULE", ""); + environment.insert("QT_QPA_PLATFORM", "wayland-egl"); + + for (QVariantMap::const_iterator i = env.begin(); i !=env.end(); ++i) { + environment.insert(i.key(), i.value().toString()); + } + + QFileInfo info(binary); + m_process.setProcessEnvironment(environment); + m_process.setProgram(info.absoluteFilePath()); + m_process.setWorkingDirectory(info.dir().path()); + m_process.setArguments(arguments.split(" ")); + m_process.start(); +} + +void Engine::closeApplication() +{ + m_process.close(); +} |