summaryrefslogtreecommitdiff
path: root/archived/projt-launcher/launcher/java/services/RuntimeEnvironment.cpp
blob: e6f027e462591fb902318877f721c79edd47e990 (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
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