[LyX/master] Enable QWindowsMimeMetafile with Qt6

Enrico Forestieri forenr at lyx.org
Sun Oct 17 12:48:31 UTC 2021


commit 771f30e9463d8d7bf7acd4dfc564f462b28eae16
Author: Enrico Forestieri <forenr at lyx.org>
Date:   Sun Oct 17 15:06:05 2021 +0200

    Enable QWindowsMimeMetafile with Qt6
    
    The QWinMime class has been removed in Qt6 but the functionality
    is still present. However, one has to allow inclusion of private
    headers and register the mime handling to the QWindowsApplication
    native interface.
---
 config/qt.m4                        |    1 +
 src/frontends/qt/GuiApplication.cpp |   37 +++++++++++++++++++++++++++++-----
 2 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/config/qt.m4 b/config/qt.m4
index 99f43a2..70a722f 100644
--- a/config/qt.m4
+++ b/config/qt.m4
@@ -442,6 +442,7 @@ qtHaveModule(gui):		QT += gui
 qtHaveModule(svg):		QT += svg
 qtHaveModule(svgwidgets):	QT += svgwidgets
 qtHaveModule(widgets):		QT += widgets
+QT += gui-private
 percent.target = %
 percent.commands = @echo -n "\$(\$(@))\ "
 QMAKE_EXTRA_TARGETS += percent
diff --git a/src/frontends/qt/GuiApplication.cpp b/src/frontends/qt/GuiApplication.cpp
index f411088..54c8910 100644
--- a/src/frontends/qt/GuiApplication.cpp
+++ b/src/frontends/qt/GuiApplication.cpp
@@ -137,14 +137,22 @@
 
 #if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400)
 #if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
-#if (QT_VERSION < 0x060000)
 #if (QT_VERSION < 0x050000)
 #include <QWindowsMime>
 #define QWINDOWSMIME QWindowsMime
+#define QVARIANTTYPE QVariant::Type
+#elif (QT_VERSION >= 0x060000)
+#include <QtGui/private/qguiapplication_p.h>
+#include <QtGui/private/qwindowsmime_p.h>
+#include <QtGui/qpa/qplatformintegration.h>
+#define QWINDOWSMIME QWindowsMime
+#define QVARIANTTYPE QMetaType
+using QWindowsMime = QNativeInterface::Private::QWindowsMime;
+using QWindowsApplication = QNativeInterface::Private::QWindowsApplication;
 #else
 #include <QWinMime>
 #define QWINDOWSMIME QWinMime
-#endif
+#define QVARIANTTYPE QVariant::Type
 #endif
 #ifdef Q_CC_GNU
 #include <wtypes.h>
@@ -812,7 +820,7 @@ public:
 ////////////////////////////////////////////////////////////////////////
 // Windows specific stuff goes here...
 
-#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400 && QT_VERSION < 0x060000)
+#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400)
 #if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
 // QWindowsMimeMetafile can only be compiled on Windows.
 
@@ -859,7 +867,7 @@ public:
 	}
 
 	QVariant convertToMime(QString const & mimetype, IDataObject * pDataObj,
-		QVariant::Type /*preferredType*/) const override
+		QVARIANTTYPE /*preferredType*/) const override
 	{
 		QByteArray data;
 		if (!canConvertToMime(mimetype, pDataObj))
@@ -978,15 +986,29 @@ struct GuiApplication::Private
 		, last_state_(Qt::ApplicationInactive)
 	#endif
 	{
-	#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400 && QT_VERSION < 0x060000)
+	#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400)
 	#if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
 		/// WMF Mime handler for Windows clipboard.
 		wmf_mime_ = new QWindowsMimeMetafile;
+	#if (QT_VERSION >= 0x060000)
+		win_app_ = dynamic_cast<QWindowsApplication *>
+			(QGuiApplicationPrivate::platformIntegration());
+		win_app_->registerMime(wmf_mime_);
+	#endif
 	#endif
 	#endif
 		initKeySequences(&theTopLevelKeymap());
 	}
 
+	#if (QT_VERSION >= 0x060000)
+	#if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
+	~Private()
+	{
+		win_app_->unregisterMime(wmf_mime_);
+	}
+	#endif
+	#endif
+
 	void initKeySequences(KeyMap * kb)
 	{
 		keyseq = KeySequence(kb, kb);
@@ -1053,10 +1075,13 @@ struct GuiApplication::Private
 	QMacPasteboardMimeGraphics mac_pasteboard_mime_;
 #endif
 
-#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400 && QT_VERSION < 0x060000)
+#if (QT_VERSION < 0x050000) || (QT_VERSION >= 0x050400)
 #if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
 	/// WMF Mime handler for Windows clipboard.
 	QWindowsMimeMetafile * wmf_mime_;
+#if (QT_VERSION >= 0x060000)
+	QWindowsApplication * win_app_;
+#endif
 #endif
 #endif
 


More information about the lyx-cvs mailing list