fix(notifications): defer Loader activation to prevent re-entrant incubation SIGSEGV

This commit is contained in:
Lemmy
2026-03-10 09:13:57 -04:00
parent d4d173ebbc
commit 835b12ed0f
+21 -3
View File
@@ -28,8 +28,13 @@ Variants {
property ListModel notificationModel: NotificationService.activeList
// Always create window (but with 0x0 dimensions when no notifications)
active: notificationModel.count > 0 || delayTimer.running
// Deferred activation to prevent re-entrant QML incubation crash.
// Direct binding to notificationModel.count would activate the Loader
// synchronously during ListModel.insert(), causing nested incubation
// (Loader + inner Repeater both processing the model) which crashes
// the V4 engine in QV4::Object::insertMember.
property bool shouldBeActive: false
active: shouldBeActive || delayTimer.running
// Keep loader active briefly after last notification to allow animations to complete
Timer {
@@ -38,10 +43,23 @@ Variants {
repeat: false
}
// Deferred activation timer - activates Loader on next event loop iteration
Timer {
id: activationTimer
interval: 0
repeat: false
onTriggered: root.shouldBeActive = true
}
Connections {
target: notificationModel
function onCountChanged() {
if (notificationModel.count === 0 && root.active) {
if (notificationModel.count > 0) {
if (!root.shouldBeActive) {
activationTimer.restart();
}
} else if (root.shouldBeActive) {
root.shouldBeActive = false;
delayTimer.restart();
}
}