Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package libqt5-qtwayland for
openSUSE:Factory checked in at 2022-09-27 20:09:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libqt5-qtwayland (Old)
and /work/SRC/openSUSE:Factory/.libqt5-qtwayland.new.2275 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libqt5-qtwayland"
Tue Sep 27 20:09:46 2022 rev:46 rq:1006242 version:5.15.6+kde49
Changes:
--------
--- /work/SRC/openSUSE:Factory/libqt5-qtwayland/libqt5-qtwayland.changes
2022-06-29 16:01:27.388630548 +0200
+++
/work/SRC/openSUSE:Factory/.libqt5-qtwayland.new.2275/libqt5-qtwayland.changes
2022-09-27 20:10:18.785348309 +0200
@@ -1,0 +2,22 @@
+Mon Sep 26 12:03:24 UTC 2022 - Fabian Vogt <[email protected]>
+
+- Update to version 5.15.6+kde49, rebased upstream:
+ * Call `finishDrag()` in `QWaylandDataDevice::dragSourceCancelled()`
+ * Client: support high-dpi mode for window icon
+ * Avoid calling requestUpdate from wrong thread
+ * Fix missing update when toggling client-side decorations
+ * Use CRLF line delimiter for text/uri-list data
+ * Fix compile tests
+ * client: Synthesize enter/leave event for popup in xdg-shell
+ * Guard mResizeDirty by the correctMutex
+ * Client: clear focus on touch cancel
+ * Build fixes for GCC 11
+ * Only close popup in the the hierchary
+ * Cleanup up all subsurface QQuickItems correctly
+ * linux-dmabuf-unstable-v1: Fix importing dmabuf buffers with modifiers
+ * Add BlankCursor for cursor names map
+ * client: Gracefully handle shutdown and window hiding
+- Drop patches, now upstream:
+ * 0002-Guard-mResizeDirty-by-the-correctMutex.patch
+
+-------------------------------------------------------------------
Old:
----
0002-Guard-mResizeDirty-by-the-correctMutex.patch
qtwayland-everywhere-src-5.15.5+kde39.obscpio
New:
----
qtwayland-everywhere-src-5.15.6+kde49.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libqt5-qtwayland.spec ++++++
--- /var/tmp/diff_new_pack.NQQh0U/_old 2022-09-27 20:10:19.481349844 +0200
+++ /var/tmp/diff_new_pack.NQQh0U/_new 2022-09-27 20:10:19.489349861 +0200
@@ -22,11 +22,11 @@
%define qt5_snapshot 1
%define libname libQt5WaylandCompositor5
%define base_name libqt5
-%define real_version 5.15.5
-%define so_version 5.15.5
+%define real_version 5.15.6
+%define so_version 5.15.6
%define tar_version qtwayland-everywhere-src-%{version}
Name: libqt5-qtwayland
-Version: 5.15.5+kde39
+Version: 5.15.6+kde49
Release: 0
Summary: Qt 5 Wayland Addon
# The wayland compositor files are GPL-3.0-or-later
@@ -35,8 +35,6 @@
URL: https://www.qt.io
Source: %{tar_version}.tar.xz
Source1: baselibs.conf
-# https://codereview.qt-project.org/c/qt/qtwayland/+/393828/1
-Patch3: 0002-Guard-mResizeDirty-by-the-correctMutex.patch
BuildRequires: fdupes
BuildRequires: libqt5-qtbase-private-headers-devel >= %{real_version}
BuildRequires: libqt5-qtdeclarative-private-headers-devel >= %{real_version}
++++++ _service ++++++
--- /var/tmp/diff_new_pack.NQQh0U/_old 2022-09-27 20:10:19.525349940 +0200
+++ /var/tmp/diff_new_pack.NQQh0U/_new 2022-09-27 20:10:19.525349940 +0200
@@ -1,12 +1,12 @@
<services>
<service name="obs_scm" mode="disabled">
<param name="changesgenerate">enable</param>
- <param name="versionformat">5.15.5+kde@TAG_OFFSET@</param>
+ <param name="versionformat">5.15.6+kde@TAG_OFFSET@</param>
<param name="url">https://invent.kde.org/qt/qt/qtwayland.git</param>
<param name="scm">git</param>
<param name="filename">qtwayland-everywhere-src</param>
<param name="revision">kde/5.15</param>
- <param name="parent-tag">v5.15.5-lts-lgpl</param>
+ <param name="parent-tag">v5.15.6-lts-lgpl</param>
<param name="changesgenerate">enable</param>
</service>
<service name="set_version" mode="disabled"/>
++++++ qtwayland-everywhere-src-5.15.5+kde39.obscpio ->
qtwayland-everywhere-src-5.15.6+kde49.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/qtwayland-everywhere-src-5.15.5+kde39/.qmake.conf
new/qtwayland-everywhere-src-5.15.6+kde49/.qmake.conf
--- old/qtwayland-everywhere-src-5.15.5+kde39/.qmake.conf 2022-06-20
22:17:21.000000000 +0200
+++ new/qtwayland-everywhere-src-5.15.6+kde49/.qmake.conf 2022-09-22
13:58:55.000000000 +0200
@@ -4,4 +4,4 @@
DEFINES += QT_NO_JAVA_STYLE_ITERATORS
DEFINES += QT_NO_LINKED_LIST
-MODULE_VERSION = 5.15.5
+MODULE_VERSION = 5.15.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandcursor.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandcursor.cpp
--- old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandcursor.cpp
2022-06-20 22:17:21.000000000 +0200
+++ new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandcursor.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -120,6 +120,8 @@
{SizeAllCursor, "size_all"},
+ {BlankCursor, "blank"},
+
{SplitVCursor, "split_v"},
{SplitVCursor, "row-resize"},
{SplitVCursor, "sb_v_double_arrow"},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylanddatadevice.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylanddatadevice.cpp
--- old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylanddatadevice.cpp
2022-06-20 22:17:21.000000000 +0200
+++ new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylanddatadevice.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -296,6 +296,7 @@
#if QT_CONFIG(draganddrop)
void QWaylandDataDevice::dragSourceCancelled()
{
+ static_cast<QWaylandDrag
*>(QGuiApplicationPrivate::platformIntegration()->drag())->finishDrag();
m_dragSource.reset();
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandinputdevice.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandinputdevice.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandinputdevice.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandinputdevice.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -1388,6 +1388,7 @@
if (touchExt)
touchExt->touchCanceled();
+ mFocus = nullptr;
QWindowSystemInterface::handleTouchCancelEvent(nullptr,
mParent->mTouchDevice);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandwindow.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandwindow.cpp
--- old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandwindow.cpp
2022-06-20 22:17:21.000000000 +0200
+++ new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandwindow.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -239,6 +239,7 @@
void QWaylandWindow::reset()
{
+ closeChildPopups();
delete mShellSurface;
mShellSurface = nullptr;
delete mSubSurfaceWindow;
@@ -357,11 +358,12 @@
if (mWindowDecoration)
mWindowDecoration->update();
- if (mResizeAfterSwap && windowType() == Egl && mSentInitialResize)
+ if (mResizeAfterSwap && windowType() == Egl && mSentInitialResize) {
+ QMutexLocker lock(&mResizeLock);
mResizeDirty = true;
- else
+ } else {
QWindowSystemInterface::handleGeometryChange(window(), geometry());
-
+ }
mSentInitialResize = true;
}
QRect exposeGeometry(QPoint(), geometry().size());
@@ -397,23 +399,9 @@
mLastExposeGeometry = rect;
}
-
-static QVector<QPointer<QWaylandWindow>> activePopups;
-
-void QWaylandWindow::closePopups(QWaylandWindow *parent)
-{
- while (!activePopups.isEmpty()) {
- auto popup = activePopups.takeLast();
- if (popup.isNull())
- continue;
- if (popup.data() == parent)
- return;
- popup->reset();
- }
-}
-
QPlatformScreen *QWaylandWindow::calculateScreenFromSurfaceEvents() const
{
+ QReadLocker lock(&mSurfaceLock);
if (mSurface) {
if (auto *screen = mSurface->oldestEnteredScreen())
return screen;
@@ -430,8 +418,6 @@
lastVisible = visible;
if (visible) {
- if (window()->type() == Qt::Popup || window()->type() == Qt::ToolTip)
- activePopups << this;
initWindow();
setGeometry(windowGeometry());
@@ -440,7 +426,6 @@
// QWaylandShmBackingStore::beginPaint().
} else {
sendExposeEvent(QRect());
- closePopups(this);
reset();
}
}
@@ -552,6 +537,10 @@
void QWaylandWindow::attach(QWaylandBuffer *buffer, int x, int y)
{
+ QReadLocker locker(&mSurfaceLock);
+ if (mSurface == nullptr)
+ return;
+
if (buffer) {
Q_ASSERT(!buffer->committed());
handleUpdate();
@@ -571,6 +560,10 @@
void QWaylandWindow::damage(const QRect &rect)
{
+ QReadLocker locker(&mSurfaceLock);
+ if (mSurface == nullptr)
+ return;
+
const int s = scale();
if (mDisplay->compositorVersion() >= 4)
mSurface->damage_buffer(s * rect.x(), s * rect.y(), s * rect.width(),
s * rect.height());
@@ -605,6 +598,8 @@
qCDebug(lcWaylandBackingstore) << "Buffer already committed,
ignoring.";
return;
}
+
+ QReadLocker locker(&mSurfaceLock);
if (!mSurface)
return;
@@ -624,7 +619,9 @@
void QWaylandWindow::commit()
{
- mSurface->commit();
+ QReadLocker locker(&mSurfaceLock);
+ if (mSurface != nullptr)
+ mSurface->commit();
}
const wl_callback_listener QWaylandWindow::callbackListener = {
@@ -723,6 +720,7 @@
wl_surface *QWaylandWindow::wlSurface()
{
+ QReadLocker locker(&mSurfaceLock);
return mSurface ? mSurface->object() : nullptr;
}
@@ -747,7 +745,8 @@
void QWaylandWindow::handleContentOrientationChange(Qt::ScreenOrientation
orientation)
{
- if (mDisplay->compositorVersion() < 2)
+ QReadLocker locker(&mSurfaceLock);
+ if (mDisplay->compositorVersion() < 2 || mSurface == nullptr)
return;
wl_output_transform transform;
@@ -868,6 +867,17 @@
subsurf->set_position(pos.x() + m.left(), pos.y() + m.top());
}
sendExposeEvent(QRect(QPoint(), geometry().size()));
+
+ // This is a special case where the buffer is recreated, but since
+ // the content rect remains the same, the widgets remain the same
+ // size and are not redrawn, leaving the new buffer empty. As a simple
+ // work-around, we trigger a full extra update whenever the client-side
+ // window decorations are toggled while the window is showing.
+ // Note: createDecoration() is sometimes called from the render thread
+ // of Qt Quick. This is essentially wrong and could potentially cause
problems,
+ // but until the underlying issue has been fixed, we have to use
invokeMethod()
+ // here to avoid asserts.
+ QMetaObject::invokeMethod(window(), &QWindow::requestUpdate);
}
return mWindowDecoration;
@@ -1285,6 +1295,20 @@
wl_region_destroy(region);
}
+void QWaylandWindow::addChildPopup(QWaylandWindow *surface) {
+ mChildPopups.append(surface);
+}
+
+void QWaylandWindow::removeChildPopup(QWaylandWindow *surface) {
+ mChildPopups.removeAll(surface);
+}
+
+void QWaylandWindow::closeChildPopups() {
+ while (!mChildPopups.isEmpty()) {
+ auto popup = mChildPopups.takeLast();
+ popup->reset();
+ }
+}
}
QT_END_NAMESPACE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandwindow_p.h
new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandwindow_p.h
--- old/qtwayland-everywhere-src-5.15.5+kde39/src/client/qwaylandwindow_p.h
2022-06-20 22:17:21.000000000 +0200
+++ new/qtwayland-everywhere-src-5.15.6+kde49/src/client/qwaylandwindow_p.h
2022-09-22 13:58:55.000000000 +0200
@@ -207,6 +207,10 @@
void handleUpdate();
void deliverUpdateRequest() override;
+ void addChildPopup(QWaylandWindow* child);
+ void removeChildPopup(QWaylandWindow* child);
+ void closeChildPopups();
+
public slots:
void applyConfigure();
@@ -262,6 +266,8 @@
QWaylandBuffer *mQueuedBuffer = nullptr;
QRegion mQueuedBufferDamage;
+ QList<QPointer<QWaylandWindow>> mChildPopups;
+
private:
void setGeometry_helper(const QRect &rect);
void initWindow();
@@ -288,7 +294,7 @@
static QWaylandWindow *mMouseGrab;
- QReadWriteLock mSurfaceLock;
+ mutable QReadWriteLock mSurfaceLock;
friend class QWaylandSubSurface;
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/compositor/compositor_api/qwaylandquickitem.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/compositor/compositor_api/qwaylandquickitem.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/compositor/compositor_api/qwaylandquickitem.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/compositor/compositor_api/qwaylandquickitem.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -737,6 +737,7 @@
childItem->setSurface(childSurface);
childItem->setVisible(true);
childItem->setParentItem(this);
+ childItem->setParent(this);
connect(childSurface, &QWaylandSurface::subsurfacePositionChanged,
childItem, &QWaylandQuickItem::handleSubsurfacePosition);
connect(childSurface, &QWaylandSurface::destroyed, childItem,
&QObject::deleteLater);
} else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -192,7 +192,6 @@
}
void blit(QWaylandEglWindow *window)
{
- Q_ASSERT(window->wlSurface());
QOpenGLTextureCache *cache =
QOpenGLTextureCache::cacheForContext(m_context->context());
QSize surfaceSize = window->surfaceSize();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabufclientbufferintegration.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabufclientbufferintegration.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabufclientbufferintegration.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabufclientbufferintegration.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -105,6 +105,11 @@
}
}
+// Initialize the EGLImage for a dmabuf buffer which conceptually consists of a
+// single plane. Note that depending on the modifiers, the buffer may be
actually
+// transported as multiple dmabuf planes which must be combined into a single
+// EGLImage. For formats where the buffer needs to be represented as multiple
+// EGLImages (e.g., various YUV formats) a different approach is required.
bool LinuxDmabufClientBufferIntegration::initSimpleTexture(LinuxDmabufWlBuffer
*dmabufBuffer)
{
bool success = true;
@@ -118,79 +123,67 @@
success = false;
}
- for (uint32_t i = 0; i < dmabufBuffer->planesNumber(); ++i) {
- QVarLengthArray<EGLint, 17> attribs;
- switch (i) {
- case 0:
- attribs = {
- EGL_WIDTH,
dmabufBuffer->size().width(),
- EGL_HEIGHT,
dmabufBuffer->size().height(),
- EGL_LINUX_DRM_FOURCC_EXT,
EGLint(dmabufBuffer->drmFormat()),
- EGL_DMA_BUF_PLANE0_FD_EXT, dmabufBuffer->plane(i).fd,
- EGL_DMA_BUF_PLANE0_OFFSET_EXT,
EGLint(dmabufBuffer->plane(i).offset),
- EGL_DMA_BUF_PLANE0_PITCH_EXT,
EGLint(dmabufBuffer->plane(i).stride),
- EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT,
EGLint(dmabufBuffer->plane(i).modifiers & 0xffffffff),
- EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT,
EGLint(dmabufBuffer->plane(i).modifiers >> 32),
- EGL_NONE
- };
- break;
- case 1:
- attribs = {
- EGL_WIDTH,
dmabufBuffer->size().width(),
- EGL_HEIGHT,
dmabufBuffer->size().height(),
- EGL_LINUX_DRM_FOURCC_EXT,
EGLint(dmabufBuffer->drmFormat()),
- EGL_DMA_BUF_PLANE1_FD_EXT, dmabufBuffer->plane(i).fd,
- EGL_DMA_BUF_PLANE1_OFFSET_EXT,
EGLint(dmabufBuffer->plane(i).offset),
- EGL_DMA_BUF_PLANE1_PITCH_EXT,
EGLint(dmabufBuffer->plane(i).stride),
- EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT,
EGLint(dmabufBuffer->plane(i).modifiers & 0xffffffff),
- EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT,
EGLint(dmabufBuffer->plane(i).modifiers >> 32),
- EGL_NONE
- };
- break;
- case 2:
- attribs = {
- EGL_WIDTH,
dmabufBuffer->size().width(),
- EGL_HEIGHT,
dmabufBuffer->size().height(),
- EGL_LINUX_DRM_FOURCC_EXT,
EGLint(dmabufBuffer->drmFormat()),
- EGL_DMA_BUF_PLANE2_FD_EXT, dmabufBuffer->plane(i).fd,
- EGL_DMA_BUF_PLANE2_OFFSET_EXT,
EGLint(dmabufBuffer->plane(i).offset),
- EGL_DMA_BUF_PLANE2_PITCH_EXT,
EGLint(dmabufBuffer->plane(i).stride),
- EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT,
EGLint(dmabufBuffer->plane(i).modifiers & 0xffffffff),
- EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT,
EGLint(dmabufBuffer->plane(i).modifiers >> 32),
- EGL_NONE
- };
- break;
- case 3:
- attribs = {
- EGL_WIDTH,
dmabufBuffer->size().width(),
- EGL_HEIGHT,
dmabufBuffer->size().height(),
- EGL_LINUX_DRM_FOURCC_EXT,
EGLint(dmabufBuffer->drmFormat()),
- EGL_DMA_BUF_PLANE3_FD_EXT, dmabufBuffer->plane(i).fd,
- EGL_DMA_BUF_PLANE3_OFFSET_EXT,
EGLint(dmabufBuffer->plane(i).offset),
- EGL_DMA_BUF_PLANE3_PITCH_EXT,
EGLint(dmabufBuffer->plane(i).stride),
- EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT,
EGLint(dmabufBuffer->plane(i).modifiers & 0xffffffff),
- EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT,
EGLint(dmabufBuffer->plane(i).modifiers >> 32),
- EGL_NONE
- };
+ // 6 entries for the common attribs plus 10 per possible plane, plus 1 for
+ // the final EGL_NONE sentinel.
+ QVarLengthArray<EGLint, 6 + 10 * 4 + 1> attribs;
+
+ attribs.append(EGL_WIDTH);
+ attribs.append(dmabufBuffer->size().width());
+ attribs.append(EGL_HEIGHT);
+ attribs.append(dmabufBuffer->size().height());
+ attribs.append(EGL_LINUX_DRM_FOURCC_EXT);
+ attribs.append(EGLint(dmabufBuffer->drmFormat()));
+
+#define ADD_PLANE_ATTRIBS(plane_idx) { \
+ attribs.append(EGL_DMA_BUF_PLANE ## plane_idx ## _FD_EXT); \
+ attribs.append(dmabufBuffer->plane(plane_idx).fd); \
+ attribs.append(EGL_DMA_BUF_PLANE ## plane_idx ## _OFFSET_EXT); \
+ attribs.append(EGLint(dmabufBuffer->plane(plane_idx).offset)); \
+ attribs.append(EGL_DMA_BUF_PLANE ## plane_idx ## _PITCH_EXT); \
+ attribs.append(EGLint(dmabufBuffer->plane(plane_idx).stride)); \
+ if (dmabufBuffer->plane(plane_idx).modifiers != DRM_FORMAT_MOD_INVALID) { \
+ attribs.append(EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_LO_EXT); \
+ attribs.append(EGLint(dmabufBuffer->plane(plane_idx).modifiers &
0xffffffff)); \
+ attribs.append(EGL_DMA_BUF_PLANE ## plane_idx ## _MODIFIER_HI_EXT); \
+ attribs.append(EGLint(dmabufBuffer->plane(plane_idx).modifiers >>
32)); \
+ } \
+}
+
+ switch (dmabufBuffer->planesNumber()) {
+ case 4:
+ ADD_PLANE_ATTRIBS(3);
+ Q_FALLTHROUGH();
+ case 3:
+ ADD_PLANE_ATTRIBS(2);
+ Q_FALLTHROUGH();
+ case 2:
+ ADD_PLANE_ATTRIBS(1);
+ Q_FALLTHROUGH();
+ case 1:
+ ADD_PLANE_ATTRIBS(0);
break;
- default:
- return false;
- }
-
- // note: EGLImageKHR does NOT take ownership of the file descriptors
- EGLImageKHR image = egl_create_image(m_eglDisplay,
- EGL_NO_CONTEXT,
- EGL_LINUX_DMA_BUF_EXT,
- (EGLClientBuffer) nullptr,
- attribs.constData());
-
- if (image == EGL_NO_IMAGE_KHR) {
- qCWarning(qLcWaylandCompositorHardwareIntegration) << "failed to
create EGL image for plane" << i;
- success = false;
- }
+ default:
+ qCWarning(qLcWaylandCompositorHardwareIntegration) << "Buffer uses
invalid number of planes:" << dmabufBuffer->planesNumber();
+ return false;
+ }
+
+ attribs.append(EGL_NONE);
- dmabufBuffer->initImage(i, image);
+ // note: EGLImageKHR does NOT take ownership of the file descriptors
+ EGLImageKHR image = egl_create_image(m_eglDisplay,
+ EGL_NO_CONTEXT,
+ EGL_LINUX_DMA_BUF_EXT,
+ (EGLClientBuffer) nullptr,
+ attribs.constData());
+
+ if (image == EGL_NO_IMAGE_KHR) {
+ qCWarning(qLcWaylandCompositorHardwareIntegration) << "failed to
create EGL image from" <<
+ dmabufBuffer->planesNumber() << "plane(s)";
+ success = false;
}
+
+ dmabufBuffer->initImage(0, image);
+
return success;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/decorations/bradient/main.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/decorations/bradient/main.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/decorations/bradient/main.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/decorations/bradient/main.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -164,13 +164,10 @@
// Window icon
QIcon icon = waylandWindow()->windowIcon();
if (!icon.isNull()) {
- QPixmap pixmap = icon.pixmap(QSize(128, 128));
- QPixmap scaled = pixmap.scaled(22, 22, Qt::IgnoreAspectRatio,
Qt::SmoothTransformation);
-
QRectF iconRect(0, 0, 22, 22);
- p.drawPixmap(iconRect.adjusted(margins().left() + BUTTON_SPACING, 4,
- margins().left() + BUTTON_SPACING, 4),
- scaled, iconRect);
+ iconRect.adjust(margins().left() + BUTTON_SPACING, 4,
+ margins().left() + BUTTON_SPACING, 4),
+ icon.paint(&p, iconRect.toRect());
}
// Window title
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -195,12 +195,17 @@
| ((edges & Qt::RightEdge) ? resize_edge_right : 0));
}
-QWaylandXdgSurface::Popup::Popup(QWaylandXdgSurface *xdgSurface,
QWaylandXdgSurface *parent,
+QWaylandXdgSurface::Popup::Popup(QWaylandXdgSurface *xdgSurface,
QWaylandWindow *parent,
QtWayland::xdg_positioner *positioner)
- : xdg_popup(xdgSurface->get_popup(parent->object(), positioner->object()))
- , m_xdgSurface(xdgSurface)
+ : m_xdgSurface(xdgSurface)
+ , m_parentXdgSurface(qobject_cast<QWaylandXdgSurface
*>(parent->shellSurface()))
, m_parent(parent)
{
+
+ init(xdgSurface->get_popup(m_parentXdgSurface ?
m_parentXdgSurface->object() : nullptr, positioner->object()));
+ if (m_parent) {
+ m_parent->addChildPopup(m_xdgSurface->window());
+ }
}
QWaylandXdgSurface::Popup::~Popup()
@@ -208,10 +213,24 @@
if (isInitialized())
destroy();
+ if (m_parent) {
+ m_parent->removeChildPopup(m_xdgSurface->window());
+ }
+
if (m_grabbing) {
auto *shell = m_xdgSurface->m_shell;
Q_ASSERT(shell->m_topmostGrabbingPopup == this);
- shell->m_topmostGrabbingPopup = m_parent->m_popup;
+ shell->m_topmostGrabbingPopup = m_parentXdgSurface ?
m_parentXdgSurface->m_popup : nullptr;
+ m_grabbing = false;
+
+ // Synthesize Qt enter/leave events for popup
+ QWindow *leave = nullptr;
+ if (m_xdgSurface && m_xdgSurface->window())
+ leave = m_xdgSurface->window()->window();
+ QWindowSystemInterface::handleLeaveEvent(leave);
+
+ if (QWindow *enter = QGuiApplication::topLevelAt(QCursor::pos()))
+ QWindowSystemInterface::handleEnterEvent(enter,
enter->mapFromGlobal(QCursor::pos()), QCursor::pos());
}
}
@@ -392,8 +411,6 @@
{
Q_ASSERT(!m_toplevel && !m_popup);
- auto parentXdgSurface = static_cast<QWaylandXdgSurface
*>(parent->shellSurface());
-
auto positioner = new
QtWayland::xdg_positioner(m_shell->create_positioner());
// set_popup expects a position relative to the parent
QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
@@ -406,8 +423,9 @@
positioner->set_anchor(QtWayland::xdg_positioner::anchor_top_left);
positioner->set_gravity(QtWayland::xdg_positioner::gravity_bottom_right);
positioner->set_size(m_window->geometry().width(),
m_window->geometry().height());
- m_popup = new Popup(this, parentXdgSurface, positioner);
+ m_popup = new Popup(this, parent, positioner);
positioner->destroy();
+
delete positioner;
}
@@ -429,6 +447,23 @@
}
setPopup(parent);
m_popup->grab(device, serial);
+
+ // Synthesize Qt enter/leave events for popup
+ if (!parent)
+ return;
+ QWindow *current = QGuiApplication::topLevelAt(QCursor::pos());
+ QWindow *leave = parent->window();
+ if (current != leave)
+ return;
+
+ QWindowSystemInterface::handleLeaveEvent(leave);
+
+ QWindow *enter = nullptr;
+ if (m_popup && m_popup->m_xdgSurface && m_popup->m_xdgSurface->window())
+ enter = m_popup->m_xdgSurface->window()->window();
+
+ if (enter)
+ QWindowSystemInterface::handleEnterEvent(enter,
enter->mapFromGlobal(QCursor::pos()), QCursor::pos());
}
void QWaylandXdgSurface::xdg_surface_configure(uint32_t serial)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
2022-09-22 13:58:55.000000000 +0200
@@ -131,14 +131,15 @@
class Popup : public QtWayland::xdg_popup {
public:
- Popup(QWaylandXdgSurface *xdgSurface, QWaylandXdgSurface *parent,
QtWayland::xdg_positioner *positioner);
+ Popup(QWaylandXdgSurface *xdgSurface, QWaylandWindow *parent,
QtWayland::xdg_positioner *positioner);
~Popup() override;
void grab(QWaylandInputDevice *seat, uint serial);
void xdg_popup_popup_done() override;
QWaylandXdgSurface *m_xdgSurface = nullptr;
- QWaylandXdgSurface *m_parent = nullptr;
+ QWaylandXdgSurface *m_parentXdgSurface = nullptr;
+ QWaylandWindow *m_parent = nullptr;
bool m_grabbing = false;
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -47,18 +47,21 @@
namespace QtWaylandClient {
-QWaylandXdgPopupV5::QWaylandXdgPopupV5(struct ::xdg_popup_v5 *popup,
QWaylandWindow *window)
+QWaylandXdgPopupV5::QWaylandXdgPopupV5(struct ::xdg_popup_v5 *popup,
QWaylandWindow* parent, QWaylandWindow *window)
: QWaylandShellSurface(window)
, QtWayland::xdg_popup_v5(popup)
+ , m_parent(parent)
, m_window(window)
{
if (window->display()->windowExtension())
m_extendedWindow = new QWaylandExtendedSurface(window);
+ m_parent->addChildPopup(m_window);
}
QWaylandXdgPopupV5::~QWaylandXdgPopupV5()
{
xdg_popup_destroy(object());
+ m_parent->removeChildPopup(m_window);
delete m_extendedWindow;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5_p.h
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5_p.h
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5_p.h
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgpopupv5_p.h
2022-09-22 13:58:55.000000000 +0200
@@ -70,7 +70,7 @@
{
Q_OBJECT
public:
- QWaylandXdgPopupV5(struct ::xdg_popup_v5 *popup, QWaylandWindow *window);
+ QWaylandXdgPopupV5(struct ::xdg_popup_v5 *popup, QWaylandWindow* parent,
QWaylandWindow *window);
~QWaylandXdgPopupV5() override;
protected:
@@ -78,6 +78,7 @@
private:
QWaylandExtendedSurface *m_extendedWindow = nullptr;
+ QWaylandWindow *m_parent = nullptr;
QWaylandWindow *m_window = nullptr;
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgshellv5.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgshellv5.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgshellv5.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgshellv5.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -84,7 +84,7 @@
int x = position.x() + parentWindow->frameMargins().left();
int y = position.y() + parentWindow->frameMargins().top();
- auto popup = new QWaylandXdgPopupV5(get_xdg_popup(window->wlSurface(),
parentSurface, seat, m_popupSerial, x, y), window);
+ auto popup = new QWaylandXdgPopupV5(get_xdg_popup(window->wlSurface(),
parentSurface, seat, m_popupSerial, x, y), parentWindow, window);
m_popups.append(window);
QObject::connect(popup, &QWaylandXdgPopupV5::destroyed, [this, window](){
m_popups.removeOne(window);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -174,6 +174,7 @@
, m_xdgSurface(xdgSurface)
, m_parent(parent)
{
+ m_parent->window()->addChildPopup(m_xdgSurface->window());
}
QWaylandXdgSurfaceV6::Popup::~Popup()
@@ -181,6 +182,8 @@
if (isInitialized())
destroy();
+ m_parent->window()->removeChildPopup(m_xdgSurface->window());
+
if (m_grabbing) {
auto *shell = m_xdgSurface->m_shell;
Q_ASSERT(shell->m_topmostGrabbingPopup == this);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/src/shared/qwaylandmimehelper.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/src/shared/qwaylandmimehelper.cpp
--- old/qtwayland-everywhere-src-5.15.5+kde39/src/shared/qwaylandmimehelper.cpp
2022-06-20 22:17:21.000000000 +0200
+++ new/qtwayland-everywhere-src-5.15.6+kde49/src/shared/qwaylandmimehelper.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -74,7 +74,7 @@
QList<QUrl> urls = mimeData->urls();
for (int i = 0; i < urls.count(); ++i) {
content.append(urls.at(i).toEncoded());
- content.append('\n');
+ content.append("\r\n");
}
} else {
content = mimeData->data(mimeType);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/seatv5/tst_seatv5.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/seatv5/tst_seatv5.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/seatv5/tst_seatv5.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/seatv5/tst_seatv5.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -73,6 +73,7 @@
void multiTouch();
void multiTouchUpAndMotionFrame();
void tapAndMoveInSameFrame();
+ void cancelTouch();
};
void tst_seatv5::bindsToSeat()
@@ -646,5 +647,34 @@
QTRY_COMPARE(window.m_events.last().touchPoints.first().state(),
Qt::TouchPointState::TouchPointReleased);
}
+void tst_seatv5::cancelTouch()
+{
+ TouchWindow window;
+ QCOMPOSITOR_TRY_VERIFY(xdgSurface() &&
xdgSurface()->m_committedConfigureSerial);
+
+ exec([=] {
+ auto *t = touch();
+ auto *c = client();
+ t->sendDown(xdgToplevel()->surface(), {32, 32}, 1);
+ t->sendFrame(c);
+ t->sendCancel(c);
+ t->sendFrame(c);
+ });
+
+ QTRY_VERIFY(!window.m_events.empty());
+ {
+ auto e = window.m_events.takeFirst();
+ QCOMPARE(e.type, QEvent::TouchBegin);
+ QCOMPARE(e.touchPointStates, Qt::TouchPointPressed);
+ QCOMPARE(e.touchPoints.length(), 1);
+ QCOMPARE(e.touchPoints.first().pos(),
QPointF(32-window.frameMargins().left(), 32-window.frameMargins().top()));
+ }
+ {
+ auto e = window.m_events.takeFirst();
+ QCOMPARE(e.type, QEvent::TouchCancel);
+ QCOMPARE(e.touchPoints.length(), 0);
+ }
+}
+
QCOMPOSITOR_TEST_MAIN(tst_seatv5)
#include "tst_seatv5.moc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/shared/corecompositor.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/shared/corecompositor.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/shared/corecompositor.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/shared/corecompositor.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -27,6 +27,7 @@
****************************************************************************/
#include "corecompositor.h"
+#include <thread>
namespace MockCompositor {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/shared/coreprotocol.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/shared/coreprotocol.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/shared/coreprotocol.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/shared/coreprotocol.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -451,6 +451,13 @@
send_frame(r->handle);
}
+void Touch::sendCancel(wl_client *client)
+{
+ const auto touchResources = resourceMap().values(client);
+ for (auto *r : touchResources)
+ send_cancel(r->handle);
+}
+
uint Keyboard::sendEnter(Surface *surface)
{
auto serial = m_seat->m_compositor->nextSerial();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/shared/coreprotocol.h
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/shared/coreprotocol.h
---
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/shared/coreprotocol.h
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/shared/coreprotocol.h
2022-09-22 13:58:55.000000000 +0200
@@ -364,6 +364,7 @@
uint sendUp(wl_client *client, int id);
void sendMotion(wl_client *client, const QPointF &position, int id);
void sendFrame(wl_client *client);
+ void sendCancel(wl_client *client);
Seat *m_seat = nullptr;
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/surface/tst_surface.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/surface/tst_surface.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/surface/tst_surface.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/surface/tst_surface.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -129,6 +129,10 @@
// Make sure we follow frame callbacks for some frames
for (int i = 0; i < 5; ++i) {
xdgPingAndWaitForPong(); // Make sure things have happened on the
client
+ if
(!qEnvironmentVariableIntValue("QT_WAYLAND_DISABLE_WINDOWDECORATION") && i ==
0) {
+ QCOMPARE(bufferSpy.count(), 1);
+ bufferSpy.removeFirst();
+ }
exec([&] {
QVERIFY(bufferSpy.empty()); // Make sure no extra buffers have
arrived
QVERIFY(!xdgToplevel()->surface()->m_waitingFrameCallbacks.empty());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/xdgshell/tst_xdgshell.cpp
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/xdgshell/tst_xdgshell.cpp
---
old/qtwayland-everywhere-src-5.15.5+kde39/tests/auto/client/xdgshell/tst_xdgshell.cpp
2022-06-20 22:17:21.000000000 +0200
+++
new/qtwayland-everywhere-src-5.15.6+kde49/tests/auto/client/xdgshell/tst_xdgshell.cpp
2022-09-22 13:58:55.000000000 +0200
@@ -46,6 +46,7 @@
void configureStates();
void popup();
void tooltipOnPopup();
+ void tooltipAndSiblingPopup();
void switchPopups();
void hidePopupParent();
void pongs();
@@ -345,6 +346,92 @@
QCOMPOSITOR_TRY_COMPARE(xdgPopup(1), nullptr);
QCOMPOSITOR_TRY_COMPARE(xdgPopup(0), nullptr);
}
+
+void tst_xdgshell::tooltipAndSiblingPopup()
+{
+ class ToolTip : public QRasterWindow {
+ public:
+ explicit ToolTip(QWindow *parent) {
+ setTransientParent(parent);
+ setFlags(Qt::ToolTip);
+ resize(100, 100);
+ show();
+ }
+ void mousePressEvent(QMouseEvent *event) override {
+ QRasterWindow::mousePressEvent(event);
+ m_popup = new QRasterWindow;
+ m_popup->setTransientParent(transientParent());
+ m_popup->setFlags(Qt::Popup);
+ m_popup->resize(100, 100);
+ m_popup->show();
+ }
+
+ QRasterWindow *m_popup = nullptr;
+ };
+
+ class Window : public QRasterWindow {
+ public:
+ void mousePressEvent(QMouseEvent *event) override {
+ QRasterWindow::mousePressEvent(event);
+ m_tooltip = new ToolTip(this);
+ }
+ ToolTip *m_tooltip = nullptr;
+ };
+
+ Window window;
+ window.resize(200, 200);
+ window.show();
+
+ QCOMPOSITOR_TRY_VERIFY(xdgToplevel());
+ exec([=] { xdgToplevel()->sendCompleteConfigure(); });
+
QCOMPOSITOR_TRY_VERIFY(xdgToplevel()->m_xdgSurface->m_committedConfigureSerial);
+
+ exec([=] {
+ auto *surface = xdgToplevel()->surface();
+ auto *p = pointer();
+ auto *c = client();
+ p->sendEnter(surface, {100, 100});
+ p->sendFrame(c);
+ p->sendButton(client(), BTN_LEFT, Pointer::button_state_pressed);
+ p->sendButton(client(), BTN_LEFT, Pointer::button_state_released);
+ p->sendFrame(c);
+ p->sendLeave(surface);
+ p->sendFrame(c);
+ });
+
+ QCOMPOSITOR_TRY_VERIFY(xdgPopup());
+ exec([=] { xdgPopup()->sendCompleteConfigure(QRect(100, 100, 100, 100));
});
+
QCOMPOSITOR_TRY_VERIFY(xdgPopup()->m_xdgSurface->m_committedConfigureSerial);
+ QCOMPOSITOR_TRY_VERIFY(!xdgPopup()->m_grabbed);
+
+ exec([=] {
+ auto *surface = xdgPopup()->surface();
+ auto *p = pointer();
+ auto *c = client();
+ p->sendEnter(surface, {100, 100});
+ p->sendFrame(c);
+ p->sendButton(client(), BTN_LEFT, Pointer::button_state_pressed);
+ p->sendButton(client(), BTN_LEFT, Pointer::button_state_released);
+ p->sendFrame(c);
+ });
+
+ QCOMPOSITOR_TRY_VERIFY(xdgPopup(1));
+ exec([=] { xdgPopup(1)->sendCompleteConfigure(QRect(100, 100, 100, 100));
});
+
QCOMPOSITOR_TRY_VERIFY(xdgPopup(1)->m_xdgSurface->m_committedConfigureSerial);
+ QCOMPOSITOR_TRY_VERIFY(xdgPopup(1)->m_grabbed);
+
+ // Close the middle tooltip (it should not close the sibling popup)
+ window.m_tooltip->close();
+
+ QCOMPOSITOR_TRY_COMPARE(xdgPopup(1), nullptr);
+ // Verify the remaining xdg surface is a grab popup..
+ QCOMPOSITOR_TRY_VERIFY(xdgPopup(0));
+ QCOMPOSITOR_TRY_VERIFY(xdgPopup(0)->m_grabbed);
+
+ window.m_tooltip->m_popup->close();
+ QCOMPOSITOR_TRY_COMPARE(xdgPopup(1), nullptr);
+ QCOMPOSITOR_TRY_COMPARE(xdgPopup(0), nullptr);
+}
// QTBUG-65680
void tst_xdgshell::switchPopups()
++++++ qtwayland-everywhere-src.obsinfo ++++++
--- /var/tmp/diff_new_pack.NQQh0U/_old 2022-09-27 20:10:19.917350805 +0200
+++ /var/tmp/diff_new_pack.NQQh0U/_new 2022-09-27 20:10:19.921350814 +0200
@@ -1,5 +1,5 @@
name: qtwayland-everywhere-src
-version: 5.15.5+kde39
-mtime: 1655756241
-commit: 64fa557eb30fc1219bec50a45107ea1a983411ed
+version: 5.15.6+kde49
+mtime: 1663847935
+commit: 31241d7fb6a7ffb8f56bc8ac35ed9f3bc61735b5