From 777229f28f8f5de19376459e85b434576af8e010 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 31 Jul 2020 09:56:19 -0400 Subject: added startSafeThread() to get core dumps for threads other than the main thread added terminate handler --- src/main.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 46f2f0aa..f008896b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -127,9 +127,9 @@ bool bootstrap() return true; } -LPTOP_LEVEL_EXCEPTION_FILTER prevUnhandledExceptionFilter = nullptr; +thread_local LPTOP_LEVEL_EXCEPTION_FILTER prevUnhandledExceptionFilter = nullptr; -static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs) +LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionPtrs) { const std::wstring& dumpPath = OrganizerCore::crashDumpsPath(); int dumpRes = @@ -139,12 +139,33 @@ static LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *except else log::error("ModOrganizer has crashed, CreateMiniDump failed ({}, error {}).", dumpRes, GetLastError()); - if (prevUnhandledExceptionFilter) + if (prevUnhandledExceptionFilter && exceptionPtrs) return prevUnhandledExceptionFilter(exceptionPtrs); else return EXCEPTION_CONTINUE_SEARCH; } +void terminateHandler() noexcept +{ + __try + { + // force an exception to get a valid stack trace for this thread + *(int*)0 = 42; + } + __except + ( + MyUnhandledExceptionFilter(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER + ) + { + } +} + +void setUnhandledExceptionHandler() +{ + prevUnhandledExceptionFilter = SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); + std::set_terminate(terminateHandler); +} + // Parses the first parseArgCount arguments of the current process command line and returns // them in parsedArgs, the rest of the command line is returned untouched. LPCWSTR UntouchedCommandLineArguments(int parseArgCount, std::vector& parsedArgs) @@ -171,6 +192,7 @@ LPCWSTR UntouchedCommandLineArguments(int parseArgCount, std::vectorproperty("dataPath").toString() + "/logs/mo_interface.log"; -- cgit v1.3.1 From 6a1d57fe0c3d84f363cd687c7b6813eb947a6050 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Fri, 31 Jul 2020 10:01:00 -0400 Subject: fixed bad font scaling --- src/main.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index f008896b..08889018 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -905,9 +905,20 @@ int main(int argc, char *argv[]) if (!tempDir.exists()) tempDir.root().mkpath(tempDir.canonicalPath()); - //Should allow for better scaling of ui with higher resolution displays + + // qt 5.14 changed how fraction font scaling works; by default 125% is + // rounded to 100% and 150% is rounded to 200%, which doesn't make any sense + // + // force qt to use the exact scaling value by change the policy to + // PassThrough + // + QGuiApplication::setHighDpiScaleFactorRoundingPolicy( + Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); + + // MO is somewhat high dpi aware QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + if (argc >= 4) { std::vector arg; auto args = UntouchedCommandLineArguments(2, arg); -- cgit v1.3.1 From 64ba6cae1e6b74929d88de628bb2915cb9c6f2d2 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 1 Aug 2020 11:03:09 -0400 Subject: revert font scaling: - users report low quality splash screen - sticking with qt's default is better in the long run - can still use the environment variable revert network timer: - users report error in log every second - was a blind fix anyway, can't reliably reproduce it --- src/main.cpp | 13 +------------ src/nxmaccessmanager.cpp | 44 ++++---------------------------------------- src/nxmaccessmanager.h | 2 -- 3 files changed, 5 insertions(+), 54 deletions(-) (limited to 'src/main.cpp') diff --git a/src/main.cpp b/src/main.cpp index 08889018..f008896b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -905,20 +905,9 @@ int main(int argc, char *argv[]) if (!tempDir.exists()) tempDir.root().mkpath(tempDir.canonicalPath()); - - // qt 5.14 changed how fraction font scaling works; by default 125% is - // rounded to 100% and 150% is rounded to 200%, which doesn't make any sense - // - // force qt to use the exact scaling value by change the policy to - // PassThrough - // - QGuiApplication::setHighDpiScaleFactorRoundingPolicy( - Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); - - // MO is somewhat high dpi aware + //Should allow for better scaling of ui with higher resolution displays QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - if (argc >= 4) { std::vector arg; auto args = UntouchedCommandLineArguments(2, arg); diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 9fe00f88..2fe676ba 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -772,46 +772,10 @@ NXMAccessManager::NXMAccessManager(QObject *parent, const QString &moVersion) setCookieJar(new PersistentCookieJar(QDir::fromNativeSeparators( Settings::instance().paths().cache() + "/nexus_cookies.dat"))); - networkAccessibleFix(); -} - -void NXMAccessManager::networkAccessibleFix() -{ - // Qt 5.14 seems to have introduced a regression with network accessibility - // where some users say MO can't access the network at all - // - // some users use a vpn, one other had a dns resolver - // - // it looks like networkAccessible() is sometimes set to NotAccessible, - // which prevents all network requests from even reaching the OS - // - // there are some events that seem like they should be fired, like - // QNetworkAccessManager::networkAccessibleChanged, but they're not - // - // the only solution that seems to kinda work is just to start a timer, - // check when networkAccessible() is changed to NotAccessible and revert it - // to UnknownAccessibility - // - // see also: - // https://github.com/ModOrganizer2/modorganizer/issues/1173 - // https://bugreports.qt.io/browse/QTBUG-55180 - - // check first - if (networkAccessible() == QNetworkAccessManager::NotAccessible) { - log::debug("network is not accessible, forcing to unknown"); - setNetworkAccessible(QNetworkAccessManager::UnknownAccessibility); - } - - auto* t = new QTimer(this); - - connect(t, &QTimer::timeout, [&]{ - if (networkAccessible() == QNetworkAccessManager::NotAccessible) { - log::debug("network is not accessible, forcing to unknown"); - setNetworkAccessible(QNetworkAccessManager::UnknownAccessibility); - } - }); - - t->start(std::chrono::seconds(1)); + if (networkAccessible() == QNetworkAccessManager::UnknownAccessibility) { + // why is this necessary all of a sudden? + setNetworkAccessible(QNetworkAccessManager::Accessible); + } } void NXMAccessManager::setTopLevelWidget(QWidget* w) diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index f200f595..6a45d880 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -269,8 +269,6 @@ private: NexusKeyValidator m_validator; States m_validationState; - void networkAccessibleFix(); - void startValidationCheck(const QString& key); void onValidatorFinished( -- cgit v1.3.1