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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// SPDX-License-Identifier: GPL-3.0-only
// SPDX-FileCopyrightText: 2026 Project Tick
// SPDX-FileContributor: Project Tick Team
/*
* ProjT Launcher - Minecraft Launcher
* Copyright (C) 2026 Project Tick
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "java/services/RuntimeEnvironment.hpp"
#include <QDebug>
#define IBUS "@im=ibus"
namespace projt::java
{
QString stripEnvEntries(const QString& name, const QString& value, const QString& remove)
{
QChar delimiter = ':';
#ifdef Q_OS_WIN32
delimiter = ';';
#endif
QStringList targetItems = value.split(delimiter);
QStringList toRemove = remove.split(delimiter);
for (const QString& item : toRemove)
{
if (!targetItems.removeOne(item))
{
qWarning() << "Entry" << item << "could not be stripped from variable" << name;
}
}
return targetItems.join(delimiter);
}
QProcessEnvironment buildCleanEnvironment()
{
QProcessEnvironment rawenv = QProcessEnvironment::systemEnvironment();
QProcessEnvironment env;
QStringList ignored = { "JAVA_ARGS", "CLASSPATH", "CONFIGPATH", "JAVA_HOME",
"JRE_HOME", "_JAVA_OPTIONS", "JAVA_OPTIONS", "JAVA_TOOL_OPTIONS" };
QStringList stripped = {
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
"LD_LIBRARY_PATH",
"LD_PRELOAD",
#endif
"QT_PLUGIN_PATH",
"QT_FONTPATH"
};
for (const auto& key : rawenv.keys())
{
auto current = rawenv.value(key);
if (ignored.contains(key))
{
qDebug() << "Env: ignoring" << key << current;
continue;
}
if (key.startsWith("LAUNCHER_"))
{
qDebug() << "Env: ignoring" << key << current;
continue;
}
if (stripped.contains(key))
{
QString cleaned = stripEnvEntries(key, current, rawenv.value("LAUNCHER_" + key));
qDebug() << "Env: stripped" << key << current << "to" << cleaned;
current = cleaned;
}
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD)
if (key == "XMODIFIERS" && current.contains(IBUS))
{
QString saved = current;
current.replace(IBUS, "");
qDebug() << "Env: stripped" << IBUS << "from" << saved << ":" << current;
}
#endif
env.insert(key, current);
}
#ifdef Q_OS_LINUX
if (!env.contains("LD_LIBRARY_PATH"))
{
env.insert("LD_LIBRARY_PATH", "");
}
#endif
return env;
}
} // namespace projt::java
|