From 2405aa9d6797dcfb2e47f45f113ee1ebbc201dda Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 28 Jul 2020 06:11:31 +0200 Subject: Windows QPA: Move mime-type related classes to the new interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move QWindowsMime (which was a public class in Qt 4 and moved to the QPA plugin in Qt 5) to the platform namespace and add register functions to the native application. Move in test code from QtWinExtras. Task-number: QTBUG-83252 Change-Id: Iaac440e2d5cb370110919921b1eeb779600b5b65 Reviewed-by: Tor Arne Vestbø --- .../platforms/windows/qwindowsapplication.cpp | 18 ++++++ .../platforms/windows/qwindowsapplication.h | 5 ++ .../platforms/windows/qwindowsinternalmimedata.cpp | 4 +- src/plugins/platforms/windows/qwindowsmime.cpp | 71 +++++++++------------- src/plugins/platforms/windows/qwindowsmime.h | 26 ++------ .../platforms/windows/qwindowsnativeinterface.cpp | 16 ----- .../platforms/windows/qwindowsnativeinterface.h | 3 - src/plugins/platforms/windows/qwindowsole.cpp | 2 +- 8 files changed, 63 insertions(+), 82 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/platforms/windows/qwindowsapplication.cpp b/src/plugins/platforms/windows/qwindowsapplication.cpp index c137b2a8a8..83f42a8c86 100644 --- a/src/plugins/platforms/windows/qwindowsapplication.cpp +++ b/src/plugins/platforms/windows/qwindowsapplication.cpp @@ -40,6 +40,7 @@ #include "qwindowsapplication.h" #include "qwindowsclipboard.h" #include "qwindowscontext.h" +#include "qwindowsmime.h" #include "qwin10helpers.h" @@ -109,4 +110,21 @@ void QWindowsApplication::setDarkModeHandling(QWindowsApplication::DarkModeHandl m_darkModeHandling = handling; } +void QWindowsApplication::registerMime(QPlatformInterface::Private::QWindowsMime *mime) +{ + if (auto ctx = QWindowsContext::instance()) + ctx->mimeConverter().registerMime(mime); +} + +void QWindowsApplication::unregisterMime(QPlatformInterface::Private::QWindowsMime *mime) +{ + if (auto ctx = QWindowsContext::instance()) + ctx->mimeConverter().unregisterMime(mime); +} + +int QWindowsApplication::registerMimeType(const QString &mime) +{ + return QWindowsMimeConverter::registerMimeType(mime); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsapplication.h b/src/plugins/platforms/windows/qwindowsapplication.h index 6cf8577ab5..6e488e3ed0 100644 --- a/src/plugins/platforms/windows/qwindowsapplication.h +++ b/src/plugins/platforms/windows/qwindowsapplication.h @@ -62,6 +62,11 @@ public: DarkModeHandling darkModeHandling() const override; void setDarkModeHandling(DarkModeHandling handling) override; + void registerMime(QPlatformInterface::Private::QWindowsMime *mime) override; + void unregisterMime(QPlatformInterface::Private::QWindowsMime *mime) override; + + int registerMimeType(const QString &mime) override; + private: WindowActivationBehavior m_windowActivationBehavior = DefaultActivateWindow; TouchWindowTouchTypes m_touchWindowTouchTypes = NormalTouch; diff --git a/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp b/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp index ad3f02f83b..21f64f04b6 100644 --- a/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp +++ b/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp @@ -41,6 +41,8 @@ #include "qwindowscontext.h" #include "qwindowsmime.h" #include +#include + /*! \class QWindowsInternalMimeDataBase \brief Base for implementations of QInternalMimeData using a IDataObject COM object. @@ -97,7 +99,7 @@ QVariant QWindowsInternalMimeData::retrieveData_sys(const QString &mimeType, QVariant result; const QWindowsMimeConverter &mc = QWindowsContext::instance()->mimeConverter(); - if (const QWindowsMime *converter = mc.converterToMime(mimeType, pDataObj)) + if (auto converter = mc.converterToMime(mimeType, pDataObj)) result = converter->convertToMime(mimeType, pDataObj, type); releaseDataObject(pDataObj); if (QWindowsContext::verbose) { diff --git a/src/plugins/platforms/windows/qwindowsmime.cpp b/src/plugins/platforms/windows/qwindowsmime.cpp index 59fc7f3a35..7cd35c7308 100644 --- a/src/plugins/platforms/windows/qwindowsmime.cpp +++ b/src/plugins/platforms/windows/qwindowsmime.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the plugins of the Qt Toolkit. @@ -485,30 +485,6 @@ QDebug operator<<(QDebug d, IDataObject *dataObj) \sa QWindowsMimeConverter */ -/*! -Constructs a new conversion object, adding it to the globally accessed -list of available converters. -*/ -QWindowsMime::QWindowsMime() = default; - -/*! -Destroys a conversion object, removing it from the global -list of available converters. -*/ -QWindowsMime::~QWindowsMime() = default; - -/*! - Registers the MIME type \a mime, and returns an ID number - identifying the format on Windows. -*/ -int QWindowsMime::registerMimeType(const QString &mime) -{ - const UINT f = RegisterClipboardFormat(reinterpret_cast (mime.utf16())); - if (!f) - qErrnoWarning("QWindowsMime::registerMimeType: Failed to register clipboard format"); - - return int(f); -} /*! \fn bool QWindowsMime::canConvertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const @@ -568,7 +544,7 @@ int QWindowsMime::registerMimeType(const QString &mime) All subclasses must reimplement this pure virtual function. */ -class QWindowsMimeText : public QWindowsMime +class QWindowsMimeText : public QPlatformInterface::Private::QWindowsMime { public: bool canConvertToMime(const QString &mimeType, IDataObject *pDataObj) const override; @@ -724,7 +700,7 @@ QVariant QWindowsMimeText::convertToMime(const QString &mime, LPDATAOBJECT pData return ret; } -class QWindowsMimeURI : public QWindowsMime +class QWindowsMimeURI : public QPlatformInterface::Private::QWindowsMime { public: QWindowsMimeURI(); @@ -741,8 +717,8 @@ private: QWindowsMimeURI::QWindowsMimeURI() { - CF_INETURL_W = QWindowsMime::registerMimeType(QStringLiteral("UniformResourceLocatorW")); - CF_INETURL = QWindowsMime::registerMimeType(QStringLiteral("UniformResourceLocator")); + CF_INETURL_W = QWindowsMimeConverter::registerMimeType(QStringLiteral("UniformResourceLocatorW")); + CF_INETURL = QWindowsMimeConverter::registerMimeType(QStringLiteral("UniformResourceLocator")); } bool QWindowsMimeURI::canConvertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const @@ -890,7 +866,7 @@ QVariant QWindowsMimeURI::convertToMime(const QString &mimeType, LPDATAOBJECT pD return QVariant(); } -class QWindowsMimeHtml : public QWindowsMime +class QWindowsMimeHtml : public QPlatformInterface::Private::QWindowsMime { public: QWindowsMimeHtml(); @@ -911,7 +887,7 @@ private: QWindowsMimeHtml::QWindowsMimeHtml() { - CF_HTML = QWindowsMime::registerMimeType(QStringLiteral("HTML Format")); + CF_HTML = QWindowsMimeConverter::registerMimeType(QStringLiteral("HTML Format")); } QList QWindowsMimeHtml::formatsForMime(const QString &mimeType, const QMimeData *mimeData) const @@ -1028,7 +1004,7 @@ bool QWindowsMimeHtml::convertFromMime(const FORMATETC &formatetc, const QMimeDa #ifndef QT_NO_IMAGEFORMAT_BMP -class QWindowsMimeImage : public QWindowsMime +class QWindowsMimeImage : public QPlatformInterface::Private::QWindowsMime { public: QWindowsMimeImage(); @@ -1182,7 +1158,7 @@ QVariant QWindowsMimeImage::convertToMime(const QString &mimeType, IDataObject * } #endif -class QBuiltInMimes : public QWindowsMime +class QBuiltInMimes : public QPlatformInterface::Private::QWindowsMime { public: QBuiltInMimes(); @@ -1205,8 +1181,8 @@ private: QBuiltInMimes::QBuiltInMimes() : QWindowsMime() { - outFormats.insert(QWindowsMime::registerMimeType(QStringLiteral("application/x-color")), QStringLiteral("application/x-color")); - inFormats.insert(QWindowsMime::registerMimeType(QStringLiteral("application/x-color")), QStringLiteral("application/x-color")); + outFormats.insert(QWindowsMimeConverter::registerMimeType(QStringLiteral("application/x-color")), QStringLiteral("application/x-color")); + inFormats.insert(QWindowsMimeConverter::registerMimeType(QStringLiteral("application/x-color")), QStringLiteral("application/x-color")); } bool QBuiltInMimes::canConvertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const @@ -1303,7 +1279,7 @@ QString QBuiltInMimes::mimeForFormat(const FORMATETC &formatetc) const } -class QLastResortMimes : public QWindowsMime +class QLastResortMimes : public QPlatformInterface::Private::QWindowsMime { public: @@ -1387,7 +1363,7 @@ QList QLastResortMimes::formatsForMime(const QString &mimeType, const auto mit = std::find(formats.begin(), formats.end(), mimeType); // register any other available formats if (mit == formats.end() && !excludeList.contains(mimeType, Qt::CaseInsensitive)) - mit = formats.insert(QWindowsMime::registerMimeType(mimeType), mimeType); + mit = formats.insert(QWindowsMimeConverter::registerMimeType(mimeType), mimeType); if (mit != formats.end()) formatetcs += setCf(mit.key()); @@ -1431,7 +1407,7 @@ bool QLastResortMimes::canConvertToMime(const QString &mimeType, IDataObject *pD } // if it is not in there then register it and see if we can get it const auto mit = std::find(formats.cbegin(), formats.cend(), mimeType); - const int cf = mit != formats.cend() ? mit.key() : QWindowsMime::registerMimeType(mimeType); + const int cf = mit != formats.cend() ? mit.key() : QWindowsMimeConverter::registerMimeType(mimeType); return canGetData(cf, pDataObj); } @@ -1448,7 +1424,7 @@ QVariant QLastResortMimes::convertToMime(const QString &mimeType, IDataObject *p data = getData(int(cf), pDataObj, lindex); } else { const auto mit = std::find(formats.cbegin(), formats.cend(), mimeType); - const int cf = mit != formats.cend() ? mit.key() : QWindowsMime::registerMimeType(mimeType); + const int cf = mit != formats.cend() ? mit.key() : QWindowsMimeConverter::registerMimeType(mimeType); data = getData(cf, pDataObj); } if (!data.isEmpty()) @@ -1506,7 +1482,7 @@ QWindowsMimeConverter::~QWindowsMimeConverter() qDeleteAll(m_mimes.begin(), m_mimes.begin() + m_internalMimeCount); } -QWindowsMime * QWindowsMimeConverter::converterToMime(const QString &mimeType, IDataObject *pDataObj) const +QWindowsMimeConverter::QWindowsMime *QWindowsMimeConverter::converterToMime(const QString &mimeType, IDataObject *pDataObj) const { ensureInitialized(); for (int i = m_mimes.size()-1; i >= 0; --i) { @@ -1545,7 +1521,7 @@ QStringList QWindowsMimeConverter::allMimesForFormats(IDataObject *pDataObj) con return formats; } -QWindowsMime * QWindowsMimeConverter::converterFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const +QWindowsMimeConverter::QWindowsMime *QWindowsMimeConverter::converterFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const { ensureInitialized(); qCDebug(lcQpaMime) << __FUNCTION__ << formatetc; @@ -1623,4 +1599,17 @@ void QWindowsMimeConverter::registerMime(QWindowsMime *mime) m_mimes.append(mime); } +/*! + Registers the MIME type \a mime, and returns an ID number + identifying the format on Windows. +*/ +int QWindowsMimeConverter::registerMimeType(const QString &mime) +{ + const UINT f = RegisterClipboardFormat(reinterpret_cast (mime.utf16())); + if (!f) + qErrnoWarning("QWindowsApplication::registerMimeType: Failed to register clipboard format"); + + return int(f); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsmime.h b/src/plugins/platforms/windows/qwindowsmime.h index af2a35457f..ee71bee2ba 100644 --- a/src/plugins/platforms/windows/qwindowsmime.h +++ b/src/plugins/platforms/windows/qwindowsmime.h @@ -40,6 +40,8 @@ #ifndef QWINDOWSMIME_H #define QWINDOWSMIME_H +#include + #include #include @@ -50,30 +52,12 @@ QT_BEGIN_NAMESPACE class QDebug; class QMimeData; -class QWindowsMime -{ - Q_DISABLE_COPY_MOVE(QWindowsMime) -public: - QWindowsMime(); - virtual ~QWindowsMime(); - - // for converting from Qt - virtual bool canConvertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData) const = 0; - virtual bool convertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData, STGMEDIUM * pmedium) const = 0; - virtual QList formatsForMime(const QString &mimeType, const QMimeData *mimeData) const = 0; - - // for converting to Qt - virtual bool canConvertToMime(const QString &mimeType, IDataObject *pDataObj) const = 0; - virtual QVariant convertToMime(const QString &mimeType, IDataObject *pDataObj, QVariant::Type preferredType) const = 0; - virtual QString mimeForFormat(const FORMATETC &formatetc) const = 0; - - static int registerMimeType(const QString &mime); -}; - class QWindowsMimeConverter { Q_DISABLE_COPY_MOVE(QWindowsMimeConverter) public: + using QWindowsMime = QPlatformInterface::Private::QWindowsMime; + QWindowsMimeConverter(); ~QWindowsMimeConverter(); @@ -89,6 +73,8 @@ public: void registerMime(QWindowsMime *mime); void unregisterMime(QWindowsMime *mime) { m_mimes.removeOne(mime); } + static int registerMimeType(const QString &mime); + static QString clipboardFormatName(int cf); private: diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp index 12950d02d6..fe0da98a47 100644 --- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp +++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp @@ -45,7 +45,6 @@ #include "qwindowsopenglcontext.h" #include "qwindowsopengltester.h" #include "qwindowsintegration.h" -#include "qwindowsmime.h" #include "qwindowstheme.h" #include "qwin10helpers.h" @@ -205,21 +204,6 @@ void QWindowsNativeInterface::setAsyncExpose(bool value) QWindowsContext::instance()->setAsyncExpose(value); } -void QWindowsNativeInterface::registerWindowsMime(void *mimeIn) -{ - QWindowsContext::instance()->mimeConverter().registerMime(reinterpret_cast(mimeIn)); -} - -void QWindowsNativeInterface::unregisterWindowsMime(void *mimeIn) -{ - QWindowsContext::instance()->mimeConverter().unregisterMime(reinterpret_cast(mimeIn)); -} - -int QWindowsNativeInterface::registerMimeType(const QString &mimeType) -{ - return QWindowsMime::registerMimeType(mimeType); -} - QFont QWindowsNativeInterface::logFontToQFont(const void *logFont, int verticalDpi) { return QWindowsFontDatabase::LOGFONT_to_QFont(*reinterpret_cast(logFont), verticalDpi); diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.h b/src/plugins/platforms/windows/qwindowsnativeinterface.h index bb7801f398..68a795f466 100644 --- a/src/plugins/platforms/windows/qwindowsnativeinterface.h +++ b/src/plugins/platforms/windows/qwindowsnativeinterface.h @@ -82,9 +82,6 @@ public: Q_INVOKABLE QString registerWindowClass(const QString &classNameIn, void *eventProc) const; - Q_INVOKABLE void registerWindowsMime(void *mimeIn); - Q_INVOKABLE void unregisterWindowsMime(void *mime); - Q_INVOKABLE int registerMimeType(const QString &mimeType); Q_INVOKABLE QFont logFontToQFont(const void *logFont, int verticalDpi); bool asyncExpose() const; diff --git a/src/plugins/platforms/windows/qwindowsole.cpp b/src/plugins/platforms/windows/qwindowsole.cpp index 4427133882..c040137a6d 100644 --- a/src/plugins/platforms/windows/qwindowsole.cpp +++ b/src/plugins/platforms/windows/qwindowsole.cpp @@ -103,7 +103,7 @@ QWindowsOleDataObject::GetData(LPFORMATETC pformatetc, LPSTGMEDIUM pmedium) if (data) { const QWindowsMimeConverter &mc = QWindowsContext::instance()->mimeConverter(); - if (QWindowsMime *converter = mc.converterFromMime(*pformatetc, data)) + if (auto converter = mc.converterFromMime(*pformatetc, data)) if (converter->convertFromMime(*pformatetc, data, pmedium)) hr = ResultFromScode(S_OK); } -- cgit v1.2.3