diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-animate-cursor.patch b/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-animate-cursor.patch deleted file mode 100644 index 051754bf48..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-animate-cursor.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 36974955d13578071387695adb13a47be33e4d32 Mon Sep 17 00:00:00 2001 -From: David Edmundson -Date: Thu, 28 Nov 2019 02:31:17 +0100 -Subject: Avoid animating single frame cursors - -Currently to determine if a cursor is animated or not we check the -cursor theme delay. - -This doesn't work in practice as by default many cursor themes have a -delay of 50 set even if they don't animate. - -This comes from xcursorgen which specifies a delay of 50ms if there -isn't anything set in the config. -(https://github.com/freedesktop/xcursorgen/blob/master/xcursorgen.c#L92) - -Given many themes will have a delay we should also check the number of -images in a given cursor. - -In order to do that without a double lookup QWaylandCursor needed to -return the native wl_cursor, not wl_cursor_image and move the relevant -logic. - -Change-Id: Ie782ace8054910ae76e61cab33ceca0377194929 -Reviewed-by: Johan Helsing ---- - src/client/qwaylandcursor.cpp | 12 ++---------- - src/client/qwaylandcursor_p.h | 3 +-- - src/client/qwaylandinputdevice.cpp | 16 ++++++++++++---- - 3 files changed, 15 insertions(+), 16 deletions(-) - -diff --git a/src/client/qwaylandcursor.cpp b/src/client/qwaylandcursor.cpp -index 4356b23a..1d3d88be 100644 ---- a/src/client/qwaylandcursor.cpp -+++ b/src/client/qwaylandcursor.cpp -@@ -219,7 +219,7 @@ wl_cursor *QWaylandCursorTheme::requestCursor(WaylandCursor shape) - return nullptr; - } - --::wl_cursor_image *QWaylandCursorTheme::cursorImage(Qt::CursorShape shape, uint millisecondsIntoAnimation) -+::wl_cursor *QWaylandCursorTheme::cursor(Qt::CursorShape shape) - { - struct wl_cursor *waylandCursor = nullptr; - -@@ -237,15 +237,7 @@ wl_cursor *QWaylandCursorTheme::requestCursor(WaylandCursor shape) - return nullptr; - } - -- int frame = wl_cursor_frame(waylandCursor, millisecondsIntoAnimation); -- ::wl_cursor_image *image = waylandCursor->images[frame]; -- ::wl_buffer *buffer = wl_cursor_image_get_buffer(image); -- if (!buffer) { -- qCWarning(lcQpaWayland) << "Could not find buffer for cursor"; -- return nullptr; -- } -- -- return image; -+ return waylandCursor; - } - - QWaylandCursor::QWaylandCursor(QWaylandDisplay *display) -diff --git a/src/client/qwaylandcursor_p.h b/src/client/qwaylandcursor_p.h -index a4605f3d..751ffa68 100644 ---- a/src/client/qwaylandcursor_p.h -+++ b/src/client/qwaylandcursor_p.h -@@ -75,7 +75,7 @@ class Q_WAYLAND_CLIENT_EXPORT QWaylandCursorTheme - public: - static QWaylandCursorTheme *create(QWaylandShm *shm, int size, const QString &themeName); - ~QWaylandCursorTheme(); -- ::wl_cursor_image *cursorImage(Qt::CursorShape shape, uint millisecondsIntoAnimation = 0); -+ ::wl_cursor *cursor(Qt::CursorShape shape); - - private: - enum WaylandCursor { -@@ -129,7 +129,6 @@ public: - void setPos(const QPoint &pos) override; - - static QSharedPointer cursorBitmapBuffer(QWaylandDisplay *display, const QCursor *cursor); -- struct wl_cursor_image *cursorImage(Qt::CursorShape shape); - - private: - QWaylandDisplay *mDisplay = nullptr; -diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp -index a4098edd..d812918e 100644 ---- a/src/client/qwaylandinputdevice.cpp -+++ b/src/client/qwaylandinputdevice.cpp -@@ -283,8 +283,8 @@ void QWaylandInputDevice::Pointer::updateCursorTheme() - if (!mCursor.theme) - return; // A warning has already been printed in loadCursorTheme - -- if (auto *arrow = mCursor.theme->cursorImage(Qt::ArrowCursor)) { -- int arrowPixelSize = qMax(arrow->width, arrow->height); // Not all cursor themes are square -+ if (auto *arrow = mCursor.theme->cursor(Qt::ArrowCursor)) { -+ int arrowPixelSize = qMax(arrow->images[0]->width, arrow->images[0]->height); // Not all cursor themes are square - while (scale > 1 && arrowPixelSize / scale < cursorSize()) - --scale; - } else { -@@ -326,12 +326,20 @@ void QWaylandInputDevice::Pointer::updateCursor() - - // Set from shape using theme - uint time = seat()->mCursor.animationTimer.elapsed(); -- if (struct ::wl_cursor_image *image = mCursor.theme->cursorImage(shape, time)) { -+ -+ if (struct ::wl_cursor *waylandCursor = mCursor.theme->cursor(shape)) { -+ int frame = wl_cursor_frame(waylandCursor, time); -+ ::wl_cursor_image *image = waylandCursor->images[frame]; -+ - struct wl_buffer *buffer = wl_cursor_image_get_buffer(image); -+ if (!buffer) { -+ qCWarning(lcQpaWayland) << "Could not find buffer for cursor" << shape; -+ return; -+ } - int bufferScale = mCursor.themeBufferScale; - QPoint hotspot = QPoint(image->hotspot_x, image->hotspot_y) / bufferScale; - QSize size = QSize(image->width, image->height) / bufferScale; -- bool animated = image->delay > 0; -+ bool animated = waylandCursor->image_count > 1 && image->delay > 0; - getOrCreateCursorSurface()->update(buffer, hotspot, size, bufferScale, animated); - return; - } --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-cursor-timer.patch b/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-cursor-timer.patch deleted file mode 100644 index 08e43e96bf..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-cursor-timer.patch +++ /dev/null @@ -1,125 +0,0 @@ -From ce15889614f87b5986f997beffd2826471adfe51 Mon Sep 17 00:00:00 2001 -From: "Jan Alexander Steffens (heftig)" -Date: Fri, 13 Dec 2019 22:15:32 +0100 -Subject: Drive cursor animation with a timer - -Using only wl_surface_frame callbacks to update the cursor does so much -more often than needed. In addition, at least GNOME and Weston fire the -callback for the cursor surface immediately, which ends up updating the -cursor at over 3000 Hz here. - -Use wl_cursor_frame_and_duration to drive a single shot timer. This -function is also guaranteed to return 0 for single frame cursors, so we -can avoid starting the timer at all. - -We wait for both the surface frame callback and the timer to fire before -updating the cursor for the next frame of animation. This reduces our -update rate to the frame rate of the cursor or the rate requested by the -compositor, whichever is lower. - -Change-Id: I10277460ebe9b547ebaf7f73424b9ef17614107f -Reviewed-by: Johan Helsing ---- - src/client/qwaylandinputdevice.cpp | 34 +++++++++++++++++++++++++++++++--- - src/client/qwaylandinputdevice_p.h | 5 +++++ - 2 files changed, 36 insertions(+), 3 deletions(-) - -diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp -index 3b26dc42..3f0d61d6 100644 ---- a/src/client/qwaylandinputdevice.cpp -+++ b/src/client/qwaylandinputdevice.cpp -@@ -143,6 +143,12 @@ QWaylandWindow *QWaylandInputDevice::Keyboard::focusWindow() const - QWaylandInputDevice::Pointer::Pointer(QWaylandInputDevice *seat) - : mParent(seat) - { -+#if QT_CONFIG(cursor) -+ mCursor.frameTimer.setSingleShot(true); -+ mCursor.frameTimer.callOnTimeout([&]() { -+ cursorTimerCallback(); -+ }); -+#endif - } - - QWaylandInputDevice::Pointer::~Pointer() -@@ -224,7 +230,7 @@ public: - if (animated) { - m_frameCallback.reset(new WlCallback(frame(), [this](uint32_t time){ - Q_UNUSED(time); -- m_pointer->updateCursor(); -+ m_pointer->cursorFrameCallback(); - })); - } - commit(); -@@ -328,7 +334,8 @@ void QWaylandInputDevice::Pointer::updateCursor() - uint time = seat()->mCursor.animationTimer.elapsed(); - - if (struct ::wl_cursor *waylandCursor = mCursor.theme->cursor(shape)) { -- int frame = wl_cursor_frame(waylandCursor, time); -+ uint duration = 0; -+ int frame = wl_cursor_frame_and_duration(waylandCursor, time, &duration); - ::wl_cursor_image *image = waylandCursor->images[frame]; - - struct wl_buffer *buffer = wl_cursor_image_get_buffer(image); -@@ -339,7 +346,12 @@ void QWaylandInputDevice::Pointer::updateCursor() - int bufferScale = mCursor.themeBufferScale; - QPoint hotspot = QPoint(image->hotspot_x, image->hotspot_y) / bufferScale; - QSize size = QSize(image->width, image->height) / bufferScale; -- bool animated = waylandCursor->image_count > 1 && image->delay > 0; -+ bool animated = duration > 0; -+ if (animated) { -+ mCursor.gotFrameCallback = false; -+ mCursor.gotTimerCallback = false; -+ mCursor.frameTimer.start(duration); -+ } - getOrCreateCursorSurface()->update(buffer, hotspot, size, bufferScale, animated); - return; - } -@@ -354,6 +366,22 @@ CursorSurface *QWaylandInputDevice::Pointer::getOrCreateCursorSurface() - return mCursor.surface.get(); - } - -+void QWaylandInputDevice::Pointer::cursorTimerCallback() -+{ -+ mCursor.gotTimerCallback = true; -+ if (mCursor.gotFrameCallback) { -+ updateCursor(); -+ } -+} -+ -+void QWaylandInputDevice::Pointer::cursorFrameCallback() -+{ -+ mCursor.gotFrameCallback = true; -+ if (mCursor.gotTimerCallback) { -+ updateCursor(); -+ } -+} -+ - #endif // QT_CONFIG(cursor) - - QWaylandInputDevice::Touch::Touch(QWaylandInputDevice *p) -diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h -index 60d6f2c1..a567c57b 100644 ---- a/src/client/qwaylandinputdevice_p.h -+++ b/src/client/qwaylandinputdevice_p.h -@@ -286,6 +286,8 @@ public: - int idealCursorScale() const; - void updateCursorTheme(); - void updateCursor(); -+ void cursorTimerCallback(); -+ void cursorFrameCallback(); - CursorSurface *getOrCreateCursorSurface(); - #endif - QWaylandInputDevice *seat() const { return mParent; } -@@ -325,6 +327,9 @@ public: - QWaylandCursorTheme *theme = nullptr; - int themeBufferScale = 0; - QScopedPointer surface; -+ QTimer frameTimer; -+ bool gotFrameCallback = false; -+ bool gotTimerCallback = false; - } mCursor; - #endif - QPointF mSurfacePos; --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-libglvnd-egl.patch b/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-libglvnd-egl.patch deleted file mode 100644 index 97f628689f..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-libglvnd-egl.patch +++ /dev/null @@ -1,32 +0,0 @@ -From c2105d8b7e16cc934b886537968228f6300bf4bc Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Fri, 8 Nov 2019 13:58:04 +0100 -Subject: Fix compilation of linuxdmabuf compositor plugin - -Mesa's eglext.h no longer includes eglmesaext.h, so copy over the typedefs we need. - -Fixes: QTBUG-79709 -Change-Id: I3190ef56e0e162636efea440dff7e760cf11fcd0 -Reviewed-by: Laszlo Agocs ---- - .../compositor/linux-dmabuf-unstable-v1/linuxdmabuf.h | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabuf.h b/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabuf.h -index 8554721e..02b5b6f8 100644 ---- a/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabuf.h -+++ b/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linuxdmabuf.h -@@ -58,6 +58,10 @@ - #define DRM_FORMAT_MOD_INVALID fourcc_mod_code(NONE, DRM_FORMAT_RESERVED) - #endif - -+// Copied from eglmesaext.h -+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display); -+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display); -+ - QT_BEGIN_NAMESPACE - - class QWaylandCompositor; --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-linux-dmabuf-2.patch b/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-linux-dmabuf-2.patch deleted file mode 100644 index 9087475c78..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-linux-dmabuf-2.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a2be69d47884dd995ac6e9004ba2855f354f7522 Mon Sep 17 00:00:00 2001 -From: "Jan Alexander Steffens (heftig)" -Date: Sun, 15 Dec 2019 00:07:08 +0100 -Subject: Client: Fix detection of linux-dmabuf - -Change I84c8c1008724b49b6bedb4fc3ef398e292f1c6c7 fixed the tests in -compositor/configure.json but missed the test in client/configure.json. - -Change-Id: I65ad424406438baa74ca80a9418e133510142118 -Reviewed-by: Johan Helsing ---- - src/client/configure.json | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/client/configure.json b/src/client/configure.json -index e9e16324..06213968 100644 ---- a/src/client/configure.json -+++ b/src/client/configure.json -@@ -74,7 +74,7 @@ - "label": "Linux dma-buf Buffer Sharing", - "type": "compile", - "test": "dmabuf_server_buffer", -- "use": "egl" -+ "use": "egl drm" - }, - "vulkan-server-buffer": { - "label": "Vulkan Buffer Sharing", --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-linux-dmabuf.patch b/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-linux-dmabuf.patch deleted file mode 100644 index 5499d98327..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qt5-wayland-linux-dmabuf.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 09861f0081e6729383808ac4803c7fd1f0ba6dd1 Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Fri, 15 Nov 2019 11:52:46 +0100 -Subject: Fix detection of linux-dmabuf - -On some systems drm_fourcc.h is not in /usr/include, but in -/usr/include/libdrm, and that path can be found through pkg-config. This is -already done with the drm lib in qtbase/src/configure.json so this just tells -the test (and the plugins) to use the include paths for the existing "drm" lib. - -Fixes: QTBUG-80075 -Change-Id: I84c8c1008724b49b6bedb4fc3ef398e292f1c6c7 -Reviewed-by: Andreas Cord-Landwehr -Reviewed-by: Paul Olav Tvete ---- - src/compositor/configure.json | 4 ++-- - src/hardwareintegration/compositor/dmabuf-server/dmabuf-server.pri | 2 +- - .../compositor/linux-dmabuf-unstable-v1/linux-dmabuf-unstable-v1.pri | 2 +- - 3 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/compositor/configure.json b/src/compositor/configure.json -index 46caceff..0dbb3364 100644 ---- a/src/compositor/configure.json -+++ b/src/compositor/configure.json -@@ -80,13 +80,13 @@ - "label": "Linux dma-buf Buffer Sharing", - "type": "compile", - "test": "dmabuf_server_buffer", -- "use": "egl" -+ "use": "egl drm" - }, - "dmabuf-client-buffer": { - "label": "Linux Client dma-buf Buffer Sharing", - "type": "compile", - "test": "dmabuf_client_buffer", -- "use": "egl" -+ "use": "egl drm" - }, - "vulkan-server-buffer": { - "label": "Vulkan Buffer Sharing", -diff --git a/src/hardwareintegration/compositor/dmabuf-server/dmabuf-server.pri b/src/hardwareintegration/compositor/dmabuf-server/dmabuf-server.pri -index 2df10109..41f483c4 100644 ---- a/src/hardwareintegration/compositor/dmabuf-server/dmabuf-server.pri -+++ b/src/hardwareintegration/compositor/dmabuf-server/dmabuf-server.pri -@@ -1,6 +1,6 @@ - INCLUDEPATH += $$PWD - --QMAKE_USE_PRIVATE += egl wayland-server -+QMAKE_USE_PRIVATE += egl drm wayland-server - - SOURCES += \ - $$PWD/dmabufserverbufferintegration.cpp -diff --git a/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linux-dmabuf-unstable-v1.pri b/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linux-dmabuf-unstable-v1.pri -index a7630040..4dbbae19 100644 ---- a/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linux-dmabuf-unstable-v1.pri -+++ b/src/hardwareintegration/compositor/linux-dmabuf-unstable-v1/linux-dmabuf-unstable-v1.pri -@@ -1,6 +1,6 @@ - INCLUDEPATH += $$PWD - --QMAKE_USE_PRIVATE += egl wayland-server -+QMAKE_USE_PRIVATE += egl drm wayland-server - - CONFIG += wayland-scanner - WAYLANDSERVERSOURCES += $$PWD/../../../3rdparty/protocol/linux-dmabuf-unstable-v1.xml --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-118650.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-118650.patch new file mode 100644 index 0000000000..2b9db65003 --- /dev/null +++ b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-118650.patch @@ -0,0 +1,39 @@ +From 18f942f3f3a99544f379c66578f14b28cafcef22 Mon Sep 17 00:00:00 2001 +From: Weng Xuetian +Date: Fri, 10 Nov 2023 19:43:37 -0800 +Subject: client: Always clear queued buffer busy flag when resetting the + window + +In 39a003942ebab39a1d3b8bc64f41d0c68e92f4bf, the queued buffer is always +set busy, but it may not be reset correctly if the queued buffer is not +ever attached due to hiding the surface when window visibility is +being updated at a very fast speed. + +Fixes: QTBUG-118650 +Task-number: QTBUG-118650 +Change-Id: Id0bdd3caa69c821bb84927f01b4839f46eee8a10 +Reviewed-by: David Edmundson +Reviewed-by: David Redondo +(cherry picked from commit 6fe83f6076423068b652fa4fcb0b5adbd297f2a8) +Reviewed-by: Qt Cherry-pick Bot +--- + src/client/qwaylandwindow.cpp | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 4841ba95..b81e00ef 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -310,6 +310,9 @@ void QWaylandWindow::reset() + mOpaqueArea = QRegion(); + mMask = QRegion(); + ++ if (mQueuedBuffer) { ++ mQueuedBuffer->setBusy(false); ++ } + mQueuedBuffer = nullptr; + mQueuedBufferDamage = QRegion(); + +-- +cgit v1.2.3 + diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-119110.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-119110.patch new file mode 100644 index 0000000000..20b64a7f7f --- /dev/null +++ b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-119110.patch @@ -0,0 +1,160 @@ +From aae65c885d8e38d8abc2959cded7b5e9e5fc88b3 Mon Sep 17 00:00:00 2001 +From: Vlad Zahorodnii +Date: Tue, 14 Nov 2023 13:31:28 +0200 +Subject: Client: Move topmost grabbing popup tracking to QWaylandWindow + +If the effective transient parent is different from +QWaylandWindow::transientParent(), then the popups may be closed in +wrong order and producing an xdg-shell protocol error. + +This change lifts topmost popup tracking from the xdg-shell plugin to +QWaylandWindow so it can guess the correct transient parent and the +xdg-shell plugin doesn't have to pick a different parent behind our +back. + +Fixes: QTBUG-119110 +Change-Id: I7c5f780b7bd4c3362aa7b22762ff336ae908ff70 +Reviewed-by: David Edmundson +(cherry picked from commit cfaae5d910406ef38d124e8e2c9114e2bfe87cb3) +Reviewed-by: Qt Cherry-pick Bot +--- + src/client/qwaylandwindow.cpp | 23 ++++++++++++++++++++-- + src/client/qwaylandwindow_p.h | 3 ++- + .../xdg-shell/qwaylandxdgshell.cpp | 18 ----------------- + .../xdg-shell/qwaylandxdgshell_p.h | 1 - + 4 files changed, 23 insertions(+), 22 deletions(-) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index b81e00ef..de2cafb6 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -41,6 +41,7 @@ namespace QtWaylandClient { + Q_LOGGING_CATEGORY(lcWaylandBackingstore, "qt.qpa.wayland.backingstore") + + QWaylandWindow *QWaylandWindow::mMouseGrab = nullptr; ++QWaylandWindow *QWaylandWindow::mTopPopup = nullptr; + + QWaylandWindow::QWaylandWindow(QWindow *window, QWaylandDisplay *display) + : QPlatformWindow(window) +@@ -136,7 +137,22 @@ void QWaylandWindow::initWindow() + } else if (shouldCreateShellSurface()) { + Q_ASSERT(!mShellSurface); + Q_ASSERT(mShellIntegration); +- mTransientParent = closestTransientParent(); ++ mTransientParent = guessTransientParent(); ++ if (mTransientParent) { ++ if (window()->type() == Qt::Popup) { ++ if (mTopPopup && mTopPopup != mTransientParent) { ++ qCWarning(lcQpaWayland) << "Creating a popup with a parent," << mTransientParent->window() ++ << "which does not match the current topmost grabbing popup," ++ << mTopPopup->window() << "With some shell surface protocols, this" ++ << "is not allowed. The wayland QPA plugin is currently handling" ++ << "it by setting the parent to the topmost grabbing popup." ++ << "Note, however, that this may cause positioning errors and" ++ << "popups closing unxpectedly. Please fix the transient parent of the popup."; ++ mTransientParent = mTopPopup; ++ } ++ mTopPopup = this; ++ } ++ } + + mShellSurface = mShellIntegration->createShellSurface(this); + if (mShellSurface) { +@@ -271,6 +287,9 @@ void QWaylandWindow::reset() + { + closeChildPopups(); + ++ if (mTopPopup == this) ++ mTopPopup = mTransientParent && (mTransientParent->window()->type() == Qt::Popup) ? mTransientParent : nullptr; ++ + if (mSurface) { + emit wlSurfaceDestroyed(); + QWriteLocker lock(&mSurfaceLock); +@@ -1120,7 +1139,7 @@ QWaylandWindow *QWaylandWindow::transientParent() const + return mTransientParent; + } + +-QWaylandWindow *QWaylandWindow::closestTransientParent() const ++QWaylandWindow *QWaylandWindow::guessTransientParent() const + { + // Take the closest window with a shell surface, since the transient parent may be a + // QWidgetWindow or some other window without a shell surface, which is then not able to +diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h +index fbf62906..862366ea 100644 +--- a/src/client/qwaylandwindow_p.h ++++ b/src/client/qwaylandwindow_p.h +@@ -349,7 +349,7 @@ private: + void handleScreensChanged(); + void sendRecursiveExposeEvent(); + +- QWaylandWindow *closestTransientParent() const; ++ QWaylandWindow *guessTransientParent() const; + void addChildPopup(QWaylandWindow *child); + void removeChildPopup(QWaylandWindow *child); + +@@ -361,6 +361,7 @@ private: + void handleFrameCallback(struct ::wl_callback* callback); + + static QWaylandWindow *mMouseGrab; ++ static QWaylandWindow *mTopPopup; + + friend class QWaylandSubSurface; + }; +diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +index e5dde262..f6e3e08a 100644 +--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp ++++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +@@ -221,9 +221,6 @@ QWaylandXdgSurface::Popup::~Popup() + destroy(); + + if (m_grabbing) { +- auto *shell = m_xdgSurface->m_shell; +- Q_ASSERT(shell->m_topmostGrabbingPopup == this); +- shell->m_topmostGrabbingPopup = m_parentXdgSurface ? m_parentXdgSurface->m_popup : nullptr; + m_grabbing = false; + + // Synthesize Qt enter/leave events for popup +@@ -255,7 +252,6 @@ void QWaylandXdgSurface::Popup::resetConfiguration() + + void QWaylandXdgSurface::Popup::grab(QWaylandInputDevice *seat, uint serial) + { +- m_xdgSurface->m_shell->m_topmostGrabbingPopup = this; + xdg_popup::grab(seat->wl_seat(), serial); + m_grabbing = true; + } +@@ -566,20 +562,6 @@ void QWaylandXdgSurface::setPopup(QWaylandWindow *parent) + + void QWaylandXdgSurface::setGrabPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial) + { +- auto parentXdgSurface = qobject_cast(parent->shellSurface()); +- auto *top = m_shell->m_topmostGrabbingPopup; +- +- if (top && top->m_xdgSurface != parentXdgSurface) { +- qCWarning(lcQpaWayland) << "setGrabPopup called with a parent," << parentXdgSurface +- << "which does not match the current topmost grabbing popup," +- << top->m_xdgSurface << "According to the xdg-shell protocol, this" +- << "is not allowed. The wayland QPA plugin is currently handling" +- << "it by setting the parent to the topmost grabbing popup." +- << "Note, however, that this may cause positioning errors and" +- << "popups closing unxpectedly because xdg-shell mandate that child" +- << "popups close before parents"; +- parent = top->m_xdgSurface->m_window; +- } + setPopup(parent); + m_popup->grab(device, serial); + +diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h +index 951e8234..e2dc12dd 100644 +--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h ++++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h +@@ -171,7 +171,6 @@ private: + QScopedPointer m_xdgDecorationManager; + QScopedPointer m_xdgActivation; + QScopedPointer m_xdgExporter; +- QWaylandXdgSurface::Popup *m_topmostGrabbingPopup = nullptr; + + friend class QWaylandXdgSurface; + }; +-- +cgit v1.2.3 + diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-62044.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-62044.patch deleted file mode 100755 index caf3f746fd..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-62044.patch +++ /dev/null @@ -1,50 +0,0 @@ -From fd9fec4fc7f43fb939e8e5a946c7858390bbd9d3 Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Thu, 8 Feb 2018 16:53:39 +0100 -Subject: [PATCH] Fix crash when connecting a new screen - -In QWaylandWindow::virtualSiblings, don't include screens that have not been -added yet. I.e. QWaylandScreens for which QPlatformIntegration::screenAdded has -not yet been called. - -There are two reasons why this crash wasn't covered by the -removePrimaryScreen() test. First of all, the mock output didn't send -wl_output.done events when updating the mode/geometry. These wayland events are -what causes QWindowSystemInterface::handleScreenGeometryChange() to be called -(where virtualSiblings are called). - -Furthermore, virtualSiblings is only called when the geometry actually changes, -so add a new test that changes the screen geometry of the existing screen while -a new one is being added (i.e. moves it to the right). - -Task-number: QTBUG-62044 -Change-Id: I623fbf8799d21c6b9293e7120ded301277639cc6 -Reviewed-by: David Edmundson -Reviewed-by: Aleix Pol -Reviewed-by: Paul Olav Tvete ---- - src/client/qwaylandscreen.cpp | 6 ++++-- - tests/auto/client/client/tst_client.cpp | 25 +++++++++++++++++++++++++ - tests/auto/client/shared/mockcompositor.cpp | 8 ++++++++ - tests/auto/client/shared/mockcompositor.h | 2 ++ - tests/auto/client/shared/mockoutput.cpp | 27 +++++++++++++++++++++++++-- - tests/auto/client/shared/mockoutput.h | 1 + - 6 files changed, 65 insertions(+), 4 deletions(-) - -diff --git a/src/client/qwaylandscreen.cpp b/src/client/qwaylandscreen.cpp -index fba75557..1c9ce23b 100644 ---- a/src/client/qwaylandscreen.cpp -+++ b/src/client/qwaylandscreen.cpp -@@ -138,8 +138,10 @@ QList QWaylandScreen::virtualSiblings() const - QList list; - const QList screens = mWaylandDisplay->screens(); - list.reserve(screens.count()); -- foreach (QWaylandScreen *screen, screens) -- list << screen; -+ for (QWaylandScreen *screen : qAsConst(screens)) { -+ if (screen->screen()) -+ list << screen; -+ } - return list; - } - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-66867.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-66867.patch deleted file mode 100755 index bb040279b4..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-66867.patch +++ /dev/null @@ -1,30 +0,0 @@ -From e283cc059c83cbb4fe677beaca8aebb99156ccc5 Mon Sep 17 00:00:00 2001 -From: Antonio Larrosa -Date: Mon, 5 Mar 2018 13:56:15 +0100 -Subject: Test for null pointer before using it - -Task-number: QTBUG-66867 -Change-Id: Ibbe407fa3ac32141b52fa0086e9f1ebfd27052ba -Done-with: Fabian Vogt -Reviewed-by: Johan Helsing -Reviewed-by: Jan Grulich ---- - src/client/qwaylandwindow.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp -index ecab8ffc..7d868b30 100644 ---- a/src/client/qwaylandwindow.cpp -+++ b/src/client/qwaylandwindow.cpp -@@ -785,7 +785,7 @@ static QWaylandWindow *closestShellSurfaceWindow(QWindow *window) - { - while (window) { - auto w = static_cast(window->handle()); -- if (w->shellSurface()) -+ if (w && w->shellSurface()) - return w; - window = window->transientParent() ? window->transientParent() : window->parent(); - } --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-67150.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-67150.patch deleted file mode 100755 index 3af2e0852d..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-67150.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 26a6372bb0c6528358e34f8175a14ff0be47fb12 Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Mon, 19 Mar 2018 10:21:47 +0100 -Subject: xdg-shell v5,v6 shell integrations: Fix crash when showing popups - -If a popup was shown without any input events happening first, it would cause -nullptr dereferences in both xdg-shell v5 and v6. - -Fixes crashes in: - -- tst_QAccessibility::comboBoxTest -- tst_QAccessibility::menuTest -- tst_QWindow::touchInterruptedByPopup -- tst_QFocusEvent::checkReason_Popup - -Task-number: QTBUG-67150 -Change-Id: Ib3e06326f71e4ab5f74727cb4f79626a21c34d55 -Reviewed-by: Paul Olav Tvete ---- - src/client/qwaylandxdgshell.cpp | 3 +-- - src/client/qwaylandxdgshell_p.h | 2 +- - src/client/qwaylandxdgshellintegration.cpp | 5 +++-- - src/client/qwaylandxdgshellv6.cpp | 5 +++-- - 4 files changed, 8 insertions(+), 7 deletions(-) - -diff --git a/src/client/qwaylandxdgshell.cpp b/src/client/qwaylandxdgshell.cpp -index 8b252b95..9a34e72d 100644 ---- a/src/client/qwaylandxdgshell.cpp -+++ b/src/client/qwaylandxdgshell.cpp -@@ -73,12 +73,11 @@ QWaylandXdgSurface *QWaylandXdgShell::createXdgSurface(QWaylandWindow *window) - return new QWaylandXdgSurface(this, window); - } - --QWaylandXdgPopup *QWaylandXdgShell::createXdgPopup(QWaylandWindow *window) -+QWaylandXdgPopup *QWaylandXdgShell::createXdgPopup(QWaylandWindow *window, QWaylandInputDevice *inputDevice) - { - QWaylandWindow *parentWindow = m_popups.empty() ? window->transientParent() : m_popups.last(); - ::wl_surface *parentSurface = parentWindow->object(); - -- QWaylandInputDevice *inputDevice = window->display()->lastInputDevice(); - if (m_popupSerial == 0) - m_popupSerial = inputDevice->serial(); - ::wl_seat *seat = inputDevice->wl_seat(); -diff --git a/src/client/qwaylandxdgshell_p.h b/src/client/qwaylandxdgshell_p.h -index afbd9c59..761f2521 100644 ---- a/src/client/qwaylandxdgshell_p.h -+++ b/src/client/qwaylandxdgshell_p.h -@@ -79,7 +79,7 @@ public: - ~QWaylandXdgShell() override; - - QWaylandXdgSurface *createXdgSurface(QWaylandWindow *window); -- QWaylandXdgPopup *createXdgPopup(QWaylandWindow *window); -+ QWaylandXdgPopup *createXdgPopup(QWaylandWindow *window, QWaylandInputDevice *inputDevice); - - private: - void xdg_shell_ping(uint32_t serial) override; -diff --git a/src/client/qwaylandxdgshellintegration.cpp b/src/client/qwaylandxdgshellintegration.cpp -index 5fa4385d..ee72c2d5 100644 ---- a/src/client/qwaylandxdgshellintegration.cpp -+++ b/src/client/qwaylandxdgshellintegration.cpp -@@ -74,8 +74,9 @@ bool QWaylandXdgShellIntegration::initialize(QWaylandDisplay *display) - - QWaylandShellSurface *QWaylandXdgShellIntegration::createShellSurface(QWaylandWindow *window) - { -- if (window->window()->type() == Qt::WindowType::Popup) -- return m_xdgShell->createXdgPopup(window); -+ QWaylandInputDevice *inputDevice = window->display()->lastInputDevice(); -+ if (window->window()->type() == Qt::WindowType::Popup && inputDevice) -+ return m_xdgShell->createXdgPopup(window, inputDevice); - else - return m_xdgShell->createXdgSurface(window); - } -diff --git a/src/client/qwaylandxdgshellv6.cpp b/src/client/qwaylandxdgshellv6.cpp -index c89c8316..a166a3bc 100644 ---- a/src/client/qwaylandxdgshellv6.cpp -+++ b/src/client/qwaylandxdgshellv6.cpp -@@ -165,8 +165,9 @@ void QWaylandXdgSurfaceV6::setAppId(const QString &appId) - - void QWaylandXdgSurfaceV6::setType(Qt::WindowType type, QWaylandWindow *transientParent) - { -- if ((type == Qt::Popup || type == Qt::ToolTip) && transientParent) { -- setPopup(transientParent, m_window->display()->lastInputDevice(), m_window->display()->lastInputSerial(), type == Qt::Popup); -+ QWaylandDisplay *display = m_window->display(); -+ if ((type == Qt::Popup || type == Qt::ToolTip) && transientParent && display->lastInputDevice()) { -+ setPopup(transientParent, display->lastInputDevice(), display->lastInputSerial(), type == Qt::Popup); - } else { - setToplevel(); - if (transientParent) { --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-80613.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtbug-80613.patch deleted file mode 100644 index dc157ca15e..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qtbug-80613.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 80ed5501cf5dcc4b6ef2a1a126d9d564c1c73851 Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Mon, 9 Dec 2019 11:06:18 +0100 -Subject: Client: Fix inverse repeat rate implementation - -The rate from wl_keyboard.repeat_info was used as if it was an interval. Fixed -by converting from key strokes per second to milliseconds per key stroke. - -This fixes a regression, as repeat rate used to be hard-coded to something -sensible before. - -[ChangeLog][QPA plugin] Fixed keyboard repeat rate being set inversely, so -higher rates would actually result in fewer characters per second, and vice -versa. - -Fixes: QTBUG-80613 -Change-Id: Ie783b90cba13dde6f37c0cd1be584d352cddfe7c -Reviewed-by: David Edmundson -Reviewed-by: Paul Olav Tvete ---- - src/client/qwaylandinputdevice.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp -index d812918e..3b26dc42 100644 ---- a/src/client/qwaylandinputdevice.cpp -+++ b/src/client/qwaylandinputdevice.cpp -@@ -88,7 +88,7 @@ QWaylandInputDevice::Keyboard::Keyboard(QWaylandInputDevice *p) - // or the server didn't send an enter event first. - return; - } -- mRepeatTimer.setInterval(mRepeatRate); -+ mRepeatTimer.setInterval(1000 / mRepeatRate); - handleKey(mRepeatKey.time, QEvent::KeyRelease, mRepeatKey.key, mRepeatKey.modifiers, - mRepeatKey.code, mRepeatKey.nativeVirtualKey, mRepeatKey.nativeModifiers, - mRepeatKey.text, true); --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtwayland-context-create.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtwayland-context-create.patch deleted file mode 100755 index 33c12a8c6d..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qtwayland-context-create.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 7ce033cbf9a80d2ea5d687956da668cf4567d361 Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Fri, 9 Mar 2018 10:30:52 +0100 -Subject: Don't try to create compatibility GL context when profile is unset - -Context creation would sometimes fail because of this. - -Change-Id: Icf73a42ee2bb984ebfc09b7ed98f094d544134b8 -Reviewed-by: Pier Luigi Fiorini -Reviewed-by: Andy Nichols ---- - .../client/wayland-egl/qwaylandglcontext.cpp | 16 ++++++++++++---- - 1 file changed, 12 insertions(+), 4 deletions(-) - -diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp -index 740e9641..6e48659d 100644 ---- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp -+++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp -@@ -259,10 +259,18 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, QWaylandDisplay *dis - } - // Profiles are OpenGL only and mandatory in 3.2+. The value is silently ignored for < 3.2. - if (m_format.renderableType() == QSurfaceFormat::OpenGL) { -- eglContextAttrs.append(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR); -- eglContextAttrs.append(format.profile() == QSurfaceFormat::CoreProfile -- ? EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR -- : EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR); -+ switch (format.profile()) { -+ case QSurfaceFormat::NoProfile: -+ break; -+ case QSurfaceFormat::CoreProfile: -+ eglContextAttrs.append(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR); -+ eglContextAttrs.append(EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR); -+ break; -+ case QSurfaceFormat::CompatibilityProfile: -+ eglContextAttrs.append(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR); -+ eglContextAttrs.append(EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR); -+ break; -+ } - } - } - eglContextAttrs.append(EGL_NONE); --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/files/qtwayland-key-compose.patch b/desktop/toolkit/qt6/qt6-wayland/files/qtwayland-key-compose.patch deleted file mode 100755 index 3d57269238..0000000000 --- a/desktop/toolkit/qt6/qt6-wayland/files/qtwayland-key-compose.patch +++ /dev/null @@ -1,176 +0,0 @@ -From 57c4af2b18c0fb1d266b245a107fa6cb876b9d9e Mon Sep 17 00:00:00 2001 -From: Giulio Camuffo -Date: Fri, 1 May 2015 17:12:22 +0300 -Subject: Implement basic key composition support - -Use xkbcommon-compose to handle basic compose key support. We should expand on -it in the future to handle things like resetting the compose state on text -field switching. - -Task-number: QTBUG-54792 -Task-number: QTBUG-64572 -Change-Id: I9d1d5ca4c9991928e12979f69eaa477e0cb28ada -Reviewed-by: Paul Olav Tvete ---- - src/client/qwaylandinputdevice.cpp | 65 +++++++++++++++++++++++++++++++++++++- - src/client/qwaylandinputdevice_p.h | 9 ++++++ - 2 files changed, 73 insertions(+), 1 deletion(-) - -diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp -index f6287ba8..115d6dbc 100644 ---- a/src/client/qwaylandinputdevice.cpp -+++ b/src/client/qwaylandinputdevice.cpp -@@ -70,6 +70,10 @@ - - #include - -+#if QT_CONFIG(xkbcommon_evdev) -+#include -+#endif -+ - QT_BEGIN_NAMESPACE - - namespace QtWaylandClient { -@@ -113,6 +117,7 @@ bool QWaylandInputDevice::Keyboard::createDefaultKeyMap() - qWarning() << "xkb_map_new_from_names failed, no key input"; - return false; - } -+ createComposeState(); - return true; - } - -@@ -125,11 +130,41 @@ void QWaylandInputDevice::Keyboard::releaseKeyMap() - if (mXkbContext) - xkb_context_unref(mXkbContext); - } -+ -+void QWaylandInputDevice::Keyboard::createComposeState() -+{ -+ static const char *locale = nullptr; -+ if (!locale) { -+ locale = getenv("LC_ALL"); -+ if (!locale) -+ locale = getenv("LC_CTYPE"); -+ if (!locale) -+ locale = getenv("LANG"); -+ if (!locale) -+ locale = "C"; -+ } -+ -+ mXkbComposeTable = xkb_compose_table_new_from_locale(mXkbContext, locale, XKB_COMPOSE_COMPILE_NO_FLAGS); -+ if (mXkbComposeTable) -+ mXkbComposeState = xkb_compose_state_new(mXkbComposeTable, XKB_COMPOSE_STATE_NO_FLAGS); -+} -+ -+void QWaylandInputDevice::Keyboard::releaseComposeState() -+{ -+ if (mXkbComposeState) -+ xkb_compose_state_unref(mXkbComposeState); -+ if (mXkbComposeTable) -+ xkb_compose_table_unref(mXkbComposeTable); -+ mXkbComposeState = nullptr; -+ mXkbComposeTable = nullptr; -+} -+ - #endif - - QWaylandInputDevice::Keyboard::~Keyboard() - { - #if QT_CONFIG(xkbcommon_evdev) -+ releaseComposeState(); - releaseKeyMap(); - #endif - if (mFocus) -@@ -626,6 +661,7 @@ void QWaylandInputDevice::Keyboard::keyboard_keymap(uint32_t format, int32_t fd, - - // Release the old keymap resources in the case they were already created in - // the key event or when the compositor issues a new map -+ releaseComposeState(); - releaseKeyMap(); - - mXkbContext = xkb_context_new(xkb_context_flags(0)); -@@ -634,6 +670,8 @@ void QWaylandInputDevice::Keyboard::keyboard_keymap(uint32_t format, int32_t fd, - close(fd); - - mXkbState = xkb_state_new(mXkbMap); -+ createComposeState(); -+ - #else - Q_UNUSED(format); - Q_UNUSED(fd); -@@ -717,12 +755,37 @@ void QWaylandInputDevice::Keyboard::keyboard_key(uint32_t serial, uint32_t time, - return; - } - -- const xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState, code); -+ QString composedText; -+ xkb_keysym_t sym = xkb_state_key_get_one_sym(mXkbState, code); -+ if (mXkbComposeState) { -+ if (isDown) -+ xkb_compose_state_feed(mXkbComposeState, sym); -+ xkb_compose_status status = xkb_compose_state_get_status(mXkbComposeState); -+ -+ switch (status) { -+ case XKB_COMPOSE_COMPOSED: { -+ int size = xkb_compose_state_get_utf8(mXkbComposeState, nullptr, 0); -+ QVarLengthArray buffer(size + 1); -+ xkb_compose_state_get_utf8(mXkbComposeState, buffer.data(), buffer.size()); -+ composedText = QString::fromUtf8(buffer.constData()); -+ sym = xkb_compose_state_get_one_sym(mXkbComposeState); -+ xkb_compose_state_reset(mXkbComposeState); -+ } break; -+ case XKB_COMPOSE_COMPOSING: -+ case XKB_COMPOSE_CANCELLED: -+ return; -+ case XKB_COMPOSE_NOTHING: -+ break; -+ } -+ } - - Qt::KeyboardModifiers modifiers = mParent->modifiers(); - - std::tie(qtkey, text) = QWaylandXkb::keysymToQtKey(sym, modifiers); - -+ if (!composedText.isNull()) -+ text = composedText; -+ - sendKey(window->window(), time, type, qtkey, modifiers, code, sym, mNativeModifiers, text); - #else - // Generic fallback for single hard keys: Assume 'key' is a Qt key code. -diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h -index adff3f11..07d261f3 100644 ---- a/src/client/qwaylandinputdevice_p.h -+++ b/src/client/qwaylandinputdevice_p.h -@@ -77,6 +77,11 @@ - struct wl_cursor_image; - #endif - -+#if QT_CONFIG(xkbcommon_evdev) -+struct xkb_compose_state; -+struct xkb_compose_table; -+#endif -+ - QT_BEGIN_NAMESPACE - - namespace QtWaylandClient { -@@ -208,6 +213,8 @@ public: - xkb_context *mXkbContext; - xkb_keymap *mXkbMap; - xkb_state *mXkbState; -+ xkb_compose_table *mXkbComposeTable = nullptr; -+ xkb_compose_state *mXkbComposeState = nullptr; - #endif - uint32_t mNativeModifiers; - -@@ -229,6 +236,8 @@ private: - #if QT_CONFIG(xkbcommon_evdev) - bool createDefaultKeyMap(); - void releaseKeyMap(); -+ void createComposeState(); -+ void releaseComposeState(); - #endif - - }; --- -cgit v1.2.1 - diff --git a/desktop/toolkit/qt6/qt6-wayland/pspec.xml b/desktop/toolkit/qt6/qt6-wayland/pspec.xml index 8519e198cc..75bd6b0195 100755 --- a/desktop/toolkit/qt6/qt6-wayland/pspec.xml +++ b/desktop/toolkit/qt6/qt6-wayland/pspec.xml @@ -24,7 +24,8 @@ qt6-declarative-devel - + qtbug-119110.patch + qtbug-118650.patch @@ -78,7 +79,7 @@ - 2023-11-17 + 2023-11-19 6.6.0 Version bump. Mustafa Cinasal