diff --git a/GUI/mainwindow.cpp b/GUI/mainwindow.cpp index 275cfba..3bc8289 100644 --- a/GUI/mainwindow.cpp +++ b/GUI/mainwindow.cpp @@ -33,6 +33,7 @@ extern const char* SELECT_PROCESS_INFO; extern const char* FROM_COMPUTER; extern const char* PROCESSES; extern const char* CODE_INFODUMP; +extern const char* FAILED_TO_CREATE_CONFIG_FILE; extern const char* HOOK_SEARCH_UNSTABLE_WARNING; extern const char* SEARCH_CJK; extern const char* SEARCH_PATTERN; @@ -107,7 +108,7 @@ namespace void (*AddSentence)(int64_t, const wchar_t*) = [](int64_t number, const wchar_t* sentence) { // pointer from Host::GetThread may not stay valid unless on main thread - QMetaObject::invokeMethod(This, [number, sentence = std::wstring(sentence)]{ if (TextThread* thread = Host::GetThread(number)) thread->AddSentence(sentence); }); + QMetaObject::invokeMethod(This, [number, sentence = std::wstring(sentence)] { if (TextThread* thread = Host::GetThread(number)) thread->AddSentence(sentence); }); }; DWORD (*GetSelectedProcessId)() = [] { return selectedProcessId.load(); }; @@ -198,7 +199,8 @@ namespace { std::wstring configFile = std::wstring(processName.value()).replace(last, std::wstring::npos, GAME_CONFIG_FILE); if (!std::filesystem::exists(configFile)) QTextFile(S(configFile), QFile::WriteOnly).write("see https://github.com/Artikash/Textractor/wiki/Game-configuration-file"); - _wspawnlp(_P_DETACH, L"notepad", L"notepad", configFile.c_str(), NULL); + if (std::filesystem::exists(configFile)) _wspawnlp(_P_DETACH, L"notepad", L"notepad", configFile.c_str(), NULL); + else QMessageBox::critical(This, GAME_CONFIG, QString(FAILED_TO_CREATE_CONFIG_FILE).arg(S(configFile))); } } diff --git a/include/qtcommon.h b/include/qtcommon.h index a4fa3cb..f80b133 100644 --- a/include/qtcommon.h +++ b/include/qtcommon.h @@ -31,4 +31,4 @@ inline QString S(const std::string& s) { return QString::fromStdString(s); } inline QString S(const std::wstring& s) { return QString::fromStdWString(s); } // TODO: allow paired surrogates inline void sanitize(QString& s) { s.chop(std::distance(std::remove_if(s.begin(), s.end(), [](QChar ch) { return ch.isSurrogate(); }), s.end())); } -inline QString sanitize(QString&& s) { QString result; for (auto ch : s) if (!ch.isSurrogate()) result.push_back(ch); return result; } +inline QString sanitize(QString&& s) { sanitize(s); return s; } diff --git a/text.cpp b/text.cpp index a42a5d1..ea08b55 100644 --- a/text.cpp +++ b/text.cpp @@ -64,6 +64,7 @@ const char* INVALID_EXTENSION = u8"%1 is an invalid extension"; const char* CONFIRM_EXTENSION_OVERWRITE = u8"Another version of this extension already exists, do you want to delete and overwrite it?"; const char* EXTENSION_WRITE_ERROR = u8"Failed to save extension"; const char* USE_JP_LOCALE = u8"Emulate japanese locale?"; +const char* FAILED_TO_CREATE_CONFIG_FILE = u8"Failed to create config file \"%1\""; const char* HOOK_SEARCH_UNSTABLE_WARNING = u8"Searching for hooks is unstable! Be prepared for your game to crash!"; const char* SEARCH_CJK = u8"Search for Chinese/Japanese/Korean"; const char* SEARCH_PATTERN = u8"Search pattern (hex byte array)";