diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/angle/src/config.pri | 1 | ||||
-rw-r--r-- | src/corelib/plugin/qlibrary.cpp | 2 | ||||
-rw-r--r-- | src/corelib/thread/qreadwritelock.cpp | 37 | ||||
-rw-r--r-- | src/corelib/thread/qreadwritelock_p.h | 14 | ||||
-rw-r--r-- | src/gui/kernel/qevent.cpp | 24 | ||||
-rw-r--r-- | src/gui/kernel/qevent.h | 1 | ||||
-rw-r--r-- | src/gui/kernel/qevent_p.h | 4 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 2 | ||||
-rw-r--r-- | src/gui/rhi/qshaderdescription.cpp | 2 | ||||
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 26 | ||||
-rw-r--r-- | src/gui/text/qtextdocumentlayout.cpp | 12 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmbackingstore.cpp | 9 | ||||
-rw-r--r-- | src/plugins/platforms/wasm/qwasmbackingstore.h | 1 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsscene.h | 2 | ||||
-rw-r--r-- | src/widgets/styles/qstylesheetstyle.cpp | 20 |
15 files changed, 97 insertions, 60 deletions
diff --git a/src/angle/src/config.pri b/src/angle/src/config.pri index cafae0e742..af53d4c621 100644 --- a/src/angle/src/config.pri +++ b/src/angle/src/config.pri @@ -53,6 +53,7 @@ CONFIG(debug, debug|release) { } !isEmpty(BUILD_PASS): BUILDSUBDIR = $$lower($$BUILD_PASS)/ +else: BUILDSUBDIR = $$PWD/ # c++11 is needed by MinGW to get support for unordered_map. CONFIG += stl exceptions c++11 c++14 diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 98a198df43..eeaa3c18ec 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -74,7 +74,7 @@ QT_BEGIN_NAMESPACE # define QLIBRARY_AS_DEBUG true #endif -#if defined(Q_OS_UNIX) +#if defined(Q_OS_UNIX) || (defined(Q_CC_MINGW) && !QT_CONFIG(debug_and_release)) // We don't use separate debug and release libs on UNIX, so we want // to allow loading plugins, regardless of how they were built. # define QT_NO_DEBUG_PLUGIN_CHECK diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp index 5aba05c1b9..14654986a0 100644 --- a/src/corelib/thread/qreadwritelock.cpp +++ b/src/corelib/thread/qreadwritelock.cpp @@ -50,8 +50,6 @@ #include "private/qfreelist_p.h" #include "private/qlocking_p.h" -#include <chrono> - QT_BEGIN_NAMESPACE /* @@ -67,9 +65,6 @@ QT_BEGIN_NAMESPACE */ namespace { - -using ms = std::chrono::milliseconds; - enum { StateMask = 0x3, StateLockedForRead = 0x1, @@ -279,7 +274,7 @@ bool QReadWriteLock::tryLockForRead(int timeout) d = d_ptr.loadAcquire(); continue; } - return d->lockForRead(lock, timeout); + return d->lockForRead(timeout); } } @@ -383,7 +378,7 @@ bool QReadWriteLock::tryLockForWrite(int timeout) d = d_ptr.loadAcquire(); continue; } - return d->lockForWrite(lock, timeout); + return d->lockForWrite(timeout); } } @@ -466,9 +461,9 @@ QReadWriteLock::StateForWaitCondition QReadWriteLock::stateForWaitCondition() co } -bool QReadWriteLockPrivate::lockForRead(std::unique_lock<std::mutex> &lock, int timeout) +bool QReadWriteLockPrivate::lockForRead(int timeout) { - Q_ASSERT(!mutex.try_lock()); // mutex must be locked when entering this function + Q_ASSERT(!mutex.tryLock()); // mutex must be locked when entering this function QElapsedTimer t; if (timeout > 0) @@ -482,10 +477,10 @@ bool QReadWriteLockPrivate::lockForRead(std::unique_lock<std::mutex> &lock, int if (elapsed > timeout) return false; waitingReaders++; - readerCond.wait_for(lock, ms{timeout - elapsed}); + readerCond.wait(&mutex, timeout - elapsed); } else { waitingReaders++; - readerCond.wait(lock); + readerCond.wait(&mutex); } waitingReaders--; } @@ -494,9 +489,9 @@ bool QReadWriteLockPrivate::lockForRead(std::unique_lock<std::mutex> &lock, int return true; } -bool QReadWriteLockPrivate::lockForWrite(std::unique_lock<std::mutex> &lock, int timeout) +bool QReadWriteLockPrivate::lockForWrite(int timeout) { - Q_ASSERT(!mutex.try_lock()); // mutex must be locked when entering this function + Q_ASSERT(!mutex.tryLock()); // mutex must be locked when entering this function QElapsedTimer t; if (timeout > 0) @@ -511,15 +506,15 @@ bool QReadWriteLockPrivate::lockForWrite(std::unique_lock<std::mutex> &lock, int if (waitingReaders && !waitingWriters && !writerCount) { // We timed out and now there is no more writers or waiting writers, but some // readers were queueud (probably because of us). Wake the waiting readers. - readerCond.notify_all(); + readerCond.wakeAll(); } return false; } waitingWriters++; - writerCond.wait_for(lock, ms{timeout - elapsed}); + writerCond.wait(&mutex, timeout - elapsed); } else { waitingWriters++; - writerCond.wait(lock); + writerCond.wait(&mutex); } waitingWriters--; } @@ -532,11 +527,11 @@ bool QReadWriteLockPrivate::lockForWrite(std::unique_lock<std::mutex> &lock, int void QReadWriteLockPrivate::unlock() { - Q_ASSERT(!mutex.try_lock()); // mutex must be locked when entering this function + Q_ASSERT(!mutex.tryLock()); // mutex must be locked when entering this function if (waitingWriters) - writerCond.notify_one(); + writerCond.wakeOne(); else if (waitingReaders) - readerCond.notify_all(); + readerCond.wakeAll(); } bool QReadWriteLockPrivate::recursiveLockForRead(int timeout) @@ -552,7 +547,7 @@ bool QReadWriteLockPrivate::recursiveLockForRead(int timeout) return true; } - if (!lockForRead(lock, timeout)) + if (!lockForRead(timeout)) return false; currentReaders.insert(self, 1); @@ -570,7 +565,7 @@ bool QReadWriteLockPrivate::recursiveLockForWrite(int timeout) return true; } - if (!lockForWrite(lock, timeout)) + if (!lockForWrite(timeout)) return false; currentWriter = self; diff --git a/src/corelib/thread/qreadwritelock_p.h b/src/corelib/thread/qreadwritelock_p.h index b2e782f9ee..a4d002b7f2 100644 --- a/src/corelib/thread/qreadwritelock_p.h +++ b/src/corelib/thread/qreadwritelock_p.h @@ -54,9 +54,7 @@ #include <QtCore/private/qglobal_p.h> #include <QtCore/qhash.h> - -#include <mutex> -#include <condition_variable> +#include <QtCore/qwaitcondition.h> QT_REQUIRE_CONFIG(thread); @@ -68,9 +66,9 @@ public: explicit QReadWriteLockPrivate(bool isRecursive = false) : recursive(isRecursive) {} - std::mutex mutex; - std::condition_variable writerCond; - std::condition_variable readerCond; + QMutex mutex; + QWaitCondition writerCond; + QWaitCondition readerCond; int readerCount = 0; int writerCount = 0; int waitingReaders = 0; @@ -78,8 +76,8 @@ public: const bool recursive; //Called with the mutex locked - bool lockForWrite(std::unique_lock<std::mutex> &lock, int timeout); - bool lockForRead(std::unique_lock<std::mutex> &lock, int timeout); + bool lockForWrite(int timeout); + bool lockForRead(int timeout); void unlock(); //memory management diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 616cca1422..d41e3e5e3c 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -931,6 +931,30 @@ QWheelEvent::~QWheelEvent() \endlist */ +/*! + \fn QPoint QWheelEvent::position() const + + Returns the position of the mouse cursor relative to the widget + that received the event. + + If you move your widgets around in response to mouse events, + use globalPosition() instead of this function. + + \sa globalPosition() +*/ + +/*! + \fn QPoint QWheelEvent::globalPosition() const + + Returns the global position of the mouse pointer \e{at the time + of the event}. This is important on asynchronous window systems + such as X11; whenever you move your widgets around in response to + mouse events, globalPosition() can differ a lot from the current + cursor position returned by QCursor::pos(). + + \sa position() +*/ + #if QT_DEPRECATED_SINCE(5, 15) /*! \fn int QWheelEvent::delta() const diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index b73d90529a..bf00d4a9a3 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -959,6 +959,7 @@ public: friend class QGuiApplicationPrivate; friend class QApplication; friend class QApplicationPrivate; + friend class QQuickPointerTouchEvent; }; #if QT_DEPRECATED_SINCE(5, 0) diff --git a/src/gui/kernel/qevent_p.h b/src/gui/kernel/qevent_p.h index c2d8bd72b9..b7645496f8 100644 --- a/src/gui/kernel/qevent_p.h +++ b/src/gui/kernel/qevent_p.h @@ -67,7 +67,8 @@ public: state(Qt::TouchPointReleased), pressure(-1), rotation(0), - ellipseDiameters(0, 0) + ellipseDiameters(0, 0), + stationaryWithModifiedProperty(false) { } inline QTouchEventTouchPointPrivate *detach() @@ -91,6 +92,7 @@ public: QSizeF ellipseDiameters; QVector2D velocity; QTouchEvent::TouchPoint::InfoFlags flags; + bool stationaryWithModifiedProperty : 1; QVector<QPointF> rawScreenPositions; }; diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index c21bc90d39..c5d8cf9bf9 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -2845,10 +2845,12 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To if (touchPoint.state() == Qt::TouchPointStationary) { if (touchInfo.touchPoint.velocity() != touchPoint.velocity()) { touchInfo.touchPoint.setVelocity(touchPoint.velocity()); + touchPoint.d->stationaryWithModifiedProperty = true; stationaryTouchPointChangedProperty = true; } if (!qFuzzyCompare(touchInfo.touchPoint.pressure(), touchPoint.pressure())) { touchInfo.touchPoint.setPressure(touchPoint.pressure()); + touchPoint.d->stationaryWithModifiedProperty = true; stationaryTouchPointChangedProperty = true; } } else { diff --git a/src/gui/rhi/qshaderdescription.cpp b/src/gui/rhi/qshaderdescription.cpp index c38a83c497..179d5f3a07 100644 --- a/src/gui/rhi/qshaderdescription.cpp +++ b/src/gui/rhi/qshaderdescription.cpp @@ -1022,7 +1022,7 @@ void QShaderDescriptionPrivate::loadDoc(const QJsonDocument &doc) return; } - Q_ASSERT(ref.load() == 1); // must be detached + Q_ASSERT(ref.loadRelaxed() == 1); // must be detached inVars.clear(); outVars.clear(); diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 3652a180a8..22c249d604 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -1970,9 +1970,12 @@ void QTextDocument::print(QPagedPaintDevice *printer) const QRectF body = QRectF(QPointF(0, 0), d->pageSize); QPointF pageNumberPos; + qreal sourceDpiX = qt_defaultDpiX(); + qreal sourceDpiY = qt_defaultDpiY(); + const qreal dpiScaleX = qreal(printer->logicalDpiX()) / sourceDpiX; + const qreal dpiScaleY = qreal(printer->logicalDpiY()) / sourceDpiY; + if (documentPaginated) { - qreal sourceDpiX = qt_defaultDpi(); - qreal sourceDpiY = sourceDpiX; QPaintDevice *dev = doc->documentLayout()->paintDevice(); if (dev) { @@ -1980,9 +1983,6 @@ void QTextDocument::print(QPagedPaintDevice *printer) const sourceDpiY = dev->logicalDpiY(); } - const qreal dpiScaleX = qreal(printer->logicalDpiX()) / sourceDpiX; - const qreal dpiScaleY = qreal(printer->logicalDpiY()) / sourceDpiY; - // scale to dpi p.scale(dpiScaleX, dpiScaleY); @@ -2011,15 +2011,21 @@ void QTextDocument::print(QPagedPaintDevice *printer) const // copy the custom object handlers layout->d_func()->handlers = documentLayout()->d_func()->handlers; - int dpiy = p.device()->logicalDpiY(); - int margin = (int) ((2/2.54)*dpiy); // 2 cm margins + // 2 cm margins, scaled to device in QTextDocumentLayoutPrivate::layoutFrame + const int horizontalMargin = int((2/2.54)*sourceDpiX); + const int verticalMargin = int((2/2.54)*sourceDpiY); QTextFrameFormat fmt = doc->rootFrame()->frameFormat(); - fmt.setMargin(margin); + fmt.setLeftMargin(horizontalMargin); + fmt.setRightMargin(horizontalMargin); + fmt.setTopMargin(verticalMargin); + fmt.setBottomMargin(verticalMargin); doc->rootFrame()->setFrameFormat(fmt); + // pageNumberPos must be in device coordinates, so scale to device here + const int dpiy = p.device()->logicalDpiY(); body = QRectF(0, 0, printer->width(), printer->height()); - pageNumberPos = QPointF(body.width() - margin, - body.height() - margin + pageNumberPos = QPointF(body.width() - horizontalMargin * dpiScaleX, + body.height() - verticalMargin * dpiScaleY + QFontMetrics(doc->defaultFont(), p.device()).ascent() + 5 * dpiy / 72.0); clonedDoc->setPageSize(body.size()); diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp index b02723c047..a9a177da8b 100644 --- a/src/gui/text/qtextdocumentlayout.cpp +++ b/src/gui/text/qtextdocumentlayout.cpp @@ -2915,24 +2915,24 @@ QRectF QTextDocumentLayoutPrivate::layoutFrame(QTextFrame *f, int layoutFrom, in { QTextFrameFormat fformat = f->frameFormat(); // set sizes of this frame from the format - QFixed tm = QFixed::fromReal(fformat.topMargin()); + QFixed tm = QFixed::fromReal(scaleToDevice(fformat.topMargin())).round(); if (tm != fd->topMargin) { fd->topMargin = tm; fullLayout = true; } - QFixed bm = QFixed::fromReal(fformat.bottomMargin()); + QFixed bm = QFixed::fromReal(scaleToDevice(fformat.bottomMargin())).round(); if (bm != fd->bottomMargin) { fd->bottomMargin = bm; fullLayout = true; } - fd->leftMargin = QFixed::fromReal(fformat.leftMargin()); - fd->rightMargin = QFixed::fromReal(fformat.rightMargin()); - QFixed b = QFixed::fromReal(fformat.border()); + fd->leftMargin = QFixed::fromReal(scaleToDevice(fformat.leftMargin())).round(); + fd->rightMargin = QFixed::fromReal(scaleToDevice(fformat.rightMargin())).round(); + QFixed b = QFixed::fromReal(scaleToDevice(fformat.border())).round(); if (b != fd->border) { fd->border = b; fullLayout = true; } - QFixed p = QFixed::fromReal(fformat.padding()); + QFixed p = QFixed::fromReal(scaleToDevice(fformat.padding())).round(); if (p != fd->padding) { fd->padding = p; fullLayout = true; diff --git a/src/plugins/platforms/wasm/qwasmbackingstore.cpp b/src/plugins/platforms/wasm/qwasmbackingstore.cpp index e8eda2605f..7e8a382512 100644 --- a/src/plugins/platforms/wasm/qwasmbackingstore.cpp +++ b/src/plugins/platforms/wasm/qwasmbackingstore.cpp @@ -81,6 +81,11 @@ void QWasmBackingStore::updateTexture() if (m_dirty.isNull()) return; + if (m_recreateTexture && m_texture->isCreated()) { + m_recreateTexture = false; + m_texture->destroy(); + } + if (!m_texture->isCreated()) { m_texture->setMinificationFilter(QOpenGLTexture::Nearest); m_texture->setMagnificationFilter(QOpenGLTexture::Nearest); @@ -146,9 +151,7 @@ void QWasmBackingStore::resize(const QSize &size, const QRegion &staticContents) m_image = QImage(size * window()->devicePixelRatio(), QImage::Format_RGB32); m_image.setDevicePixelRatio(window()->devicePixelRatio()); - - if (m_texture->isCreated()) - m_texture->destroy(); + m_recreateTexture = true; } QImage QWasmBackingStore::toImage() const diff --git a/src/plugins/platforms/wasm/qwasmbackingstore.h b/src/plugins/platforms/wasm/qwasmbackingstore.h index 4bca83c457..b93c96b483 100644 --- a/src/plugins/platforms/wasm/qwasmbackingstore.h +++ b/src/plugins/platforms/wasm/qwasmbackingstore.h @@ -64,6 +64,7 @@ private: QImage m_image; QScopedPointer<QOpenGLTexture> m_texture; QRegion m_dirty; + bool m_recreateTexture = false; }; QT_END_NAMESPACE diff --git a/src/widgets/graphicsview/qgraphicsscene.h b/src/widgets/graphicsview/qgraphicsscene.h index 3cc00ead08..d36a871533 100644 --- a/src/widgets/graphicsview/qgraphicsscene.h +++ b/src/widgets/graphicsview/qgraphicsscene.h @@ -115,7 +115,7 @@ public: BspTreeIndex, NoIndex = -1 }; - + Q_ENUM(ItemIndexMethod) enum SceneLayer { ItemLayer = 0x1, BackgroundLayer = 0x2, diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index dd225fbec3..48d2e268b8 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -615,7 +615,7 @@ public: public: int features; QBrush defaultBackground; - QFont font; + QFont font; // Be careful using this font directly. Prefer using font.resolve( ) bool hasFont; QHash<QString, QVariant> styleHints; @@ -3211,7 +3211,7 @@ void QStyleSheetStyle::drawComplexControl(ComplexControl cc, const QStyleOptionC rule.drawRule(p, opt->rect); toolOpt.rect = rule.contentsRect(opt->rect); if (rule.hasFont) - toolOpt.font = rule.font; + toolOpt.font = rule.font.resolve(toolOpt.font); drawControl(CE_ToolButtonLabel, &toolOpt, p, w); } @@ -3514,7 +3514,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q const QFont oldFont = p->font(); if (rule.hasFont) - p->setFont(rule.font); + p->setFont(rule.font.resolve(p->font())); if (rule.hasPosition() && rule.position()->textAlignment != 0) { Qt::Alignment textAlignment = rule.position()->textAlignment; @@ -3678,7 +3678,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q subRule.configurePalette(&mi.palette, QPalette::HighlightedText, QPalette::Highlight); QFont oldFont = p->font(); if (subRule.hasFont) - p->setFont(subRule.font.resolve(p->font())); + p->setFont(subRule.font.resolve(mi.font)); else p->setFont(mi.font); @@ -4084,7 +4084,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q subRule.configurePalette(&boxCopy.palette, QPalette::ButtonText, QPalette::Button); QFont oldFont = p->font(); if (subRule.hasFont) - p->setFont(subRule.font); + p->setFont(subRule.font.resolve(p->font())); boxCopy.rect = subRule.contentsRect(opt->rect); if (subRule.hasImage()) { // the image is already drawn with CE_ToolBoxTabShape, adjust rect here @@ -4171,7 +4171,7 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q subRule.configurePalette(&tabCopy.palette, QPalette::WindowText, QPalette::Base); QFont oldFont = p->font(); if (subRule.hasFont) - p->setFont(subRule.font); + p->setFont(subRule.font.resolve(p->font())); if (subRule.hasBox() || !subRule.hasNativeBorder()) { tabCopy.rect = ce == CE_TabBarTabShape ? subRule.borderRect(r) : subRule.contentsRect(r); @@ -5035,8 +5035,12 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op bool nullIcon = hdr->icon.isNull(); const int margin = pixelMetric(QStyle::PM_HeaderMargin, hdr, w); int iconSize = nullIcon ? 0 : pixelMetric(QStyle::PM_SmallIconSize, hdr, w); - const QSize txt = subRule.hasFont ? QFontMetrics(subRule.font).size(0, hdr->text) - : hdr->fontMetrics.size(0, hdr->text); + QFontMetrics fm = hdr->fontMetrics; + if (subRule.hasFont) { + QFont styleFont = w ? subRule.font.resolve(w->font()) : subRule.font; + fm = QFontMetrics(styleFont); + } + const QSize txt = fm.size(0, hdr->text); nativeContentsSize.setHeight(margin + qMax(iconSize, txt.height()) + margin); nativeContentsSize.setWidth((nullIcon ? 0 : margin) + iconSize + (hdr->text.isNull() ? 0 : margin) + txt.width() + margin); |