diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/configure.json | 5 | ||||
-rw-r--r-- | src/gui/image/qbmphandler.cpp | 55 | ||||
-rw-r--r-- | src/gui/kernel/qevent.cpp | 20 | ||||
-rw-r--r-- | src/gui/kernel/qevent.h | 3 | ||||
-rw-r--r-- | src/gui/kernel/qkeysequence.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qopenglcontext_p.h | 2 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 24 | ||||
-rw-r--r-- | src/gui/kernel/qwindow_p.h | 4 | ||||
-rw-r--r-- | src/gui/painting/qplatformbackingstore.cpp | 32 | ||||
-rw-r--r-- | src/gui/painting/qplatformbackingstore.h | 2 | ||||
-rw-r--r-- | src/gui/util/qdesktopservices.cpp | 13 | ||||
-rw-r--r-- | src/gui/vulkan/qvulkaninstance.cpp | 4 |
12 files changed, 107 insertions, 59 deletions
diff --git a/src/gui/configure.json b/src/gui/configure.json index 17b4c3df2c..0a591e110c 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -443,6 +443,7 @@ "xcb/xfixes.h", "xcb/xcb_image.h", "xcb/xcb_keysyms.h", + "xcb/xinerama.h", "xcb/sync.h", "xcb/randr.h", "xcb/shm.h" @@ -460,8 +461,8 @@ }, "sources": [ { "type": "pkgConfig", - "args": "xcb xcb-shm xcb-sync xcb-xfixes xcb-randr xcb-image xcb-keysyms xcb-icccm xcb-shape" }, - "-lxcb -lxcb-shm -lxcb-sync -lxcb-xfixes -lxcb-randr -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-shape" + "args": "xcb xcb-shm xcb-sync xcb-xfixes xcb-xinerama xcb-randr xcb-image xcb-keysyms xcb-icccm xcb-shape" }, + "-lxcb -lxcb-shm -lxcb-sync -lxcb-xfixes -lxcb-xinerama -lxcb-randr -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-shape" ] }, "xcb_xlib": { diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp index c232a84e4f..1ec45a7491 100644 --- a/src/gui/image/qbmphandler.cpp +++ b/src/gui/image/qbmphandler.cpp @@ -562,27 +562,12 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, qint64 offset, } // this is also used in qmime_win.cpp -bool qt_write_dib(QDataStream &s, QImage image) +bool qt_write_dib(QDataStream &s, const QImage &image, int bpl, int bpl_bmp, int nbits) { - int nbits; - int bpl_bmp; - int bpl = image.bytesPerLine(); - QIODevice* d = s.device(); if (!d->isWritable()) return false; - if (image.depth() == 8 && image.colorCount() <= 16) { - bpl_bmp = (((bpl+1)/2+3)/4)*4; - nbits = 4; - } else if (image.depth() == 32) { - bpl_bmp = ((image.width()*24+31)/32)*4; - nbits = 24; - } else { - bpl_bmp = bpl; - nbits = image.depth(); - } - BMP_INFOHDR bi; bi.biSize = BMP_WIN; // build info header bi.biWidth = image.width(); @@ -617,9 +602,6 @@ bool qt_write_dib(QDataStream &s, QImage image) delete [] color_table; } - if (image.format() == QImage::Format_MonoLSB) - image = image.convertToFormat(QImage::Format_Mono); - int y; if (nbits == 1 || nbits == 8) { // direct output @@ -769,21 +751,17 @@ bool QBmpHandler::read(QImage *image) bool QBmpHandler::write(const QImage &img) { - if (m_format == DibFormat) { - QDataStream dibStream(device()); - dibStream.setByteOrder(QDataStream::LittleEndian); // Intel byte order - return qt_write_dib(dibStream, img); - } - QImage image; switch (img.format()) { case QImage::Format_Mono: - case QImage::Format_MonoLSB: case QImage::Format_Indexed8: case QImage::Format_RGB32: case QImage::Format_ARGB32: image = img; break; + case QImage::Format_MonoLSB: + image = img.convertToFormat(QImage::Format_Mono); + break; case QImage::Format_Alpha8: case QImage::Format_Grayscale8: image = img.convertToFormat(QImage::Format_Indexed8); @@ -796,21 +774,32 @@ bool QBmpHandler::write(const QImage &img) break; } - QIODevice *d = device(); - QDataStream s(d); - BMP_FILEHDR bf; + int nbits; int bpl_bmp; - int bpl = image.bytesPerLine(); + // Calculate a minimum bytes-per-line instead of using whatever value this QImage is using internally. + int bpl = ((image.width() * image.depth() + 31) >> 5) << 2; - // Code partially repeated in qt_write_dib if (image.depth() == 8 && image.colorCount() <= 16) { bpl_bmp = (((bpl+1)/2+3)/4)*4; - } else if (image.depth() == 32) { + nbits = 4; + } else if (image.depth() == 32) { bpl_bmp = ((image.width()*24+31)/32)*4; + nbits = 24; } else { bpl_bmp = bpl; + nbits = image.depth(); } + if (m_format == DibFormat) { + QDataStream dibStream(device()); + dibStream.setByteOrder(QDataStream::LittleEndian); // Intel byte order + return qt_write_dib(dibStream, img, bpl, bpl_bmp, nbits); + } + + QIODevice *d = device(); + QDataStream s(d); + BMP_FILEHDR bf; + // Intel byte order s.setByteOrder(QDataStream::LittleEndian); @@ -825,7 +814,7 @@ bool QBmpHandler::write(const QImage &img) s << bf; // write image - return qt_write_dib(s, image); + return qt_write_dib(s, image, bpl, bpl_bmp, nbits); } bool QBmpHandler::supportsOption(ImageOption option) const diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 55339cac8c..8f153fa2d3 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -2763,12 +2763,16 @@ Qt::MouseButtons QTabletEvent::buttons() const #if QT_DEPRECATED_SINCE(5, 10) QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, qreal realValue, ulong sequenceId, quint64 intValue) - : QInputEvent(QEvent::NativeGesture), mGestureType(type), mTouchDeviceId(255), + : QInputEvent(QEvent::NativeGesture), mGestureType(type), mLocalPos(localPos), mWindowPos(windowPos), mScreenPos(screenPos), mRealValue(realValue), mSequenceId(sequenceId), mIntValue(intValue) { } #endif +typedef QHash<const QNativeGestureEvent*, const QTouchDevice*> NativeGestureEventDataHash; +// ### Qt6: move this to a member in QNativeGestureEvent +Q_GLOBAL_STATIC(NativeGestureEventDataHash, g_nativeGestureEventDataHash) + /*! Constructs a native gesture event of type \a type originating from \a device. @@ -2779,13 +2783,19 @@ QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QPoin \a realValue is the \macos event parameter, \a sequenceId and \a intValue are the Windows event parameters. \since 5.10 */ -QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QTouchDevice *device, const QPointF &localPos, const QPointF &windowPos, +QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QTouchDevice *dev, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, qreal realValue, ulong sequenceId, quint64 intValue) : QInputEvent(QEvent::NativeGesture), mGestureType(type), - mTouchDeviceId(QTouchDevicePrivate::get(const_cast<QTouchDevice *>(device))->id), mLocalPos(localPos), mWindowPos(windowPos), mScreenPos(screenPos), mRealValue(realValue), mSequenceId(sequenceId), mIntValue(intValue) -{ } +{ + g_nativeGestureEventDataHash->insert(this, dev); +} + +QNativeGestureEvent::~QNativeGestureEvent() +{ + g_nativeGestureEventDataHash->remove(this); +} /*! \since 5.10 @@ -2795,7 +2805,7 @@ QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QTouc const QTouchDevice *QNativeGestureEvent::device() const { - return QTouchDevicePrivate::deviceById(mTouchDeviceId); + return g_nativeGestureEventDataHash->value(this); } /*! diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index c3c7e52ece..b3f6d56543 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -307,6 +307,7 @@ public: #endif QNativeGestureEvent(Qt::NativeGestureType type, const QTouchDevice *dev, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, qreal value, ulong sequenceId, quint64 intArgument); + ~QNativeGestureEvent(); Qt::NativeGestureType gestureType() const { return mGestureType; } qreal value() const { return mRealValue; } @@ -322,8 +323,6 @@ public: protected: Qt::NativeGestureType mGestureType; - quint8 mTouchDeviceId; // QTouchDevicePrivate::id - quint8 mReserved[3]; // if qreal == double clang will pad the QPointF below to a 8-byte boundary QPointF mLocalPos; QPointF mWindowPos; QPointF mScreenPos; diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp index 9a3d1b0d3a..71ecc46cb6 100644 --- a/src/gui/kernel/qkeysequence.cpp +++ b/src/gui/kernel/qkeysequence.cpp @@ -250,7 +250,7 @@ void Q_GUI_EXPORT qt_set_sequence_auto_mnemonic(bool b) { qt_sequence_no_mnemoni corresponds to the \uicontrol Control keys. \table - \header \li StandardKey \li Windows \li \macos \li KDE \li GNOME + \header \li StandardKey \li Windows \li \macos \li KDE Plasma \li GNOME \row \li HelpContents \li F1 \li Ctrl+? \li F1 \li F1 \row \li WhatsThis \li Shift+F1 \li Shift+F1 \li Shift+F1 \li Shift+F1 \row \li Open \li Ctrl+O \li Ctrl+O \li Ctrl+O \li Ctrl+O diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h index c5239af69e..4f2f951d61 100644 --- a/src/gui/kernel/qopenglcontext_p.h +++ b/src/gui/kernel/qopenglcontext_p.h @@ -55,7 +55,7 @@ #ifndef QT_NO_OPENGL -#include "qopengl.h" +#include <qopengl.h> #include "qopenglcontext.h" #include <private/qobject_p.h> #include <qmutex.h> diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 5b5c1bd0e3..9969124339 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -45,6 +45,7 @@ #ifndef QT_NO_OPENGL #include <qpa/qplatformopenglcontext.h> #include "qopenglcontext.h" +#include "qopenglcontext_p.h" #endif #include "qscreen.h" @@ -971,6 +972,11 @@ QString QWindow::filePath() const The window icon might be used by the windowing system for example to decorate the window, and/or in the task switcher. + + \note On \macos, the window title bar icon is meant for windows representing + documents, and will only show up if a file path is also set. + + \sa setFilePath() */ void QWindow::setIcon(const QIcon &icon) { @@ -983,7 +989,7 @@ void QWindow::setIcon(const QIcon &icon) } /*! - \brief Sets the window's icon in the windowing system + \brief Returns the window's icon in the windowing system \sa setIcon() */ @@ -1882,11 +1888,16 @@ void QWindowPrivate::destroy() QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed); QGuiApplication::sendEvent(q, &e); - delete platformWindow; + // Unset platformWindow before deleting, so that the destructor of the + // platform window does not recurse back into the platform window via + // this window during destruction (e.g. as a result of platform events). + QPlatformWindow *pw = platformWindow; + platformWindow = nullptr; + delete pw; + resizeEventPending = true; receivedExpose = false; exposed = false; - platformWindow = 0; if (wasVisible) maybeQuitOnLastWindowClosed(); @@ -2623,6 +2634,13 @@ QWindow *QWindowPrivate::topLevelWindow() const return window; } +#if QT_CONFIG(opengl) +QOpenGLContext *QWindowPrivate::shareContext() const +{ + return qt_gl_global_share_context(); +}; +#endif + /*! Creates a local representation of a window created by another process or by using native libraries below Qt. diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h index 9b8e2c47e4..2de5aab2c4 100644 --- a/src/gui/kernel/qwindow_p.h +++ b/src/gui/kernel/qwindow_p.h @@ -130,6 +130,10 @@ public: QWindow *topLevelWindow() const; +#if QT_CONFIG(opengl) + virtual QOpenGLContext *shareContext() const; +#endif + virtual QWindow *eventReceiver() { Q_Q(QWindow); return q; } virtual void setVisible(bool visible); diff --git a/src/gui/painting/qplatformbackingstore.cpp b/src/gui/painting/qplatformbackingstore.cpp index 4d1c4932c8..09c23fdfa1 100644 --- a/src/gui/painting/qplatformbackingstore.cpp +++ b/src/gui/painting/qplatformbackingstore.cpp @@ -50,6 +50,7 @@ #include <QtGui/QOpenGLFunctions> #ifndef QT_NO_OPENGL #include <QtGui/qopengltextureblitter.h> +#include <QtGui/qoffscreensurface.h> #endif #include <qpa/qplatformgraphicsbuffer.h> #include <qpa/qplatformgraphicsbufferhelper.h> @@ -95,14 +96,15 @@ public: ~QPlatformBackingStorePrivate() { #ifndef QT_NO_OPENGL - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - if (ctx) { + if (context) { + QOffscreenSurface offscreenSurface; + offscreenSurface.setFormat(context->format()); + offscreenSurface.create(); + context->makeCurrent(&offscreenSurface); if (textureId) - ctx->functions()->glDeleteTextures(1, &textureId); + context->functions()->glDeleteTextures(1, &textureId); if (blitter) blitter->destroy(); - } else if (textureId || blitter) { - qWarning("No context current during QPlatformBackingStore destruction, OpenGL resources not released"); } delete blitter; #endif @@ -110,6 +112,7 @@ public: QWindow *window; QBackingStore *backingStore; #ifndef QT_NO_OPENGL + QScopedPointer<QOpenGLContext> context; mutable GLuint textureId; mutable QSize textureSize; mutable bool needsSwizzle; @@ -316,20 +319,31 @@ static void blitTextureForWidget(const QPlatformTextureList *textures, int idx, void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion ®ion, const QPoint &offset, - QPlatformTextureList *textures, QOpenGLContext *context, + QPlatformTextureList *textures, bool translucentBackground) { if (!qt_window_private(window)->receivedExpose) return; - if (!context->makeCurrent(window)) { + if (!d_ptr->context) { + d_ptr->context.reset(new QOpenGLContext); + d_ptr->context->setFormat(d_ptr->window->requestedFormat()); + d_ptr->context->setScreen(d_ptr->window->screen()); + d_ptr->context->setShareContext(qt_window_private(d_ptr->window)->shareContext()); + if (!d_ptr->context->create()) { + qWarning("composeAndFlush: QOpenGLContext creation failed"); + return; + } + } + + if (!d_ptr->context->makeCurrent(window)) { qWarning("composeAndFlush: makeCurrent() failed"); return; } QWindowPrivate::get(window)->lastComposeTime.start(); - QOpenGLFunctions *funcs = context->functions(); + QOpenGLFunctions *funcs = d_ptr->context->functions(); funcs->glViewport(0, 0, window->width() * window->devicePixelRatio(), window->height() * window->devicePixelRatio()); funcs->glClearColor(0, 0, 0, translucentBackground ? 0 : 1); funcs->glClear(GL_COLOR_BUFFER_BIT); @@ -435,7 +449,7 @@ void QPlatformBackingStore::composeAndFlush(QWindow *window, const QRegion ®i funcs->glDisable(GL_BLEND); d_ptr->blitter->release(); - context->swapBuffers(window); + d_ptr->context->swapBuffers(window); } #endif /*! diff --git a/src/gui/painting/qplatformbackingstore.h b/src/gui/painting/qplatformbackingstore.h index 9956c032a9..381c564079 100644 --- a/src/gui/painting/qplatformbackingstore.h +++ b/src/gui/painting/qplatformbackingstore.h @@ -120,7 +120,7 @@ public: virtual void flush(QWindow *window, const QRegion ®ion, const QPoint &offset) = 0; #ifndef QT_NO_OPENGL virtual void composeAndFlush(QWindow *window, const QRegion ®ion, const QPoint &offset, - QPlatformTextureList *textures, QOpenGLContext *context, + QPlatformTextureList *textures, bool translucentBackground); #endif virtual QImage toImage() const; diff --git a/src/gui/util/qdesktopservices.cpp b/src/gui/util/qdesktopservices.cpp index c9747877f7..77ccc02aa5 100644 --- a/src/gui/util/qdesktopservices.cpp +++ b/src/gui/util/qdesktopservices.cpp @@ -177,6 +177,19 @@ void QOpenUrlHandlerRegistry::handlerDestroyed(QObject *handler) still fail to launch or fail to open the requested URL. This result will not be reported back to the application. + \warning URLs passed to this function on iOS will not load unless their schemes are + listed in the \c LSApplicationQueriesSchemes key of the application's Info.plist file. + For more information, see the Apple Developer Documentation for + \l{https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl}{canOpenURL(_:)}. + For example, the following lines enable URLs with the HTTPS scheme: + + \code + <key>LSApplicationQueriesSchemes</key> + <array> + <string>https</string> + </array> + \endcode + \sa setUrlHandler() */ bool QDesktopServices::openUrl(const QUrl &url) diff --git a/src/gui/vulkan/qvulkaninstance.cpp b/src/gui/vulkan/qvulkaninstance.cpp index 8f364328d6..2e03be8151 100644 --- a/src/gui/vulkan/qvulkaninstance.cpp +++ b/src/gui/vulkan/qvulkaninstance.cpp @@ -808,7 +808,7 @@ QVulkanFunctions *QVulkanInstance::functions() const */ QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device) { - QVulkanDeviceFunctions *&f(d_ptr->deviceFuncs[device]); + QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device]; if (!f) f = new QVulkanDeviceFunctions(this, device); return f; @@ -829,7 +829,7 @@ QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device) */ void QVulkanInstance::resetDeviceFunctions(VkDevice device) { - QVulkanDeviceFunctions *&f(d_ptr->deviceFuncs[device]); + QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device]; delete f; f = nullptr; } |