update to Qt 6.8.2

This commit is contained in:
kleuter 2025-03-17 18:04:27 +01:00
parent 15d5fb5382
commit 97ed722167
7 changed files with 43 additions and 18 deletions

View File

@ -637,6 +637,7 @@ void QRecursiveMutex::unlock() noexcept
/*! /*!
\internal helper for lock() \internal helper for lock()
*/ */
Q_NEVER_INLINE
void QBasicMutex::lockInternal() QT_MUTEX_LOCK_NOEXCEPT void QBasicMutex::lockInternal() QT_MUTEX_LOCK_NOEXCEPT
{ {
if (futexAvailable()) { if (futexAvailable()) {
@ -670,6 +671,7 @@ bool QBasicMutex::lockInternal(int timeout) QT_MUTEX_LOCK_NOEXCEPT
/*! /*!
\internal helper for tryLock(QDeadlineTimer) \internal helper for tryLock(QDeadlineTimer)
*/ */
Q_NEVER_INLINE
bool QBasicMutex::lockInternal(QDeadlineTimer deadlineTimer) QT_MUTEX_LOCK_NOEXCEPT bool QBasicMutex::lockInternal(QDeadlineTimer deadlineTimer) QT_MUTEX_LOCK_NOEXCEPT
{ {
if (deadlineTimer.hasExpired()) if (deadlineTimer.hasExpired())
@ -809,6 +811,7 @@ bool QBasicMutex::lockInternal(QDeadlineTimer deadlineTimer) QT_MUTEX_LOCK_NOEXC
/*! /*!
\internal \internal
*/ */
Q_NEVER_INLINE
void QBasicMutex::unlockInternal() noexcept void QBasicMutex::unlockInternal() noexcept
{ {
QMutexPrivate *copy = d_ptr.loadAcquire(); QMutexPrivate *copy = d_ptr.loadAcquire();

View File

@ -5697,7 +5697,16 @@ bool QD3D12GraphicsPipeline::create()
} }
QD3D12RenderPassDescriptor *rpD = QRHI_RES(QD3D12RenderPassDescriptor, m_renderPassDesc); QD3D12RenderPassDescriptor *rpD = QRHI_RES(QD3D12RenderPassDescriptor, m_renderPassDesc);
const DXGI_SAMPLE_DESC sampleDesc = rhiD->effectiveSampleDesc(m_sampleCount, DXGI_FORMAT(rpD->colorFormat[0])); DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN;
if (rpD->colorAttachmentCount > 0) {
format = DXGI_FORMAT(rpD->colorFormat[0]);
} else if (rpD->hasDepthStencil) {
format = DXGI_FORMAT(rpD->dsFormat);
} else {
qWarning("Cannot create graphics pipeline state without color or depthStencil format");
return false;
}
const DXGI_SAMPLE_DESC sampleDesc = rhiD->effectiveSampleDesc(m_sampleCount, format);
struct { struct {
QD3D12PipelineStateSubObject<ID3D12RootSignature *, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> rootSig; QD3D12PipelineStateSubObject<ID3D12RootSignature *, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_ROOT_SIGNATURE> rootSig;

View File

@ -1359,6 +1359,11 @@ QList<QKeyCombination> QWindowsKeyMapper::possibleKeyCombinations(const QKeyEven
return result; return result;
} }
// If Key_Tab+Shift is pressed we add Key_Backtab without
// shift modifier as a possible combination too
if (baseKey == Qt::Key_Tab && (keyMods & Qt::ShiftModifier))
result << (Qt::Key_Backtab | (keyMods & ~Qt::ShiftModifier));
// The base key is _always_ valid, of course // The base key is _always_ valid, of course
result << QKeyCombination::fromCombined(int(baseKey) + int(keyMods)); result << QKeyCombination::fromCombined(int(baseKey) + int(keyMods));

View File

@ -132,12 +132,12 @@ namespace {
struct DiRegKeyHandleTraits struct DiRegKeyHandleTraits
{ {
using Type = HKEY; using Type = HKEY;
static Type invalidValue() static Type invalidValue() noexcept
{ {
// The setupapi.h functions return INVALID_HANDLE_VALUE when failing to open a registry key // The setupapi.h functions return INVALID_HANDLE_VALUE when failing to open a registry key
return reinterpret_cast<HKEY>(INVALID_HANDLE_VALUE); return reinterpret_cast<HKEY>(INVALID_HANDLE_VALUE);
} }
static bool close(Type handle) { return RegCloseKey(handle) == ERROR_SUCCESS; } static bool close(Type handle) noexcept { return RegCloseKey(handle) == ERROR_SUCCESS; }
}; };
using DiRegKeyHandle = QUniqueHandle<DiRegKeyHandleTraits>; using DiRegKeyHandle = QUniqueHandle<DiRegKeyHandleTraits>;
@ -145,11 +145,11 @@ using DiRegKeyHandle = QUniqueHandle<DiRegKeyHandleTraits>;
struct DevInfoHandleTraits struct DevInfoHandleTraits
{ {
using Type = HDEVINFO; using Type = HDEVINFO;
static Type invalidValue() static Type invalidValue() noexcept
{ {
return reinterpret_cast<HDEVINFO>(INVALID_HANDLE_VALUE); return reinterpret_cast<HDEVINFO>(INVALID_HANDLE_VALUE);
} }
static bool close(Type handle) { return SetupDiDestroyDeviceInfoList(handle) == TRUE; } static bool close(Type handle) noexcept { return SetupDiDestroyDeviceInfoList(handle) == TRUE; }
}; };
using DevInfoHandle = QUniqueHandle<DevInfoHandleTraits>; using DevInfoHandle = QUniqueHandle<DevInfoHandleTraits>;

View File

@ -843,7 +843,6 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSiz
{ {
int resourceId = -1; int resourceId = -1;
SHSTOCKICONID stockId = SIID_INVALID; SHSTOCKICONID stockId = SIID_INVALID;
UINT stockFlags = 0;
LPCTSTR iconName = nullptr; LPCTSTR iconName = nullptr;
switch (sp) { switch (sp) {
case DriveCDIcon: case DriveCDIcon:
@ -867,14 +866,12 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSiz
resourceId = 7; resourceId = 7;
break; break;
case FileLinkIcon: case FileLinkIcon:
stockFlags = SHGSI_LINKOVERLAY;
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case FileIcon: case FileIcon:
stockId = SIID_DOCNOASSOC; stockId = SIID_DOCNOASSOC;
resourceId = 1; resourceId = 1;
break; break;
case DirLinkIcon: case DirLinkIcon:
stockFlags = SHGSI_LINKOVERLAY;
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case DirClosedIcon: case DirClosedIcon:
case DirIcon: case DirIcon:
@ -888,7 +885,6 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSiz
resourceId = 16; resourceId = 16;
break; break;
case DirLinkOpenIcon: case DirLinkOpenIcon:
stockFlags = SHGSI_LINKOVERLAY;
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case DirOpenIcon: case DirOpenIcon:
stockId = SIID_FOLDEROPEN; stockId = SIID_FOLDEROPEN;
@ -928,18 +924,34 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSiz
break; break;
} }
// Even with SHGSI_LINKOVERLAY flag set, loaded Icon with SHDefExtractIcon doesn't have
// any overlay, so we avoid SHGSI_LINKOVERLAY flag and draw it manually (QTBUG-131843)
const auto drawLinkOverlayIconIfNeeded = [](StandardPixmap sp, QPixmap &pixmap, QSizeF pixmapSize) {
if (sp == FileLinkIcon || sp == DirLinkIcon || sp == DirLinkOpenIcon) {
QPainter painter(&pixmap);
const QSizeF linkSize = pixmapSize / (pixmapSize.height() >= 48 ? 3 : 2);
static constexpr auto LinkOverlayIconId = 16769;
const QPixmap link = loadIconFromShell32(LinkOverlayIconId, linkSize.toSize());
const int yPos = pixmap.height() - link.size().height();
painter.drawPixmap(0, yPos, int(linkSize.width()), int(linkSize.height()), link);
}
};
if (stockId != SIID_INVALID) { if (stockId != SIID_INVALID) {
SHSTOCKICONINFO iconInfo; SHSTOCKICONINFO iconInfo;
memset(&iconInfo, 0, sizeof(iconInfo)); memset(&iconInfo, 0, sizeof(iconInfo));
iconInfo.cbSize = sizeof(iconInfo); iconInfo.cbSize = sizeof(iconInfo);
stockFlags |= SHGSI_ICONLOCATION; constexpr UINT stockFlags = SHGSI_ICONLOCATION;
if (SHGetStockIconInfo(stockId, stockFlags, &iconInfo) == S_OK) { if (SHGetStockIconInfo(stockId, stockFlags, &iconInfo) == S_OK) {
const auto iconSize = pixmapSize.width(); const auto iconSize = pixmapSize.width();
HICON icon; HICON icon;
if (SHDefExtractIcon(iconInfo.szPath, iconInfo.iIcon, 0, &icon, nullptr, iconSize) == S_OK) { if (SHDefExtractIcon(iconInfo.szPath, iconInfo.iIcon, 0, &icon, nullptr, iconSize) == S_OK) {
QPixmap pixmap = qt_pixmapFromWinHICON(icon); QPixmap pixmap = qt_pixmapFromWinHICON(icon);
DestroyIcon(icon); DestroyIcon(icon);
return pixmap; if (!pixmap.isNull()) {
drawLinkOverlayIconIfNeeded(sp, pixmap, pixmap.size());
return pixmap;
}
} }
} }
} }
@ -947,11 +959,7 @@ QPixmap QWindowsTheme::standardPixmap(StandardPixmap sp, const QSizeF &pixmapSiz
if (resourceId != -1) { if (resourceId != -1) {
QPixmap pixmap = loadIconFromShell32(resourceId, pixmapSize); QPixmap pixmap = loadIconFromShell32(resourceId, pixmapSize);
if (!pixmap.isNull()) { if (!pixmap.isNull()) {
if (sp == FileLinkIcon || sp == DirLinkIcon || sp == DirLinkOpenIcon) { drawLinkOverlayIconIfNeeded(sp, pixmap, pixmapSize);
QPainter painter(&pixmap);
QPixmap link = loadIconFromShell32(30, pixmapSize);
painter.drawPixmap(0, 0, int(pixmapSize.width()), int(pixmapSize.height()), link);
}
return pixmap; return pixmap;
} }
} }

View File

@ -1405,7 +1405,7 @@ void QWindowsForeignWindow::setParent(const QPlatformWindow *newParentWindow)
qCDebug(lcQpaWindow) << __FUNCTION__ << window() << "newParent=" qCDebug(lcQpaWindow) << __FUNCTION__ << window() << "newParent="
<< newParentWindow << newParent << "oldStyle=" << debugWinStyle(oldStyle); << newParentWindow << newParent << "oldStyle=" << debugWinStyle(oldStyle);
auto updateWindowFlags = [=]{ auto updateWindowFlags = [&]{
// Top level window flags need to be set/cleared manually. // Top level window flags need to be set/cleared manually.
DWORD newStyle = oldStyle; DWORD newStyle = oldStyle;
if (isTopLevel) { if (isTopLevel) {

View File

@ -363,7 +363,7 @@ void QWindowsUiaMainProvider::fillVariantArrayForRelation(QAccessibleInterface*
{ {
Q_ASSERT(accessible); Q_ASSERT(accessible);
typedef QPair<QAccessibleInterface*, QAccessible::Relation> RelationPair; typedef std::pair<QAccessibleInterface*, QAccessible::Relation> RelationPair;
const QList<RelationPair> relationInterfaces = accessible->relations(relation); const QList<RelationPair> relationInterfaces = accessible->relations(relation);
if (relationInterfaces.empty()) if (relationInterfaces.empty())
return; return;