automatic safe mode!

to-do: test on Windows...
This commit is contained in:
tildearrow 2023-10-16 14:55:01 -05:00
parent 1cf519ce17
commit e633550647
6 changed files with 86 additions and 4 deletions

View file

@ -3634,7 +3634,8 @@ bool DivEngine::deinitAudioBackend(bool dueToSwitchMaster) {
return true; return true;
} }
void DivEngine::preInit() { bool DivEngine::preInit(bool noSafeMode) {
bool wantSafe=false;
// register systems // register systems
if (!systemsRegistered) registerSystems(); if (!systemsRegistered) registerSystems();
@ -3642,6 +3643,13 @@ void DivEngine::preInit() {
initConfDir(); initConfDir();
logD("config path: %s",configPath.c_str()); logD("config path: %s",configPath.c_str());
if (!noSafeMode) {
String safeModePath=configPath+DIR_SEPARATOR_STR+"safemode";
if (touchFile(safeModePath.c_str())==-EEXIST) {
wantSafe=true;
}
}
String logPath=configPath+DIR_SEPARATOR_STR+"furnace.log"; String logPath=configPath+DIR_SEPARATOR_STR+"furnace.log";
startLogFile(logPath.c_str()); startLogFile(logPath.c_str());
@ -3655,6 +3663,17 @@ void DivEngine::preInit() {
SDL_SetHint("SDL_HINT_AUDIODRIVER",audioDriver.c_str()); SDL_SetHint("SDL_HINT_AUDIODRIVER",audioDriver.c_str());
} }
#endif #endif
if (wantSafe) {
logW("requesting safe mode.");
}
return wantSafe;
}
void DivEngine::everythingOK() {
String safeModePath=configPath+DIR_SEPARATOR_STR+"safemode";
deleteFile(safeModePath.c_str());
} }
bool DivEngine::init() { bool DivEngine::init() {

View file

@ -1196,12 +1196,15 @@ class DivEngine {
// quit dispatch // quit dispatch
void quitDispatch(); void quitDispatch();
// pre-initialize the engine. // pre-initialize the engine. returns whether Furnace should run in safe mode.
void preInit(); bool preInit(bool noSafeMode=true);
// initialize the engine. // initialize the engine.
bool init(); bool init();
// confirm that the engine is running (delete safe mode file).
void everythingOK();
// terminate the engine. // terminate the engine.
bool quit(); bool quit();

View file

@ -25,6 +25,7 @@
#include <shlwapi.h> #include <shlwapi.h>
#else #else
#include <unistd.h> #include <unistd.h>
#include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <sys/stat.h> #include <sys/stat.h>
#endif #endif
@ -100,3 +101,26 @@ bool makeDir(const char* path) {
return (mkdir(path,0755)==0); return (mkdir(path,0755)==0);
#endif #endif
} }
int touchFile(const char* path) {
#ifdef _WIN32
HANDLE h=CreateFileW(utf8To16(path).c_str(),GENERIC_WRITE,FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_TEMPORARY,NULL);
if (h==INVALID_HANDLE_VALUE) {
switch (GetLastError()) {
case ERROR_FILE_EXISTS:
return -EEXIST;
break;
}
return -EPERM;
}
if (CloseHandle(h)==0) {
return -EBADF;
}
return 0;
#else
int fd=open(path,O_CREAT|O_WRONLY|O_TRUNC|O_EXCL,0666);
if (fd<0) return -errno;
close(fd);
return 0;
#endif
}

View file

@ -28,5 +28,6 @@ bool deleteFile(const char* path);
int fileExists(const char* path); int fileExists(const char* path);
bool dirExists(const char* what); bool dirExists(const char* what);
bool makeDir(const char* path); bool makeDir(const char* path);
int touchFile(const char* path);
#endif #endif

View file

@ -3455,6 +3455,11 @@ bool FurnaceGUI::loop() {
logD("key input: main thread"); logD("key input: main thread");
} }
if (safeMode) {
showError("Furnace has been started in Safe Mode.\nthis means that:\n\n- software rendering is being used\n- audio output may not work\n- font loading is disabled\n\ncheck any settings which may have made Furnace start up in this mode.\nfont loading is one of these.");
settingsOpen=true;
}
while (!quit) { while (!quit) {
SDL_Event ev; SDL_Event ev;
if (e->isPlaying()) { if (e->isPlaying()) {
@ -6244,6 +6249,7 @@ bool FurnaceGUI::loop() {
if (mustClear) { if (mustClear) {
rend->clear(ImVec4(0,0,0,0)); rend->clear(ImVec4(0,0,0,0));
mustClear--; mustClear--;
if (mustClear==0) e->everythingOK();
} else { } else {
if (initialScreenWipe>0.0f && !settings.disableFadeIn) { if (initialScreenWipe>0.0f && !settings.disableFadeIn) {
WAKE_UP; WAKE_UP;

View file

@ -131,14 +131,24 @@ TAParamResult pConsole(String val) {
} }
TAParamResult pSafeMode(String val) { TAParamResult pSafeMode(String val) {
#ifdef HAVE_GUI
safeMode=true; safeMode=true;
return TA_PARAM_SUCCESS; return TA_PARAM_SUCCESS;
#else
logE("Furnace was compiled without the GUI. safe mode is pointless.");
return TA_PARAM_ERROR;
#endif
} }
TAParamResult pSafeModeAudio(String val) { TAParamResult pSafeModeAudio(String val) {
#ifdef HAVE_GUI
safeMode=true; safeMode=true;
safeModeWithAudio=true; safeModeWithAudio=true;
return TA_PARAM_SUCCESS; return TA_PARAM_SUCCESS;
#else
logE("Furnace was compiled without the GUI. safe mode is pointless.");
return TA_PARAM_ERROR;
#endif
} }
TAParamResult pBinary(String val) { TAParamResult pBinary(String val) {
@ -515,7 +525,24 @@ int main(int argc, char** argv) {
return 1; return 1;
} }
e.preInit(); #ifdef HAVE_GUI
if (e.preInit(false)) {
if (consoleMode || benchMode || outName!="" || vgmOutName!="" || cmdOutName!="") {
logW("engine wants safe mode, but Furnace GUI is not going to start.");
} else {
safeMode=true;
}
}
#else
if (e.preInit(true)) {
logW("engine wants safe mode, but Furnace GUI is not available.");
}
#endif
if (safeMode && (consoleMode || benchMode || outName!="" || vgmOutName!="" || cmdOutName!="")) {
logE("you can't use safe mode and console/export mode together.");
return 0;
}
if (safeMode && !safeModeWithAudio) { if (safeMode && !safeModeWithAudio) {
e.setAudio(DIV_AUDIO_DUMMY); e.setAudio(DIV_AUDIO_DUMMY);
@ -684,6 +711,7 @@ int main(int argc, char** argv) {
if (!g.init()) { if (!g.init()) {
reportError(g.getLastError()); reportError(g.getLastError());
finishLogFile(); finishLogFile();
e.everythingOK();
return 1; return 1;
} }
@ -720,5 +748,6 @@ int main(int argc, char** argv) {
CoUninitialize(); CoUninitialize();
} }
#endif #endif
e.everythingOK();
return 0; return 0;
} }