From 8d76354647024abeb46b504521b791243344ded5 Mon Sep 17 00:00:00 2001 From: scorpio810 Date: Sun, 21 Jun 2026 09:58:16 +0000 Subject: [PATCH] macOS: fix QFileOpenEvent routing for .qet/.elmt/.titleblock double-click Root cause (see issue #218 discussion): - QETApp::eventFiltrer (Q_OS_DARWIN) was correct in intent but never actually installed as an event filter anywhere, and its name didn't match the QObject::eventFilter virtual signature, so even if it had been installed it would never have been invoked as an override. Confirmed dead code. - main.cpp instead routed Finder's QFileOpenEvent through MacOSXOpenEvent -> SingleApplication::sendMessage(), which is the secondary-to-primary IPC channel. Called from within the primary instance itself, sendMessage() fails silently and the file path is dropped, which is exactly what double-click does (Finder doesn't spawn a secondary process, the running instance receives the FileOpen event directly). - openFiles() takes a QETArguments, not a QStringList. The dead code's openFiles(QStringList() << filename) only worked via an untested implicit QStringList -> QList -> QETArguments conversion chain. Fix: - Rename eventFiltrer -> eventFilter (qetapp.h/.cpp) so it's a proper override of QObject::eventFilter, and make it public so main.cpp can install it on QApplication. - Build the QETArguments explicitly instead of relying on implicit conversion. - main.cpp: drop MacOSXOpenEvent entirely (include + instantiation), install qetapp as the Q_OS_MACOS event filter on app right after QETApp qetapp; is constructed and before app.exec(). No race window: the event loop hasn't started, so no QFileOpenEvent can be delivered before the filter is installed. QETArguments::handleFileArgument() already sorts files by extension (.elmt, titleblock, else project) and openFiles() already fans out to openProjectFiles()/openElementFiles()/openTitleBlockTemplateFiles() accordingly, so this single fix covers .qet, .elmt and .titleblock double-click/drag-to-dock on macOS, not just .qet. SingleApplication's sendMessage/receivedMessage flow (used for CLI args on all platforms) is untouched; this only touches the Q_OS_MACOS block, so there is no behavior change on Windows/Linux. Follow-up (not included here): the macOS Info.plist (misc/Info.plist) has an empty CFBundleShortVersionString, which may affect macOS's willingness to retain file associations across app updates. --- sources/main.cpp | 12 +++++++----- sources/qetapp.cpp | 7 +++++-- sources/qetapp.h | 5 ++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/sources/main.cpp b/sources/main.cpp index ee70a90ac..940aa4e16 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -21,7 +21,6 @@ #include "qetapp.h" #include "qetproject.h" #include "singleapplication.h" -#include "utils/macosxopenevent.h" #include "utils/qetsettings.h" #include @@ -217,10 +216,6 @@ QGuiApplication::setHighDpiScaleFactorRoundingPolicy(QetSettings::hdpiScaleFacto SingleApplication app(argc, argv, true); #ifdef Q_OS_MACOS - //Handle the opening of QET when user double click on a .qet .elmt .tbt file - //or drop these same files to the QET icon of the dock - MacOSXOpenEvent open_event; - app.installEventFilter(&open_event); app.setStyle(QStyleFactory::create("Fusion")); #endif @@ -238,6 +233,13 @@ QGuiApplication::setHighDpiScaleFactorRoundingPolicy(QetSettings::hdpiScaleFacto QETApp qetapp; QETApp::instance()->installEventFilter(&qetapp); +#ifdef Q_OS_MACOS + //Handle the opening of QET when user double click on a .qet .elmt .tbt file + //or drop these same files to the QET icon of the dock. + //Installed here (after QETApp is fully constructed, before app.exec()) + //so there is no race: no QFileOpenEvent can be delivered before this point. + app.installEventFilter(&qetapp); +#endif QObject::connect(&app, &SingleApplication::receivedMessage, &qetapp, &QETApp::receiveMessage); diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp index 3b95551e5..140e1e023 100644 --- a/sources/qetapp.cpp +++ b/sources/qetapp.cpp @@ -2625,14 +2625,17 @@ void QETApp::fetchWindowStats( #ifdef Q_OS_DARWIN /** Gere les evenements, en particulier l'evenement FileOpen sous MacOs. + Installe comme event filter sur QApplication dans main(), une fois + QETApp construite (voir main.cpp). + @param object Objet cible de l'evenement @param e Evenement a gerer */ -bool QETApp::eventFiltrer(QObject *object, QEvent *e) { +bool QETApp::eventFilter(QObject *object, QEvent *e) { // gere l'ouverture de fichiers (sous MacOs) if (e -> type() == QEvent::FileOpen) { // nom du fichier a ouvrir QString filename = static_cast(e) -> file(); - openFiles(QStringList() << filename); + openFiles(QETArguments(QStringList() << filename)); return(true); } else { return QObject::eventFilter(object, e); diff --git a/sources/qetapp.h b/sources/qetapp.h index 2f4ecc363..512fff961 100644 --- a/sources/qetapp.h +++ b/sources/qetapp.h @@ -178,10 +178,9 @@ class QETApp : public QObject static QTextOrientationSpinBoxWidget *createTextOrientationSpinBoxWidget(); static TitleBlockTemplate *defaultTitleBlockTemplate(); - protected: - #ifdef Q_OS_DARWIN - bool eventFiltrer(QObject *object, QEvent *); + public: + bool eventFilter(QObject *object, QEvent *) override; #endif // attributes