diff --git a/.gitmodules b/.gitmodules index d488b86..ae61cba 100644 --- a/.gitmodules +++ b/.gitmodules @@ -27,13 +27,13 @@ url = https://github.com/nlohmann/json [submodule "deps/traypp"] path = deps/traypp - url = https://github.com/Soundux/traypp.git + url = https://github.com/Soundux/traypp [submodule "deps/fifo_map"] path = deps/fifo_map - url = git@github.com:nlohmann/fifo_map.git + url = https://github.com/nlohmann/fifo_map [submodule "deps/Shortcuts_VDF"] path = deps/Shortcuts_VDF - url = git@github.com:Alia5/Shortcuts_VDF.git + url = https://github.com/Alia5/Shortcuts_VDF [submodule "deps/cpp-httplib"] path = deps/cpp-httplib - url = git@github.com:yhirose/cpp-httplib.git + url = https://github.com/yhirose/cpp-httplib diff --git a/GlosSIConfig/GlosSIConfig.vcxproj b/GlosSIConfig/GlosSIConfig.vcxproj index f0c35bf..55a1b71 100644 --- a/GlosSIConfig/GlosSIConfig.vcxproj +++ b/GlosSIConfig/GlosSIConfig.vcxproj @@ -69,7 +69,7 @@ %(AdditionalUsingDirectories) /Zc:__cplusplus /Zc:twoPhase- %(AdditionalOptions) false - NOMINMAX;%(PreprocessorDefinitions) + NOMINMAX;CONFIGAPP;%(PreprocessorDefinitions) ..\deps\WinReg;..\deps\fifo_map\src;..\deps\Shortcuts_VDF\include;%(AdditionalIncludeDirectories) @@ -92,7 +92,7 @@ %(AdditionalUsingDirectories) /Zc:__cplusplus /Zc:zwoPhase- /permissive- %(AdditionalOptions) false - NOMINMAX;%(PreprocessorDefinitions) + NOMINMAX;CONFIGAPP;%(PreprocessorDefinitions) ..\deps\WinReg;..\deps\fifo_map\src;..\deps\Shortcuts_VDF\include;%(AdditionalIncludeDirectories) @@ -136,6 +136,7 @@ + diff --git a/GlosSIConfig/GlosSIConfig.vcxproj.filters b/GlosSIConfig/GlosSIConfig.vcxproj.filters index 8999805..fc4e559 100644 --- a/GlosSIConfig/GlosSIConfig.vcxproj.filters +++ b/GlosSIConfig/GlosSIConfig.vcxproj.filters @@ -37,6 +37,9 @@ Source Files + + Source Files + diff --git a/GlosSIConfig/Resource.rc b/GlosSIConfig/Resource.rc index cfa4115..9062346 100644 --- a/GlosSIConfig/Resource.rc +++ b/GlosSIConfig/Resource.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,1,1,101000823500 - PRODUCTVERSION 0,1,1,101000823500 + FILEVERSION 0,1,1,2012005004400 + PRODUCTVERSION 0,1,1,2012005004400 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "Peter Repukat - FlatspotSoftware" VALUE "FileDescription", "GlosSI - Config" - VALUE "FileVersion", "0.1.1.1-1-ga8235ca" + VALUE "FileVersion", "0.1.1.2-12-g5fe44d0" VALUE "InternalName", "GlosSIConfig" VALUE "LegalCopyright", "Copyright (C) 2021 Peter Repukat - FlatspotSoftware" VALUE "OriginalFilename", "GlosSIConfig.exe" VALUE "ProductName", "GlosSI" - VALUE "ProductVersion", "0.1.1.1-1-ga8235ca" + VALUE "ProductVersion", "0.1.1.2-12-g5fe44d0" END END BLOCK "VarFileInfo" @@ -1400,6 +1400,106 @@ IDI_ICON1 ICON "..\GlosSI_Icon.ico" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GlosSIConfig/UIModel.cpp b/GlosSIConfig/UIModel.cpp index 007545a..172630a 100644 --- a/GlosSIConfig/UIModel.cpp +++ b/GlosSIConfig/UIModel.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22,6 +22,8 @@ limitations under the License. #include #include #include +#include + #include @@ -36,6 +38,9 @@ limitations under the License. #include "ExeImageProvider.h" #include "../version.hpp" +#include "../../GlosSITarget/UnhookUtil.h" + + UIModel::UIModel() : QObject(nullptr) { wchar_t* localAppDataFolder; @@ -60,9 +65,13 @@ UIModel::UIModel() : QObject(nullptr) if (!std::filesystem::exists(path)) std::filesystem::create_directories(path); + auto defaultConf = getDefaultConf(); + saveDefaultConf(defaultConf); + parseShortcutVDF(); readTargetConfigs(); updateCheck(); + readUnhookBytes(); auto font = QGuiApplication::font(); font.setPointSize(11); @@ -115,6 +124,8 @@ bool UIModel::updateTarget(int index, QVariant shortcut) const auto map = shortcut.toMap(); const auto json = QJsonObject::fromVariantMap(map); + const auto was_in_steam_ = isInSteam(shortcut); + auto oldSteamName = targets_[index].toMap()["name"].toString(); auto oldName = targets_[index].toMap()["name"].toString().replace(QRegularExpression("[\\\\/:*?\"<>|]"), "") + ".json"; @@ -132,15 +143,19 @@ bool UIModel::updateTarget(int index, QVariant shortcut) path /= config_dir_name_.toStdString(); path /= (map["name"].toString()).toStdString(); - if (removeFromSteam(oldSteamName, QString::fromStdWString(path.wstring()))) { - if (!addToSteam(shortcut, QString::fromStdWString(path.wstring()))) { - qDebug() << "Couldn't add shortcut \"" << (map["name"].toString()) << "\" to Steam when updating"; - return false; + if (was_in_steam_) { + if (removeFromSteam(oldSteamName, QString::fromStdWString(path.wstring()))) { + if (!addToSteam(shortcut, QString::fromStdWString(path.wstring()))) { + qDebug() << "Couldn't add shortcut \"" << (map["name"].toString()) << "\" to Steam when updating"; + return false; + } + return true; } + qDebug() << "Couldn't remove shortcut \"" << oldName << "\" from Steam when updating"; + return false; + } else { return true; } - qDebug() << "Couldn't remove shortcut \"" << oldName << "\" from Steam when updating"; - return false; } void UIModel::deleteTarget(int index) @@ -159,7 +174,9 @@ bool UIModel::isInSteam(QVariant shortcut) const { const auto map = shortcut.toMap(); for (auto& steam_shortcut : shortcuts_vdf_) { - if (map["name"].toString() == QString::fromStdString(steam_shortcut.appname)) { + if ( + map["name"].toString() == QString::fromStdString(steam_shortcut.appname) || + map["oldName"].toString() == QString::fromStdString(steam_shortcut.appname)) { if (QString::fromStdString(steam_shortcut.exe).toLower().contains("glossitarget.exe")) { return true; } @@ -383,6 +400,10 @@ QVariantMap UIModel::getDefaultConf() const {"extendedLogging", false}, {"snapshotNotify", false}, {"steamgridApiKey", QJsonValue::Null}, + {"steamPath", + QJsonValue::fromVariant(QString::fromStdWString(getSteamPath(false).wstring()))}, + {"steamUserId", + QJsonValue::fromVariant(QString::fromStdWString(getSteamUserId(false)))}, {"controller", QJsonObject{{"maxControllers", 1}, {"emulateDS4", false}, {"allowDesktopConfig", false}}}, {"devices", QJsonObject{ @@ -403,9 +424,11 @@ QVariantMap UIModel::getDefaultConf() const {"window", QJsonObject{ {"disableOverlay", false}, + {"hideAltTab", false}, {"maxFps", QJsonValue::Null}, {"scale", QJsonValue::Null}, {"windowMode", false}, + {"disableGlosSIOverlay", false}, }}, }; @@ -719,20 +742,33 @@ QString UIModel::getVersionString() const { return QString(version::VERSION_STR) QString UIModel::getNewVersionName() const { return new_version_name_; } -std::filesystem::path UIModel::getSteamPath() const +std::filesystem::path UIModel::getSteamPath(bool tryConfig) const { + QVariantMap defaultConf; + if (tryConfig) { + defaultConf = getDefaultConf(); + } + try { #ifdef _WIN32 // TODO: check if keys/value exist // steam should always be open and have written reg values... winreg::RegKey key{HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam"}; if (!key.IsValid()) { + if (defaultConf.contains("steamPath") && + QMetaType::canConvert(defaultConf["steamPath"].metaType(), QMetaType(QMetaType::QString))) { + return defaultConf["steamPath"].toString().toStdWString(); + } return ""; } const auto res = key.GetStringValue(L"SteamPath"); return res; } catch (...) { + if (defaultConf.contains("steamPath") && + QMetaType::canConvert(defaultConf["steamPath"].metaType(), QMetaType(QMetaType::QString))) { + return defaultConf["steamPath"].toString().toStdWString(); + } return ""; } #else @@ -740,23 +776,39 @@ std::filesystem::path UIModel::getSteamPath() const #endif } -std::wstring UIModel::getSteamUserId() const +std::wstring UIModel::getSteamUserId(bool tryConfig) const { + QVariantMap defaultConf; + if (tryConfig) { + defaultConf = getDefaultConf(); + } #ifdef _WIN32 try { // TODO: check if keys/value exist // steam should always be open and have written reg values... winreg::RegKey key{HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam\\ActiveProcess"}; if (!key.IsValid()) { + if (defaultConf.contains("steamUserId") && + QMetaType::canConvert(defaultConf["steamUserId"].metaType(), QMetaType(QMetaType::QString))) { + return defaultConf["steamUserId"].toString().toStdWString(); + } return L"0"; } const auto res = std::to_wstring(key.GetDwordValue(L"ActiveUser")); if (res == L"0") { qDebug() << "Steam not open?"; + if (defaultConf.contains("steamUserId") && + QMetaType::canConvert(defaultConf["steamUserId"].metaType(), QMetaType(QMetaType::QString))) { + return defaultConf["steamUserId"].toString().toStdWString(); + } } return res; } catch (...) { + if (defaultConf.contains("steamUserId") && + QMetaType::canConvert(defaultConf["steamUserId"].metaType(), QMetaType(QMetaType::QString))) { + return defaultConf["steamUserId"].toString().toStdWString(); + } return L"0"; } #else @@ -830,3 +882,35 @@ bool UIModel::isSteamInputXboxSupportEnabled() const } return true; } + +void UIModel::readUnhookBytes() const +{ + std::map unhook_bytes; + for (const auto& name : UnhookUtil::UNHOOK_BYTES_ORIGINAL_22000 | std::views::keys) { + auto bytes = UnhookUtil::ReadOriginalBytes( + name, + name.starts_with("Hid") + ? L"hid.dll" + : name.starts_with("Setup") + ? L"setupapi.dll" + : L"Kernel32.dll" + ); + unhook_bytes[name] = bytes; + } + auto path = config_path_; + path /= "unhook_bytes"; + QFile file(path); + if (!file.open(QIODevice::Truncate | QIODevice::ReadWrite)) { + qDebug() << "Couldn't open file for writing: " << path; + return; + } + + for (const auto& [name, bytes] : unhook_bytes) { + file.write( + QString::fromStdString(name + ":").toStdString().data() + ); + file.write(bytes.data(), bytes.size()); + file.write("\n"); + } + file.close(); +} diff --git a/GlosSIConfig/UIModel.h b/GlosSIConfig/UIModel.h index 8bc5871..4edcb56 100644 --- a/GlosSIConfig/UIModel.h +++ b/GlosSIConfig/UIModel.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -125,10 +125,12 @@ class UIModel : public QObject { QString getVersionString() const; QString getNewVersionName() const; - std::filesystem::path getSteamPath() const; - std::wstring getSteamUserId() const; + std::filesystem::path getSteamPath(bool tryConfig = true) const; + std::wstring getSteamUserId(bool tryConfig = true) const; bool foundSteam() const; void parseShortcutVDF(); bool isSteamInputXboxSupportEnabled() const; + + void readUnhookBytes() const; }; diff --git a/GlosSIConfig/WinEventFilter.h b/GlosSIConfig/WinEventFilter.h index b82407f..be1ef65 100644 --- a/GlosSIConfig/WinEventFilter.h +++ b/GlosSIConfig/WinEventFilter.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/main.cpp b/GlosSIConfig/main.cpp index 8ad85de..ba303d3 100644 --- a/GlosSIConfig/main.cpp +++ b/GlosSIConfig/main.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/AddSelectTypeDialog.qml b/GlosSIConfig/qml/AddSelectTypeDialog.qml index 857981b..ce21ef9 100644 --- a/GlosSIConfig/qml/AddSelectTypeDialog.qml +++ b/GlosSIConfig/qml/AddSelectTypeDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/AdvancedTargetSettings.qml b/GlosSIConfig/qml/AdvancedTargetSettings.qml index 5628f4a..c6327cd 100644 --- a/GlosSIConfig/qml/AdvancedTargetSettings.qml +++ b/GlosSIConfig/qml/AdvancedTargetSettings.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -140,7 +140,7 @@ CollapsiblePane { RPane { width: parent.width / 2 - 8 - height: 248 + height: 324 radius: 4 Material.elevation: 32 bgOpacity: 0.97 @@ -290,7 +290,7 @@ CollapsiblePane { } RPane { width: parent.width / 2 - 8 - height: 248 + height: 324 radius: 4 Material.elevation: 32 bgOpacity: 0.97 @@ -359,6 +359,76 @@ CollapsiblePane { height: 24 } } + } + Item { + width: 1 + height: 4 + } + + Row { + CheckBox { + id: hideAltTabCheckbox + text: qsTr("Hide GlosSI from Windowlist (Alt+Tab)") + checked: shortcutInfo.window.hideAltTab + onCheckedChanged: shortcutInfo.window.hideAltTab = checked + } + RoundButton { + onClicked: () => { + helpInfoDialog.titleText = qsTr("Hide GlosSI from Windowlist (Alt+Tab)") + helpInfoDialog.text = + qsTr("Hides GlosSI from the Windowlist (Alt+Tab)") + + "\n" + + qsTr("You can close the GlosSI-Window via the system-tray") + + "\n" + + "\n" + + qsTr("Might help with Steam remote play.") + + helpInfoDialog.open() + } + width: 48 + height: 48 + Material.elevation: 0 + anchors.topMargin: 16 + Image { + anchors.centerIn: parent + source: "qrc:/svg/help_outline_white_24dp.svg" + width: 24 + height: 24 + } + } + } + Item { + width: 1 + height: 4 + } + Row { + CheckBox { + id: disableGlosSIOverlayCheckbox + text: qsTr("Disable GlosSI overlay") + checked: shortcutInfo.window.disableGlosSIOverlay + onCheckedChanged: shortcutInfo.window.disableGlosSIOverlay = checked + } + RoundButton { + onClicked: () => { + helpInfoDialog.titleText = qsTr("Disable GlosSI overlay") + helpInfoDialog.text = + qsTr("Disables the additional GlosSI overlay") + + "\n" + + qsTr("but keeps the Steam overlay"); + + helpInfoDialog.open() + } + width: 48 + height: 48 + Material.elevation: 0 + anchors.topMargin: 16 + Image { + anchors.centerIn: parent + source: "qrc:/svg/help_outline_white_24dp.svg" + width: 24 + height: 24 + } + } } Item { width: 1 diff --git a/GlosSIConfig/qml/CollapsiblePane.qml b/GlosSIConfig/qml/CollapsiblePane.qml index 6dea9e0..14ac6f0 100644 --- a/GlosSIConfig/qml/CollapsiblePane.qml +++ b/GlosSIConfig/qml/CollapsiblePane.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/EGSSelectDialog.qml b/GlosSIConfig/qml/EGSSelectDialog.qml index 5fce0bd..0f06d17 100644 --- a/GlosSIConfig/qml/EGSSelectDialog.qml +++ b/GlosSIConfig/qml/EGSSelectDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -189,7 +189,7 @@ Dialog { anchors.verticalCenter: parent.verticalCenter spacing: 2 Label { - text: modelData.InstallLocation.split('/').pop().split('\\').pop() + text: modelData.InstallLocation.split('/').pop().split('\\').pop().replace(/([a-z])([A-Z])/g, '$1 $2') font.pixelSize: 18 font.bold: true } diff --git a/GlosSIConfig/qml/FluentTextInput.qml b/GlosSIConfig/qml/FluentTextInput.qml index 21efd88..0004c45 100644 --- a/GlosSIConfig/qml/FluentTextInput.qml +++ b/GlosSIConfig/qml/FluentTextInput.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/GlobalConf.qml b/GlosSIConfig/qml/GlobalConf.qml index 97c7a65..29ec398 100644 --- a/GlosSIConfig/qml/GlobalConf.qml +++ b/GlosSIConfig/qml/GlobalConf.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/InfoDialog.qml b/GlosSIConfig/qml/InfoDialog.qml index f635235..b31d404 100644 --- a/GlosSIConfig/qml/InfoDialog.qml +++ b/GlosSIConfig/qml/InfoDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/RPane.qml b/GlosSIConfig/qml/RPane.qml index 2705cd7..713f2ab 100644 --- a/GlosSIConfig/qml/RPane.qml +++ b/GlosSIConfig/qml/RPane.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/ShortcutCards.qml b/GlosSIConfig/qml/ShortcutCards.qml index 90857c0..b50aee2 100644 --- a/GlosSIConfig/qml/ShortcutCards.qml +++ b/GlosSIConfig/qml/ShortcutCards.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/ShortcutProps.qml b/GlosSIConfig/qml/ShortcutProps.qml index 9d66279..08a0737 100644 --- a/GlosSIConfig/qml/ShortcutProps.qml +++ b/GlosSIConfig/qml/ShortcutProps.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -136,7 +136,11 @@ Item { id: nameInput placeholderText: qsTr("...") text: shortcutInfo.name - onTextChanged: shortcutInfo.name = text + onTextChanged: function() { + shortcutInfo.oldName = shortcutInfo.oldName || shortcutInfo.name + shortcutInfo.name = nameInput.text + shortcutInfo = shortcutInfo + } validator: RegularExpressionValidator { regularExpression: /([0-z]|\s|.)+/gm } } } @@ -374,7 +378,7 @@ Item { id: egsSelectDialog onConfirmed: function(modelData) { if (nameInput.text == "") { - nameInput.text = modelData.InstallLocation.split('/').pop().split('\\').pop() + nameInput.text = modelData.InstallLocation.split('/').pop().split('\\').pop().replace(/([a-z])([A-Z])/g, '$1 $2') } pathInput.text = "com.epicgames.launcher://apps/" + modelData.NamespaceId diff --git a/GlosSIConfig/qml/SteamGridDialog.qml b/GlosSIConfig/qml/SteamGridDialog.qml index 85459e3..c74954f 100644 --- a/GlosSIConfig/qml/SteamGridDialog.qml +++ b/GlosSIConfig/qml/SteamGridDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/SteamInputXboxDisabledDialog.qml b/GlosSIConfig/qml/SteamInputXboxDisabledDialog.qml index 7e2350c..28a7324 100644 --- a/GlosSIConfig/qml/SteamInputXboxDisabledDialog.qml +++ b/GlosSIConfig/qml/SteamInputXboxDisabledDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/SteamNotFoundDialog.qml b/GlosSIConfig/qml/SteamNotFoundDialog.qml index 1aba489..f519d39 100644 --- a/GlosSIConfig/qml/SteamNotFoundDialog.qml +++ b/GlosSIConfig/qml/SteamNotFoundDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/UWPSelectDialog.qml b/GlosSIConfig/qml/UWPSelectDialog.qml index 3c12235..bd3fe4f 100644 --- a/GlosSIConfig/qml/UWPSelectDialog.qml +++ b/GlosSIConfig/qml/UWPSelectDialog.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIConfig/qml/main.qml b/GlosSIConfig/qml/main.qml index 1f5fe67..c9fa9aa 100644 --- a/GlosSIConfig/qml/main.qml +++ b/GlosSIConfig/qml/main.qml @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -492,12 +492,12 @@ Window { if (windowContent.editedIndex < 0) { uiModel.addTarget(shortcut) } else { - if (uiModel.isInSteam(shortcut)) { - if (uiModel.updateTarget(windowContent.editedIndex, shortcut)) { - if (steamShortcutsChanged == false) { - steamChangedDialog.open(); - } - } else { + if (uiModel.updateTarget(windowContent.editedIndex, shortcut)) { + if (uiModel.isInSteam(shortcut) && steamShortcutsChanged == false) { + steamChangedDialog.open(); + } + } else { + if (uiModel.isInSteam(shortcut)) { manualInfo = uiModel.manualProps(shortcut); writeErrorDialog.open(); } diff --git a/GlosSITarget/AppLauncher.cpp b/GlosSITarget/AppLauncher.cpp index e9b007a..140a28d 100644 --- a/GlosSITarget/AppLauncher.cpp +++ b/GlosSITarget/AppLauncher.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/AppLauncher.h b/GlosSITarget/AppLauncher.h index 8293e8e..311ae78 100644 --- a/GlosSITarget/AppLauncher.h +++ b/GlosSITarget/AppLauncher.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/HidHide.cpp b/GlosSITarget/HidHide.cpp index 086383d..4b9cbb3 100644 --- a/GlosSITarget/HidHide.cpp +++ b/GlosSITarget/HidHide.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/HidHide.h b/GlosSITarget/HidHide.h index 4fa1b27..20689f9 100644 --- a/GlosSITarget/HidHide.h +++ b/GlosSITarget/HidHide.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/HttpServer.cpp b/GlosSITarget/HttpServer.cpp index c3acd0d..790e2a3 100644 --- a/GlosSITarget/HttpServer.cpp +++ b/GlosSITarget/HttpServer.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ limitations under the License. #include "AppLauncher.h" #include "Settings.h" -HttpServer::HttpServer(AppLauncher& app_launcher) : app_launcher_(app_launcher) +HttpServer::HttpServer(AppLauncher& app_launcher, std::function close) : app_launcher_(app_launcher), close_(close) { } @@ -62,6 +62,10 @@ void HttpServer::run() res.set_content(j.dump(), "text/json"); }); + server_.Post("/quit", [this](const httplib::Request& req, httplib::Response& res) { + close_(); + }); + server_.Get("/settings", [this](const httplib::Request& req, httplib::Response& res) { res.set_content(Settings::toJson().dump(), "text/json"); }); diff --git a/GlosSITarget/HttpServer.h b/GlosSITarget/HttpServer.h index b23bff5..1660ffa 100644 --- a/GlosSITarget/HttpServer.h +++ b/GlosSITarget/HttpServer.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ class AppLauncher; class HttpServer { public: - explicit HttpServer(AppLauncher& app_launcher); + explicit HttpServer(AppLauncher& app_launcher, std::function close); void run(); void stop(); @@ -34,4 +34,5 @@ class HttpServer { uint16_t port_ = 8756; AppLauncher& app_launcher_; + std::function close_; }; \ No newline at end of file diff --git a/GlosSITarget/InputRedirector.cpp b/GlosSITarget/InputRedirector.cpp index 883c420..20efb5b 100644 --- a/GlosSITarget/InputRedirector.cpp +++ b/GlosSITarget/InputRedirector.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/InputRedirector.h b/GlosSITarget/InputRedirector.h index 0e74653..cc456a9 100644 --- a/GlosSITarget/InputRedirector.h +++ b/GlosSITarget/InputRedirector.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/Overlay.cpp b/GlosSITarget/Overlay.cpp index c5427d5..5fbe97a 100644 --- a/GlosSITarget/Overlay.cpp +++ b/GlosSITarget/Overlay.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -182,6 +182,11 @@ void Overlay::update() } } + if (Settings::window.disableGlosSIOverlay) { + ImGui::SFML::Render(window_); + return; + } + showLogs(0); if (enabled_ || force_enable_) { diff --git a/GlosSITarget/Overlay.h b/GlosSITarget/Overlay.h index afd4d52..f04d691 100644 --- a/GlosSITarget/Overlay.h +++ b/GlosSITarget/Overlay.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/Settings.h b/GlosSITarget/Settings.h index 05db5b9..f2b37df 100644 --- a/GlosSITarget/Settings.h +++ b/GlosSITarget/Settings.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -54,6 +54,8 @@ inline struct Window { int maxFps = 0; float scale = 0.f; bool disableOverlay = false; + bool hideAltTab = false; + bool disableGlosSIOverlay = false; } window; inline struct Controller { @@ -69,6 +71,8 @@ inline struct Common { std::wstring name; std::wstring icon; int version; + std::wstring steamPath; + std::wstring steamUserId; } common; inline std::filesystem::path settings_path_ = ""; @@ -189,6 +193,8 @@ inline void Parse(const nlohmann::basic_json<>& json) safeParseValue(winconf, "maxFps", window.maxFps); safeParseValue(winconf, "scale", window.scale); safeParseValue(winconf, "disableOverlay", window.disableOverlay); + safeParseValue(winconf, "hideAltTab", window.hideAltTab); + safeParseValue(winconf, "disableGlosSIOverlay", window.disableGlosSIOverlay); } if (auto controllerConf = json["controller"]; !controllerConf.is_null() && !controllerConf.empty() && controllerConf.is_object()) { @@ -200,6 +206,9 @@ inline void Parse(const nlohmann::basic_json<>& json) safeWStringParse(json, "name", common.name); safeWStringParse(json, "icon", common.icon); safeParseValue(json, "version", common.version); + + safeWStringParse(json, "steamPath", common.steamPath); + safeWStringParse(json, "steamUserId", common.steamUserId); } catch (const nlohmann::json::exception& e) { spdlog::warn("Err parsing config: {}", e.what()); @@ -293,6 +302,7 @@ inline nlohmann::json toJson() json["window"]["maxFps"] = window.maxFps; json["window"]["scale"] = window.scale; json["window"]["disableOverlay"] = window.disableOverlay; + json["window"]["hideAltTab"] = window.hideAltTab; json["controller"]["maxControllers"] = controller.maxControllers; json["controller"]["allowDesktopConfig"] = controller.allowDesktopConfig; json["controller"]["emulateDS4"] = controller.emulateDS4; diff --git a/GlosSITarget/SteamOverlayDetector.cpp b/GlosSITarget/SteamOverlayDetector.cpp index 76d2b9a..0b25c61 100644 --- a/GlosSITarget/SteamOverlayDetector.cpp +++ b/GlosSITarget/SteamOverlayDetector.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/SteamOverlayDetector.h b/GlosSITarget/SteamOverlayDetector.h index 34dbba0..633eee7 100644 --- a/GlosSITarget/SteamOverlayDetector.h +++ b/GlosSITarget/SteamOverlayDetector.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/SteamTarget.cpp b/GlosSITarget/SteamTarget.cpp index fc3c357..16e62f9 100644 --- a/GlosSITarget/SteamTarget.cpp +++ b/GlosSITarget/SteamTarget.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -46,7 +46,7 @@ SteamTarget::SteamTarget() delayed_shutdown_ = true; delay_shutdown_clock_.restart(); }), - server_(launcher_) + server_(launcher_, [this] { run_ = false; }) { target_window_handle_ = window_.getSystemHandle(); #ifdef _WIN32 @@ -180,6 +180,9 @@ void SteamTarget::onOverlayChanged(bool overlay_open) void SteamTarget::toggleGlossiOverlay() { + if (Settings::window.disableGlosSIOverlay) { + return; + } if (overlay_.expired()) { return; } @@ -253,7 +256,7 @@ std::filesystem::path SteamTarget::getSteamPath() const catch (const winreg::RegException& e) { spdlog::error("Couldn't get Steam path from Registry; {}", e.what()); } - return L""; + return Settings::common.steamPath; #else return L""; // TODO #endif @@ -273,7 +276,7 @@ std::wstring SteamTarget::getSteamUserId() const catch (const winreg::RegException& e) { spdlog::error("Couldn't get Steam path from Registry; {}", e.what()); } - return L""; + return Settings::common.steamUserId; #else return L""; // TODO #endif diff --git a/GlosSITarget/SteamTarget.h b/GlosSITarget/SteamTarget.h index ff39ff1..735a547 100644 --- a/GlosSITarget/SteamTarget.h +++ b/GlosSITarget/SteamTarget.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/TargetWindow.cpp b/GlosSITarget/TargetWindow.cpp index ee01712..53ebe65 100644 --- a/GlosSITarget/TargetWindow.cpp +++ b/GlosSITarget/TargetWindow.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -56,6 +56,11 @@ TargetWindow::TargetWindow( if (ImGui::Checkbox("Window mode", &Settings::window.windowMode)) { toggle_window_mode_after_frame_ = true; } +#ifdef _WIN32 + if (ImGui::Checkbox("Hide from Alt+Tab", &Settings::window.hideAltTab)) { + toggle_hidealttab_after_frame_ = true; + } +#endif ImGui::Text("Max. FPS"); ImGui::SameLine(); int max_fps_copy = Settings::window.maxFps; @@ -116,13 +121,30 @@ void TargetWindow::setClickThrough(bool click_through) } #ifdef _WIN32 HWND hwnd = window_.getSystemHandle(); - if (click_through) { - SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_COMPOSITED); - SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + + // hiding GlosSI from Alt-Tab list + // https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles + if (Settings::window.hideAltTab) { + toggle_hidealttab_after_frame_ = false; + + if (click_through) { + SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_COMPOSITED | WS_EX_TOOLWINDOW); + SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } + else { + SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_COMPOSITED | WS_EX_TOOLWINDOW); + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } } else { - SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_COMPOSITED); - SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + if (click_through) { + SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST | WS_EX_COMPOSITED); + SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } + else { + SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_COMPOSITED); + SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } } #endif } @@ -142,9 +164,15 @@ void TargetWindow::update() screenShotWorkaround(); overlay_->update(); window_.display(); +#ifdef _WIN32 + if (toggle_hidealttab_after_frame_) { + toggle_hidealttab_after_frame_ = false; + } +#endif if (toggle_window_mode_after_frame_) { createWindow(); } + // As SFML screws us out of most windows-events, just poll resolution every once in a while // If changed, recreate window. // Fixes Blackscreen issues when user does funky stuff and still uses GlosSI in non windowed mod... @@ -335,6 +363,7 @@ void TargetWindow::createWindow() style &= ~WS_OVERLAPPED; style |= WS_POPUP; SetWindowLong(hwnd, GWL_STYLE, style); + MARGINS margins; margins.cxLeftWidth = -1; diff --git a/GlosSITarget/TargetWindow.h b/GlosSITarget/TargetWindow.h index 57d673e..cf151a6 100644 --- a/GlosSITarget/TargetWindow.h +++ b/GlosSITarget/TargetWindow.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -82,4 +82,5 @@ class TargetWindow { void createWindow(); bool toggle_window_mode_after_frame_ = false; + bool toggle_hidealttab_after_frame_ = false; }; diff --git a/GlosSITarget/UnhookUtil.cpp b/GlosSITarget/UnhookUtil.cpp index 13a4c56..e300a0c 100644 --- a/GlosSITarget/UnhookUtil.cpp +++ b/GlosSITarget/UnhookUtil.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,12 +15,63 @@ limitations under the License. */ #include "UnhookUtil.h" +#ifndef CONFIGAPP #include #include "Settings.h" +#endif void UnhookUtil::UnPatchHook(const std::string& name, HMODULE module) { +#ifndef CONFIGAPP + + + std::map original_bytes_from_file; + + wchar_t* localAppDataFolder; + std::filesystem::path configDirPath; + if (SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_CREATE, NULL, &localAppDataFolder) != S_OK) { + configDirPath = std::filesystem::temp_directory_path().parent_path().parent_path().parent_path(); + } + else { + configDirPath = std::filesystem::path(localAppDataFolder).parent_path(); + } + + configDirPath /= "Roaming"; + configDirPath /= "GlosSI"; + if (std::filesystem::exists(configDirPath)) { + auto unhook_file_path = configDirPath / "unhook_bytes"; + if (std::filesystem::exists(unhook_file_path)) { + + std::ifstream ifile; + ifile.open(unhook_file_path, std::ios::binary | std::ios::in); + if (ifile.is_open()) { + + std::string funcName; + char buff; + do { + if (ifile.eof()) { + break; + } + ifile.read(&buff, sizeof(char)); + if (buff != ':') { + funcName.push_back(buff); + } else { + char bytes[8]; + ifile.read(bytes, sizeof(char) * 8); + ifile.read(&buff, sizeof(char)); // newline + original_bytes_from_file[funcName] = std::string(bytes, 8); + funcName = ""; + } + } while (!ifile.eof()); + + ifile.close(); + } + } + } + + + spdlog::trace("Patching \"{}\"...", name); BYTE* address = reinterpret_cast(GetProcAddress(module, name.c_str())); @@ -28,11 +79,19 @@ void UnhookUtil::UnPatchHook(const std::string& name, HMODULE module) spdlog::error("failed to unpatch \"{}\"", name); } std::string bytes; - if (Settings::isWin10 && UNHOOK_BYTES_ORIGINAL_WIN10.contains(name)) { - bytes = UNHOOK_BYTES_ORIGINAL_WIN10.at(name); + + if (original_bytes_from_file.contains(name)) { + bytes = original_bytes_from_file.at(name); + spdlog::trace("Using originalBytes from file for {}", name); } else { - bytes = UNHOOK_BYTES_ORIGINAL_22000.at(name); + if (Settings::isWin10 && UNHOOK_BYTES_ORIGINAL_WIN10.contains(name)) { + bytes = UNHOOK_BYTES_ORIGINAL_WIN10.at(name); + } + else { + bytes = UNHOOK_BYTES_ORIGINAL_22000.at(name); + } + spdlog::trace("Using fallback originalBytes for {}", name); } DWORD dw_old_protect, dw_bkup; const auto len = bytes.size(); @@ -52,4 +111,18 @@ void UnhookUtil::UnPatchHook(const std::string& name, HMODULE module) spdlog::trace("Unpatched \"{}\"", name); } VirtualProtect(address, len, dw_old_protect, &dw_bkup); // Revert permission change... +#endif +} + +std::string UnhookUtil::ReadOriginalBytes(const std::string& name, const std::wstring& moduleName) +{ + auto module = LoadLibraryW(moduleName.c_str()); + auto address = reinterpret_cast(GetProcAddress(module, name.c_str())); + std::string res; + res.resize(8); + + for (int i = 0; i < 8; i++) { + res[i] = static_cast(*(address + i)); + } + return res; } diff --git a/GlosSITarget/UnhookUtil.h b/GlosSITarget/UnhookUtil.h index 55a5cbc..04f2b33 100644 --- a/GlosSITarget/UnhookUtil.h +++ b/GlosSITarget/UnhookUtil.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ limitations under the License. namespace UnhookUtil { void UnPatchHook(const std::string& name, HMODULE module); +std::string ReadOriginalBytes(const std::string& name, const std::wstring& moduleName); + static inline const std::vector JUMP_INSTR_OPCODES = { 0xE9, 0xE8, @@ -34,6 +36,9 @@ static inline const std::vector JUMP_INSTR_OPCODES = { // Valve Hooks various functions and hides Gaming devices like this. // To be able to query them, unpatch the hook with the original bytes... + +// Bytes here are just fallbacks; originalbytes will get read from GlosSIConfig and stored in %APPDATA%\GlosSI\unhook_bytes + // 22000 ^= Windows build number static inline const std::map UNHOOK_BYTES_ORIGINAL_22000 = { {"SetupDiEnumDeviceInfo", "\x48\x89\x5C\x24\x08"}, diff --git a/GlosSITarget/main.cpp b/GlosSITarget/main.cpp index 65bbc06..71e609f 100644 --- a/GlosSITarget/main.cpp +++ b/GlosSITarget/main.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -168,8 +168,9 @@ int main(int argc, char* argv[]) auto existingwindow = FindWindowA(nullptr, "GlosSITarget"); if (existingwindow) { - spdlog::error("GlosSITarget is already running!"); - return 1; + spdlog::error("GlosSITarget is already running! Closing old process..."); + httplib::Client client("http://localhost:8756"); + client.Post("/quit"); } int numArgs; diff --git a/GlosSITarget/steam_sf_keymap.h b/GlosSITarget/steam_sf_keymap.h index d499cee..b007100 100644 --- a/GlosSITarget/steam_sf_keymap.h +++ b/GlosSITarget/steam_sf_keymap.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSITarget/util.h b/GlosSITarget/util.h index 3fd791a..1644f8b 100644 --- a/GlosSITarget/util.h +++ b/GlosSITarget/util.h @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/GlosSIWatchdog/dllmain.cpp b/GlosSIWatchdog/dllmain.cpp index c63ce7d..d154509 100644 --- a/GlosSIWatchdog/dllmain.cpp +++ b/GlosSIWatchdog/dllmain.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Readme.md b/Readme.md index 91c3b91..23f0162 100644 --- a/Readme.md +++ b/Readme.md @@ -67,7 +67,7 @@ For Building instructions refer to [BUILDING.md](./docs/BUILDING.md) ## License ```license -Copyright 2017-2022 Peter Repukat - FlatspotSoftware +Copyright 2017-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/UWPOverlayEnablerDLL/dllmain.cpp b/UWPOverlayEnablerDLL/dllmain.cpp index 21bd67a..497ff4a 100644 --- a/UWPOverlayEnablerDLL/dllmain.cpp +++ b/UWPOverlayEnablerDLL/dllmain.cpp @@ -1,5 +1,5 @@ /* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware +Copyright 2021-2023 Peter Repukat - FlatspotSoftware Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.