Skip to content

Commit d3b60cc

Browse files
committed
linux: fix crash on tray Open/Settings and add Fusion style fallback
- Fix segfault when calling .first() on empty rootObjects() or topLevelWindows() lists in tray menu handlers - Add Fusion as fallback Qt Quick Controls style to prevent QML load failures when platform theme modules (e.g., kvantum) are not installed - Override QT_STYLE_OVERRIDE=kvantum to Fusion before QApplication init The Fusion style is built into Qt and available on all platforms (X11, Wayland, KDE, GNOME, etc.), ensuring the app works regardless of the user's theme configuration.
1 parent e4c4262 commit d3b60cc

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

linux/main.cpp

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -547,8 +547,12 @@ public slots:
547547
private slots:
548548
void onTrayIconActivated()
549549
{
550-
QQuickWindow *window = qobject_cast<QQuickWindow *>(
551-
QGuiApplication::topLevelWindows().constFirst());
550+
const auto windows = QGuiApplication::topLevelWindows();
551+
if (windows.isEmpty()) {
552+
loadMainModule();
553+
return;
554+
}
555+
QQuickWindow *window = qobject_cast<QQuickWindow *>(windows.constFirst());
552556
if (window)
553557
{
554558
window->show();
@@ -559,26 +563,26 @@ private slots:
559563

560564
void onOpenApp()
561565
{
566+
if (parent->rootObjects().isEmpty()) {
567+
loadMainModule();
568+
return;
569+
}
562570
QObject *rootObject = parent->rootObjects().first();
563571
if (rootObject) {
564572
QMetaObject::invokeMethod(rootObject, "reopen", Q_ARG(QVariant, "app"));
565573
}
566-
else
567-
{
568-
loadMainModule();
569-
}
570574
}
571575

572576
void onOpenSettings()
573577
{
578+
if (parent->rootObjects().isEmpty()) {
579+
loadMainModule();
580+
return;
581+
}
574582
QObject *rootObject = parent->rootObjects().first();
575583
if (rootObject) {
576584
QMetaObject::invokeMethod(rootObject, "reopen", Q_ARG(QVariant, "settings"));
577585
}
578-
else
579-
{
580-
loadMainModule();
581-
}
582586
}
583587

584588
void sendHandshake() {
@@ -1092,6 +1096,11 @@ private slots:
10921096
};
10931097

10941098
int main(int argc, char *argv[]) {
1099+
// Use Fusion style as fallback for missing theme modules
1100+
if (qgetenv("QT_STYLE_OVERRIDE").toLower() == "kvantum")
1101+
qputenv("QT_STYLE_OVERRIDE", "Fusion");
1102+
qputenv("QT_QUICK_CONTROLS_STYLE", "Fusion");
1103+
10951104
QApplication app(argc, argv);
10961105

10971106
// Handle CLI commands first (returns -1 if should continue to GUI)
@@ -1224,13 +1233,13 @@ int main(int argc, char *argv[]) {
12241233
// Handle reopen command
12251234
if (msg == "reopen") {
12261235
LOG_INFO("Reopening app window");
1227-
QObject *rootObject = engine.rootObjects().first();
1228-
if (rootObject) {
1229-
QMetaObject::invokeMethod(rootObject, "reopen", Q_ARG(QVariant, "app"));
1230-
}
1231-
else
1232-
{
1236+
if (engine.rootObjects().isEmpty()) {
12331237
trayApp->loadMainModule();
1238+
} else {
1239+
QObject *rootObject = engine.rootObjects().first();
1240+
if (rootObject) {
1241+
QMetaObject::invokeMethod(rootObject, "reopen", Q_ARG(QVariant, "app"));
1242+
}
12341243
}
12351244
}
12361245
else

0 commit comments

Comments
 (0)