From 661127fb91e00c83ae3fa9691b09c3c1dcb801e2 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 11:48:44 -0400 Subject: [PATCH 1/7] Add more logging when application fails to start --- launcher/src/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index fa8864e..52913af 100755 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -16,13 +16,12 @@ #define WIN32_LEAN_AND_MEAN #include - -#include "umbra_log.h" #endif -#include "umbra-version.h" #include "launchercore.h" #include "logger.h" +#include "umbra-version.h" +#include "umbra_log.h" #include "utility.h" using namespace Qt::StringLiterals; @@ -57,6 +56,7 @@ int main(int argc, char *argv[]) const KDSingleApplication singleApplication; if (!singleApplication.isPrimaryInstance()) { + qCWarning(UMBRA_LOG) << "Astra is already running"; return 0; } @@ -121,6 +121,7 @@ int main(int argc, char *argv[]) engine.loadFromModule(QStringLiteral("zone.xiv.umbra"), QStringLiteral("Main")); if (engine.rootObjects().isEmpty()) { + qCWarning(UMBRA_LOG) << "Failed to start application due to QML failing to load!"; return -1; } From d6b19304e17d9d89e42701e2694be0be0a171326 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 11:49:52 -0400 Subject: [PATCH 2/7] Replace uncategorized logging with categorized ones --- launcher/src/gamepatcher.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/launcher/src/gamepatcher.cpp b/launcher/src/gamepatcher.cpp index 1fdfe39..b5c02ae 100644 --- a/launcher/src/gamepatcher.cpp +++ b/launcher/src/gamepatcher.cpp @@ -7,6 +7,7 @@ #include "accountconfig.h" #include "profile.h" #include "profileconfig.h" +#include "umbra_log.h" #include #include @@ -22,14 +23,14 @@ QString patchGameExecutable(const Profile &profile) if (!QFile::exists(backupExePath)) { if (!QFile::copy(originalGameExecutable, backupExePath)) { - qWarning() << "Failed to copy original game EXE for patching!"; + qCWarning(UMBRA_LOG) << "Failed to copy original game EXE for patching!"; return i18n("Failed to copy original game EXE for patching!"); } } QFile originalExe(backupExePath); if (!originalExe.open(QIODevice::ReadOnly)) { - qWarning() << "Failed to patch:" << originalExe.errorString(); + qCWarning(UMBRA_LOG) << "Failed to patch:" << originalExe.errorString(); return i18n("Failed to patch: %1").arg(originalExe.errorString()); } @@ -53,7 +54,7 @@ QString patchGameExecutable(const Profile &profile) QFile newExe(originalGameExecutable); if (!newExe.open(QIODevice::WriteOnly)) { - qWarning() << "Failed to patch:" << newExe.errorString(); + qCWarning(UMBRA_LOG) << "Failed to patch:" << newExe.errorString(); return i18n("Failed to patch: %1").arg(newExe.errorString()); } newExe.write(exeData); From 1d101a65786e8262510f928eed76521410755b3f Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 11:54:22 -0400 Subject: [PATCH 3/7] Use AppStream metadata to construct KAboutData Which de-duplicates a lot of information! --- CMakeLists.txt | 3 ++- launcher/src/main.cpp | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61a4933..0dca333 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,9 +58,10 @@ if (BUILD_TESTING) add_subdirectory(autotests) endif() +install(FILES zone.xiv.umbra.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) + if (NOT WIN32) install(FILES zone.xiv.umbra.desktop DESTINATION ${KDE_INSTALL_APPDIR}) - install(FILES zone.xiv.umbra.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) install(FILES zone.xiv.umbra.svg DESTINATION ${KDE_INSTALL_FULL_ICONDIR}/hicolor/scalable/apps) ecm_qt_install_logging_categories( diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 52913af..9dc5e14 100755 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -7,6 +7,7 @@ #include #include #include // NOTE: do not remove this, if your IDE suggests to do so +#include #include #include #include @@ -66,13 +67,18 @@ int main(int argc, char *argv[]) } KLocalizedString::setApplicationDomain("umbra"); - - KAboutData about(QStringLiteral("umbra"), - i18n("Umbra"), - QStringLiteral(UMBRA_VERSION_STRING), - i18n("FFXIV 1.x Launcher"), - KAboutLicense::GPL_V3, - i18n("© 2026 Joshua Goins")); + // KAboutData doesn't set organizationName yet + QGuiApplication::setOrganizationName("xiv.zone"_L1); + // This needs to be set before fromAppStreamForApplication can be used, so don't remove this! + QGuiApplication::setDesktopFileName(u"zone.xiv.umbra"_s); + + auto about = KAboutData::fromAppStreamForApplication(); + about.setVersion(QByteArrayLiteral(UMBRA_VERSION_STRING)); + // Works around bug fixed with https://invent.kde.org/frameworks/kcoreaddons/-/merge_requests/582 +#if KCOREADDONS_VERSION < QT_VERSION_CHECK(6, 28, 0) + about.setComponentName(QStringLiteral("umbra")); +#endif + about.setCopyrightStatement(i18n("© 2026 Joshua Goins")); about.setOtherText( i18n("FINAL FANTASY, FINAL FANTASY XIV, FFXIV, SQUARE ENIX, and the SQUARE ENIX logo are registered trademarks or " "trademarks of Square Enix Holdings Co., Ltd.")); @@ -81,19 +87,14 @@ int main(int argc, char *argv[]) QStringLiteral("josh@redstrate.com"), QStringLiteral("https://redstrate.com/"), QUrl(QStringLiteral("https://redstrate.com/rss-image.png"))); - about.setHomepage(QStringLiteral("https://xiv.zone/umbra")); about.addComponent(QStringLiteral("KDSingleApplication"), i18n("Helper class for single-instance policy applications."), QStringLiteral("1.1.1"), QStringLiteral("https://github.com/KDAB/KDSingleApplication"), KAboutLicense::MIT); - about.setDesktopFileName(QStringLiteral("zone.xiv.umbra")); - about.setBugAddress(QByteArrayLiteral("https://github.com/redstrate/umbra/issues")); - about.setComponentName(QStringLiteral("umbra")); - about.setProgramLogo(QStringLiteral("zone.xiv.umbra")); - about.setOrganizationDomain(QByteArrayLiteral("xiv.zone")); KAboutData::setApplicationData(about); + QGuiApplication::setWindowIcon(QIcon::fromTheme(u"zone.xiv.umbra"_s)); initializeLogging(); From b64818642430cefb621d725343ae63d1c29a0099 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 12:09:03 -0400 Subject: [PATCH 4/7] AppStream metadata fix-ups --- zone.xiv.umbra.appdata.xml | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/zone.xiv.umbra.appdata.xml b/zone.xiv.umbra.appdata.xml index fd68bbe..467164f 100644 --- a/zone.xiv.umbra.appdata.xml +++ b/zone.xiv.umbra.appdata.xml @@ -7,9 +7,9 @@ zone.xiv.umbra CC0-1.0 Umbra - Linux FFXIV Launcher + Unofficial FFXIV launcher for 1.x -

