summaryrefslogtreecommitdiffstats
path: root/QtLauncher/engine.cpp
blob: 8d8225913894d5b8d15e589dffb8ac96dcf494a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 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>
#include <QStandardPaths>

#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");
    environment.insert("WAYLAND_DISPLAY", QStringLiteral("%1/boot2qt-democompositor").arg(QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation)));

    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();
}