chore: replace naive mangohud detection with vulkan layer detection
Signed-off-by: Jan200101 <sentrycraft123@gmail.com>
This commit is contained in:
		| @@ -125,6 +125,7 @@ | |||||||
| #ifdef Q_OS_LINUX | #ifdef Q_OS_LINUX | ||||||
| #include <dlfcn.h> | #include <dlfcn.h> | ||||||
| #include "gamemode_client.h" | #include "gamemode_client.h" | ||||||
|  | #include "MangoHud.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1519,17 +1520,8 @@ void Application::updateCapabilities() | |||||||
|     if (gamemode_query_status() >= 0) |     if (gamemode_query_status() >= 0) | ||||||
|         m_capabilities |= SupportsGameMode; |         m_capabilities |= SupportsGameMode; | ||||||
|  |  | ||||||
|     { |     if (!MangoHud::getLibraryString().isEmpty()) | ||||||
|         void *dummy = dlopen("libMangoHud_dlsym.so", RTLD_LAZY); |         m_capabilities |= SupportsMangoHud; | ||||||
|         // try normal variant as well |  | ||||||
|         if (dummy == NULL) |  | ||||||
|             dummy = dlopen("libMangoHud.so", RTLD_LAZY); |  | ||||||
|  |  | ||||||
|         if (dummy != NULL) { |  | ||||||
|             dlclose(dummy); |  | ||||||
|             m_capabilities |= SupportsMangoHud; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -90,6 +90,15 @@ set(CORE_SOURCES | |||||||
|     MMCTime.h |     MMCTime.h | ||||||
|     MMCTime.cpp |     MMCTime.cpp | ||||||
| ) | ) | ||||||
|  | if (UNIX AND NOT CYGWIN AND NOT APPLE) | ||||||
|  | set(CORE_SOURCES | ||||||
|  |     ${CORE_SOURCES} | ||||||
|  |  | ||||||
|  |     # MangoHud | ||||||
|  |     MangoHud.h | ||||||
|  |     MangoHud.cpp | ||||||
|  |     ) | ||||||
|  | endif() | ||||||
|  |  | ||||||
| set(PATHMATCHER_SOURCES | set(PATHMATCHER_SOURCES | ||||||
|     # Path matchers |     # Path matchers | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								launcher/MangoHud.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								launcher/MangoHud.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | // SPDX-License-Identifier: GPL-3.0-only | ||||||
|  | /* | ||||||
|  |  *  PrismLauncher - Minecraft Launcher | ||||||
|  |  *  Copyright (C) 2022 Jan Drögehoff <sentrycraft123@gmail.com> | ||||||
|  |  * | ||||||
|  |  *  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, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <QStringList> | ||||||
|  | #include <QDir> | ||||||
|  | #include <QString> | ||||||
|  | #include <QtGlobal> | ||||||
|  |  | ||||||
|  | #include "MangoHud.h" | ||||||
|  | #include "FileSystem.h" | ||||||
|  | #include "Json.h" | ||||||
|  |  | ||||||
|  | namespace MangoHud { | ||||||
|  |  | ||||||
|  | QString getLibraryString() | ||||||
|  | { | ||||||
|  |     /* | ||||||
|  |      * Check for vulkan layers in this order: | ||||||
|  |      * | ||||||
|  |      * $VK_LAYER_PATH | ||||||
|  |      * $XDG_DATA_DIRS (/usr/local/share/:/usr/share/) | ||||||
|  |      * $XDG_DATA_HOME  (~/.local/share) | ||||||
|  |      * /etc | ||||||
|  |      * $XDG_CONFIG_DIRS (/etc/xdg) | ||||||
|  |      * $XDG_CONFIG_HOME (~/.config) | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     QStringList vkLayerList; | ||||||
|  |     { | ||||||
|  |         QString home = QDir::homePath(); | ||||||
|  |  | ||||||
|  |         QString vkLayerPath = qEnvironmentVariable("VK_LAYER_PATH"); | ||||||
|  |         if (!vkLayerPath.isEmpty()) { | ||||||
|  |             vkLayerList << vkLayerPath; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         QStringList xdgDataDirs = qEnvironmentVariable("XDG_DATA_DIRS", "/usr/local/share/:/usr/share/").split(QLatin1String(":")); | ||||||
|  |         for (QString dir : xdgDataDirs) { | ||||||
|  |             vkLayerList << FS::PathCombine(dir, "vulkan", "implicit_layer.d"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         QString xdgDataHome = qEnvironmentVariable("XDG_DATA_HOME"); | ||||||
|  |         if (xdgDataHome.isEmpty()) { | ||||||
|  |             xdgDataHome = FS::PathCombine(home, ".local", "share"); | ||||||
|  |         } | ||||||
|  |         vkLayerList << FS::PathCombine(xdgDataHome, "vulkan", "implicit_layer.d"); | ||||||
|  |  | ||||||
|  |         vkLayerList << "/etc"; | ||||||
|  |  | ||||||
|  |         QStringList xdgConfigDirs = qEnvironmentVariable("XDG_CONFIG_DIRS", "/etc/xdg").split(QLatin1String(":")); | ||||||
|  |         for (QString dir : xdgConfigDirs) { | ||||||
|  |             vkLayerList << FS::PathCombine(dir, "vulkan", "implicit_layer.d"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         QString xdgConfigHome = qEnvironmentVariable("XDG_CONFIG_HOME"); | ||||||
|  |         if (xdgConfigHome.isEmpty()) { | ||||||
|  |             xdgConfigHome = FS::PathCombine(home, ".config"); | ||||||
|  |         } | ||||||
|  |         vkLayerList << FS::PathCombine(xdgConfigHome, "vulkan", "implicit_layer.d"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (QString vkLayer : vkLayerList) { | ||||||
|  |         QString filePath = FS::PathCombine(vkLayer, "MangoHud.json"); | ||||||
|  |         if (!QFile::exists(filePath)) | ||||||
|  |             continue; | ||||||
|  |  | ||||||
|  |         auto conf = Json::requireDocument(filePath, vkLayer); | ||||||
|  |         auto confObject = Json::requireObject(conf, vkLayer); | ||||||
|  |         auto layer = Json::ensureObject(confObject, "layer"); | ||||||
|  |         return Json::ensureString(layer, "library_path"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return QString(); | ||||||
|  | } | ||||||
|  | }  // namespace MangoHud | ||||||
							
								
								
									
										27
									
								
								launcher/MangoHud.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								launcher/MangoHud.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | // SPDX-License-Identifier: GPL-3.0-only | ||||||
|  | /* | ||||||
|  |  *  PrismLauncher - Minecraft Launcher | ||||||
|  |  *  Copyright (C) 2022 Jan Drögehoff <sentrycraft123@gmail.com> | ||||||
|  |  * | ||||||
|  |  *  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, see <https://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <QString> | ||||||
|  | #include <QStringList> | ||||||
|  |  | ||||||
|  | namespace MangoHud { | ||||||
|  |  | ||||||
|  | QString getLibraryString(); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user