From 68f097923f429861d7148236b48c90ebb7729fee Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Tue, 1 Nov 2022 13:58:11 +0100 Subject: [PATCH] Fix registration of Windows-specific custom mime types Data received by Qt from a native clipboard- or drag'n'drop-source is mapped to a application/x-qt-windows-mime;value=... mime type, where the "value" corresponds to the native clipboard format name, e.g. "FileGroupDescriptor". When we register such a mime type in Qt, then we need to get the same clipboard format number back. I.e. registering 'application/x-qt-windows-mime;value="FileGroupDescriptor"' needs to produce the same Windows clipboard format identifier as the call to RegisterClipboardFormat("FileGroupDescriptor"). Otherwise, a mime converter implementation has to operate on different clipboard format values in the implementations of the different virtual functions that are operating on FORMATETC data structures. Task-number: QTBUG-93632 Change-Id: I0b7e3a2fc0e3f72bffc4490fc0ff4b190e0929a3 Reviewed-by: Timur Pocheptsov --- .../platforms/windows/qwindowsmimeregistry.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowsmimeregistry.cpp b/src/plugins/platforms/windows/qwindowsmimeregistry.cpp index b2f9e4289d0..55d0266bb2d 100644 --- a/src/plugins/platforms/windows/qwindowsmimeregistry.cpp +++ b/src/plugins/platforms/windows/qwindowsmimeregistry.cpp @@ -1496,12 +1496,18 @@ void QWindowsMimeRegistry::registerMime(QWindowsMime *mime) /*! Registers the MIME type \a mime, and returns an ID number identifying the format on Windows. + + A mime type \c {application/x-qt-windows-mime;value="WindowsType"} will be + registered as the clipboard format for \c WindowsType. */ int QWindowsMimeRegistry::registerMimeType(const QString &mime) { - const UINT f = RegisterClipboardFormat(reinterpret_cast (mime.utf16())); - if (!f) - qErrnoWarning("QWindowsApplication::registerMimeType: Failed to register clipboard format"); + const QString mimeType = isCustomMimeType(mime) ? customMimeType(mime) : mime; + const UINT f = RegisterClipboardFormat(reinterpret_cast (mimeType.utf16())); + if (!f) { + qErrnoWarning("QWindowsMimeRegistry::registerMimeType: Failed to register clipboard format " + "for %s", qPrintable(mime)); + } return int(f); }