A unofficial FFXIV launcher for 1.x clients.

+

Linux FFXIV launcher that supports profiles, multiple accounts!

Game @@ -19,9 +19,8 @@ ffxiv ff14 - https://xiv.zone/umbra - https://github.com/redstrate/umbra/issues - https://xiv.zone/umbra/faq + https://xiv.zone/software/umbra + https://github.com/redstrate/umbra/issues/new https://redstrate.com/contact https://github.com/redstrate/umbra zone.xiv.umbra.desktop @@ -45,10 +44,27 @@ touch GPL-3.0 - redstrate + + redstrate + https://xiv.zone/umbra/main-screenshot.png + + #8d3535 + #8d3535 + + + intense + moderate + mild + mild + mild + mild + moderate + mild + moderate + From 61483507f7acfefbb5639126124665bdd0c90057 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 12:19:12 -0400 Subject: [PATCH 5/7] Add missing components and fix their versions We don't need to hardcode the KDSingleApplication version. --- launcher/src/main.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 9dc5e14..6448ad9 100755 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #ifdef Q_OS_WINDOWS @@ -87,9 +89,19 @@ int main(int argc, char *argv[]) QStringLiteral("josh@redstrate.com"), QStringLiteral("https://redstrate.com/"), QUrl(QStringLiteral("https://redstrate.com/rss-image.png"))); + about.addComponent(QStringLiteral("physis"), + i18n("Library for reading and writing FFXIV data."), + QString::fromLatin1(physis_get_physis_version()), + QStringLiteral("https://xiv.zone/physis"), + KAboutLicense::GPL_V3); + about.addComponent(QStringLiteral("libphysis"), + i18n("C/C++ bindings for Physis."), + QString::fromLatin1(physis_get_libphysis_version()), + QStringLiteral("https://github.com/redstrate/libphysis"), + KAboutLicense::GPL_V3); about.addComponent(QStringLiteral("KDSingleApplication"), i18n("Helper class for single-instance policy applications."), - QStringLiteral("1.1.1"), + QString::fromLatin1(KDSINGLEAPPLICATION_VERSION_STRING), QStringLiteral("https://github.com/KDAB/KDSingleApplication"), KAboutLicense::MIT); From 5c2edd91a9dbb2f35ae2be1e817ca16da2a56134 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 12:32:40 -0400 Subject: [PATCH 6/7] Fix icon not showing up inside application on Windows This mostly affects the Settings pages. --- CMakeLists.txt | 17 +++++++---------- launcher/CMakeLists.txt | 10 ---------- launcher/src/main.cpp | 2 +- launcher/ui/Setup/SetupPage.qml | 8 ++++---- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0dca333..ab13db2 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,17 +59,14 @@ if (BUILD_TESTING) endif() install(FILES zone.xiv.umbra.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) +install(FILES zone.xiv.umbra.svg DESTINATION ${KDE_INSTALL_FULL_ICONDIR}/hicolor/scalable/apps) +install(FILES zone.xiv.umbra.desktop DESTINATION ${KDE_INSTALL_APPDIR}) -if (NOT WIN32) - install(FILES zone.xiv.umbra.desktop DESTINATION ${KDE_INSTALL_APPDIR}) - install(FILES zone.xiv.umbra.svg DESTINATION ${KDE_INSTALL_FULL_ICONDIR}/hicolor/scalable/apps) - - ecm_qt_install_logging_categories( - EXPORT UMBRA - FILE umbra.categories - SORT DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR} - ) -endif() +ecm_qt_install_logging_categories( + EXPORT UMBRA + FILE umbra.categories + SORT DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR} +) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8a1b5b3..8fb6478 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -127,16 +127,6 @@ qt_target_qml_sources(umbra_static ui/Main.qml ) -set_source_files_properties(../zone.xiv.umbra.svg PROPERTIES - QT_RESOURCE_ALIAS /zone.xiv.umbra.svg -) - -qt_target_qml_sources(umbra_static - PREFIX / - RESOURCES - ../zone.xiv.umbra.svg -) - target_link_libraries(umbra PRIVATE umbra_static umbra_staticplugin diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 6448ad9..7640465 100755 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -59,7 +59,7 @@ int main(int argc, char *argv[]) const KDSingleApplication singleApplication; if (!singleApplication.isPrimaryInstance()) { - qCWarning(UMBRA_LOG) << "Astra is already running"; + qCWarning(UMBRA_LOG) << "Umbra is already running"; return 0; } diff --git a/launcher/ui/Setup/SetupPage.qml b/launcher/ui/Setup/SetupPage.qml index bea7f84..8bc6d61 100644 --- a/launcher/ui/Setup/SetupPage.qml +++ b/launcher/ui/Setup/SetupPage.qml @@ -34,12 +34,12 @@ FormCard.FormCardPage { } } - Image { - source: "qrc:/zone.xiv.umbra.svg" + Kirigami.Icon { + source: "zone.xiv.umbra" - fillMode: Image.PreserveAspectFit visible: !LauncherCore.profileManager.hasAnyExistingInstallations() - + Layout.preferredWidth: Math.round(Kirigami.Units.iconSizes.huge * 1.5) + Layout.preferredHeight: Math.round(Kirigami.Units.iconSizes.huge * 1.5) Layout.fillWidth: true Layout.fillHeight: true Layout.margins: Kirigami.Units.largeSpacing * 3 From 95c178cde8ad5db86818d3147955ceca022209d6 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 20 Jun 2026 14:04:51 -0400 Subject: [PATCH 7/7] Add an easy way to enable verbose logging and look at logs This is especially useful for Windows users where this is much harder to figure out how to set up. --- launcher/CMakeLists.txt | 1 + launcher/config.kcfg | 3 ++ launcher/src/launchercore.cpp | 4 ++ launcher/src/main.cpp | 2 - launcher/ui/Settings/SettingsPage.qml | 6 +++ launcher/ui/Settings/TroubleshootingPage.qml | 47 ++++++++++++++++++++ 6 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 launcher/ui/Settings/TroubleshootingPage.qml diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8fb6478..772778e 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -121,6 +121,7 @@ qt_target_qml_sources(umbra_static ui/Settings/ProfileSettings.qml ui/Settings/ProfilesPage.qml ui/Settings/SettingsPage.qml + ui/Settings/TroubleshootingPage.qml ui/Setup/AccountSetup.qml ui/Setup/AddSquareEnix.qml ui/Setup/SetupPage.qml diff --git a/launcher/config.kcfg b/launcher/config.kcfg index 6a59627..33a8fe2 100644 --- a/launcher/config.kcfg +++ b/launcher/config.kcfg @@ -19,6 +19,9 @@ SPDX-License-Identifier: CC0-1.0 + + false + diff --git a/launcher/src/launchercore.cpp b/launcher/src/launchercore.cpp index 353be6a..a5ceacb 100755 --- a/launcher/src/launchercore.cpp +++ b/launcher/src/launchercore.cpp @@ -30,6 +30,10 @@ LauncherCore::LauncherCore() : QObject() { m_config = new Config(KSharedConfig::openConfig(QStringLiteral("umbrarc"), KConfig::SimpleConfig, QStandardPaths::AppConfigLocation), this); + if (config()->verboseLogging()) { + QLoggingCategory::setFilterRules(QStringLiteral("zone.xiv.umbra*=true")); + } + m_mgr = new QNetworkAccessManager(this); m_squareEnixLogin = new SquareEnixLogin(*this, this); m_profileManager = new ProfileManager(this); diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 7640465..0fcb9c0 100755 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -69,8 +69,6 @@ int main(int argc, char *argv[]) } KLocalizedString::setApplicationDomain("umbra"); - // KAboutData doesn't set organizationName yet - QGuiApplication::setOrganizationName("xiv.zone"_L1); // This needs to be set before fromAppStreamForApplication can be used, so don't remove this! QGuiApplication::setDesktopFileName(u"zone.xiv.umbra"_s); diff --git a/launcher/ui/Settings/SettingsPage.qml b/launcher/ui/Settings/SettingsPage.qml index 3c8be62..f31fecc 100644 --- a/launcher/ui/Settings/SettingsPage.qml +++ b/launcher/ui/Settings/SettingsPage.qml @@ -42,6 +42,12 @@ KirigamiSettings.ConfigurationView { page: () => Qt.createComponent("zone.xiv.umbra", "DeveloperSettings") visible: LauncherCore.config.showDevTools }, + KirigamiSettings.ConfigurationModule { + moduleId: "troubleshooting" + text: i18n("Troubleshooting") + icon.name: "error-symbolic" + page: () => Qt.createComponent("zone.xiv.umbra", "TroubleshootingPage") + }, KirigamiSettings.ConfigurationModule { moduleId: "about" text: i18n("About Umbra") diff --git a/launcher/ui/Settings/TroubleshootingPage.qml b/launcher/ui/Settings/TroubleshootingPage.qml new file mode 100644 index 0000000..fff43f8 --- /dev/null +++ b/launcher/ui/Settings/TroubleshootingPage.qml @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2026 Joshua Goins +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtCore +import QtQuick +import QtQuick.Layouts + +import org.kde.kirigami as Kirigami +import org.kde.kirigamiaddons.formcard as FormCard + +import zone.xiv.umbra + +import "../Components" + +FormCard.FormCardPage { + id: page + + title: i18nc("@title:window", "Troubleshooting") + + FormCard.FormCard { + Layout.topMargin: Kirigami.Units.largeSpacing * 4 + + FormCard.FormCheckDelegate { + id: verboseLoggingDelegate + + text: i18n("Enable Verbose Logging") + description: i18n("Requires a restart of Umbra to take effect.") + checked: LauncherCore.config.verboseLogging + onCheckedChanged: { + LauncherCore.config.verboseLogging = checked; + LauncherCore.config.save(); + } + } + + FormCard.FormDelegateSeparator { + above: verboseLoggingDelegate + below: logsFolderDelegate + } + + FormCard.FormButtonDelegate { + id: logsFolderDelegate + + text: i18nc("@action:button", "Open Logs Folder") + onClicked: Qt.openUrlExternally(StandardPaths.writableLocation(StandardPaths.AppDataLocation) + "/log") + } + } +}