summaryrefslogtreecommitdiffstats
path: root/QtLauncher/engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'QtLauncher/engine.cpp')
-rw-r--r--QtLauncher/engine.cpp76
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();
+}