[LyX/master] Another take on exit-crash on macOS Tahoe.
Pavel Sanda
sanda at lyx.org
Mon Jun 22 21:21:40 UTC 2026
commit be0260ba78ec533b4049530dd78ffca582030315
Author: Pavel Sanda <sanda at lyx.org>
Date: Mon Jun 22 23:17:47 2026 +0200
Another take on exit-crash on macOS Tahoe.
Reverts 8ed3745da456e, which fixes the crash but introduces
new regression (session information not stored on exit).
Claude's theory why the original crash occurs:
close() is invoked synchronously from inside a QAction slot - Qt has to
tear down NSWindow / NSMenu state while the QAction-triggered invocation is
still on the stack. macOS Tahoe / Qt 6 might not tolerate that anymore.
QTimer::singleShot will defer to the next event-loop iteration.
https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg226398.html
Assisted-by: Claude Opus 4.7
---
src/frontends/qt/GuiApplication.cpp | 17 +++++------------
src/frontends/qt/GuiView.h | 4 ++--
2 files changed, 7 insertions(+), 14 deletions(-)
diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp
index cb68a0ba6d..532388a888 100644
--- a/src/frontends/qt/GuiApplication.cpp
+++ b/src/frontends/qt/GuiApplication.cpp
@@ -103,9 +103,6 @@
#include <QMenuBar>
#include <QMimeData>
#include <QObject>
-#if defined(Q_OS_MACOS) && QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
-#include <QOperatingSystemVersion>
-#endif
#include <QPainter>
#include <QPixmap>
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
@@ -1794,16 +1791,12 @@ void GuiApplication::dispatch(FuncRequest const & cmd, DispatchResult & dr)
break;
case LFUN_LYX_QUIT:
- if (current_view_) {
+ if (current_view_)
current_view_->message(from_utf8(N_("Exiting.")));
- if (!current_view_->closeBufferAll()) {
- current_view_->message(from_utf8(N_("Cancelled")));
- break;
- }
- }
- // quitting is triggered by the gui code
- // (leaving the event loop).
- QApplication::quit();
+ QTimer::singleShot(0, this, [this]() {
+ if (closeAllViews())
+ quit();
+ });
break;
case LFUN_SCREEN_FONT_UPDATE: {
diff --git a/src/frontends/qt/GuiView.h b/src/frontends/qt/GuiView.h
index 727cd4ccec..a82447d831 100644
--- a/src/frontends/qt/GuiView.h
+++ b/src/frontends/qt/GuiView.h
@@ -165,8 +165,6 @@ public:
bool closeWorkArea(GuiWorkArea * wa);
/// closes the buffer
bool closeBuffer(Buffer & buf);
- /// Close all document buffers.
- bool closeBufferAll();
///
void openDocuments(std::string const & filename, int origin);
@@ -328,6 +326,8 @@ private:
void openChildDocument(std::string const & filename);
/// Close current document buffer.
bool closeBuffer();
+ /// Close all document buffers.
+ bool closeBufferAll();
///
TabWorkArea * addTabWorkArea();
More information about the lyx-cvs
mailing list