Merge pull request #3199 from myk002/myk_steam_deck

hide terminal console when running on steam deck
develop
Myk 2023-04-10 09:16:08 -07:00 committed by GitHub
commit 2344a30196
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 124 additions and 0 deletions

@ -52,6 +52,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
- Mods: scripts from only the most recent version of an installed mod are added to the script path
- Mods: give active mods a chance to reattach their load hooks when a world is reloaded
- `gui/control-panel`: bugfix services are now enabled by default
- Core: hide DFHack terminal console by default when running on Steam Deck
## Documentation

@ -125,6 +125,7 @@ set(MODULE_HEADERS
include/modules/Burrows.h
include/modules/Constructions.h
include/modules/DFSDL.h
include/modules/DFSteam.h
include/modules/Designations.h
include/modules/EventManager.h
include/modules/Filesystem.h
@ -154,6 +155,7 @@ set(MODULE_SOURCES
modules/Burrows.cpp
modules/Constructions.cpp
modules/DFSDL.cpp
modules/DFSteam.cpp
modules/Designations.cpp
modules/EventManager.cpp
modules/Filesystem.cpp

@ -49,6 +49,7 @@ distribution.
#include "PluginManager.h"
#include "ModuleFactory.h"
#include "modules/DFSDL.h"
#include "modules/DFSteam.h"
#include "modules/EventManager.h"
#include "modules/Filesystem.h"
#include "modules/Gui.h"
@ -1303,6 +1304,10 @@ static void run_dfhack_init(color_ostream &out, Core *core)
return;
}
// if we're running on Steam Deck, hide the terminal by default
if (DFSteam::DFIsSteamRunningOnSteamDeck())
core->getConsole().hide();
// load baseline defaults
core->loadScriptFile(out, CONFIG_PATH + "init/default.dfhack.init", false);
@ -1668,6 +1673,8 @@ bool Core::Init()
fatal("cannot bind SDL libraries");
return false;
}
if (DFSteam::init(con))
std::cerr << "Found Steam.\n";
std::cerr << "Initializing textures.\n";
Textures::init(con);
// create mutex for syncing with interactive tasks
@ -2274,6 +2281,7 @@ int Core::Shutdown ( void )
allModules.clear();
Textures::cleanup();
DFSDL::cleanup();
DFSteam::cleanup();
memset(&(s_mods), 0, sizeof(s_mods));
d.reset();
return -1;

@ -0,0 +1,32 @@
#pragma once
#include "ColorText.h"
#include "Export.h"
namespace DFHack
{
/**
* The DFSteam module - provides access to Steam functions without actually
* requiring build-time linkage to Steam
* \ingroup grp_modules
* \ingroup grp_dfsdl
*/
namespace DFSteam
{
/**
* Call this on DFHack init so we can load the function pointers. Returns false on
* failure.
*/
bool init(DFHack::color_ostream& out);
/**
* Call this when DFHack is being unloaded.
*/
void cleanup();
DFHACK_EXPORT bool DFIsSteamRunningOnSteamDeck();
}
}

@ -0,0 +1,81 @@
#include "Internal.h"
#include "modules/DFSteam.h"
#include "Debug.h"
#include "PluginManager.h"
namespace DFHack
{
DBG_DECLARE(core, dfsteam, DebugCategory::LINFO);
}
using namespace DFHack;
static DFLibrary* g_steam_handle = nullptr;
static const std::vector<std::string> STEAM_LIBS {
"steam_api64.dll",
"steam_api", // TODO: validate this on OSX
"libsteam_api.so" // TODO: validate this on Linux
};
bool (*g_SteamAPI_Init)() = nullptr;
void (*g_SteamAPI_Shutdown)() = nullptr;
void* (*g_SteamInternal_FindOrCreateUserInterface)(int, const char*) = nullptr;
bool (*g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)(void*) = nullptr;
bool DFSteam::init(color_ostream& out) {
for (auto& lib_str : STEAM_LIBS) {
if ((g_steam_handle = OpenPlugin(lib_str.c_str())))
break;
}
if (!g_steam_handle) {
DEBUG(dfsteam, out).print("steam library not found; stubbing calls\n");
return false;
}
#define bind(handle, name) \
g_##name = (decltype(g_##name))LookupPlugin(handle, #name); \
if (!g_##name) { \
WARN(dfsteam, out).print("steam library function not found: " #name "\n"); \
}
bind(g_steam_handle, SteamAPI_Init);
bind(g_steam_handle, SteamAPI_Shutdown);
// TODO: can we remove this initialization of the Steam API once we move to dfhooks?
if (!g_SteamAPI_Init || !g_SteamAPI_Shutdown || !g_SteamAPI_Init()) {
DEBUG(dfsteam, out).print("steam detected but cannot be initialized\n");
return false;
}
bind(g_steam_handle, SteamInternal_FindOrCreateUserInterface);
bind(g_steam_handle, SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck);
#undef bind
DEBUG(dfsteam, out).print("steam library linked\n");
return true;
}
void DFSteam::cleanup() {
if (!g_steam_handle)
return;
if (g_SteamAPI_Shutdown)
g_SteamAPI_Shutdown();
ClosePlugin(g_steam_handle);
g_steam_handle = nullptr;
}
bool DFSteam::DFIsSteamRunningOnSteamDeck() {
if (!g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck)
return false;
if (!g_SteamInternal_FindOrCreateUserInterface)
return false;
void* SteamUtils = g_SteamInternal_FindOrCreateUserInterface(0, "SteamUtils010");
return g_SteamAPI_ISteamUtils_IsSteamRunningOnSteamDeck(SteamUtils);
}