diff -Nru qtwayland-opensource-src-5.15.10/debian/changelog qtwayland-opensource-src-5.15.10/debian/changelog
--- qtwayland-opensource-src-5.15.10/debian/changelog	2024-12-09 16:30:30.000000000 +0800
+++ qtwayland-opensource-src-5.15.10/debian/changelog	2025-02-27 17:25:13.000000000 +0800
@@ -1,3 +1,9 @@
+qtwayland-opensource-src (5.15.10-2ok26update1) nile; urgency=medium
+
+  * cherry-pick form openkylin/huanghe
+
+ -- Jie Liu <liujie01@kylinos.cn>  Thu, 27 Feb 2025 17:25:13 +0800
+
 qtwayland-opensource-src (5.15.10-2ok26) nile; urgency=medium
 
   * Emit clipboard mode changed if datacontroldevice selection changed
diff -Nru qtwayland-opensource-src-5.15.10/debian/patches/0081-update-changlog-5.15.10-2ok30.patch qtwayland-opensource-src-5.15.10/debian/patches/0081-update-changlog-5.15.10-2ok30.patch
--- qtwayland-opensource-src-5.15.10/debian/patches/0081-update-changlog-5.15.10-2ok30.patch	1970-01-01 08:00:00.000000000 +0800
+++ qtwayland-opensource-src-5.15.10/debian/patches/0081-update-changlog-5.15.10-2ok30.patch	2025-02-27 17:25:13.000000000 +0800
@@ -0,0 +1,92 @@
+From: Jie Liu <liujie01@kylinos.cn>
+Date: Wed, 22 Jan 2025 16:08:54 +0800
+Subject: update changlog: 5.15.10-2ok30
+
+---
+ src/client/qwaylandcursor.cpp                                | 5 +++++
+ src/client/qwaylandcursor_p.h                                | 1 +
+ src/client/qwaylanddatadevice.cpp                            | 2 ++
+ src/client/qwaylandwindow.cpp                                | 8 ++++++--
+ src/plugins/shellintegration/ukui-shell/ukuishellsurface.cpp | 2 ++
+ 5 files changed, 16 insertions(+), 2 deletions(-)
+
+diff --git a/src/client/qwaylandcursor.cpp b/src/client/qwaylandcursor.cpp
+index e4eca9d..682d4ae 100644
+--- a/src/client/qwaylandcursor.cpp
++++ b/src/client/qwaylandcursor.cpp
+@@ -286,6 +286,11 @@ void QWaylandCursor::setPos(const QPoint &pos)
+     qCWarning(lcQpaWayland) << "Setting cursor position is not possible on wayland";
+ }
+ 
++void QWaylandCursor::updateDragCursorPos(const QPoint &pos)
++{
++    mLastPos = pos;
++}
++
+ } // namespace QtWaylandClient
+ 
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylandcursor_p.h b/src/client/qwaylandcursor_p.h
+index 751ffa6..a5e4231 100644
+--- a/src/client/qwaylandcursor_p.h
++++ b/src/client/qwaylandcursor_p.h
+@@ -127,6 +127,7 @@ public:
+     void pointerEvent(const QMouseEvent &event) override;
+     QPoint pos() const override;
+     void setPos(const QPoint &pos) override;
++    void updateDragCursorPos(const QPoint &pos);
+ 
+     static QSharedPointer<QWaylandBuffer> cursorBitmapBuffer(QWaylandDisplay *display, const QCursor *cursor);
+ 
+diff --git a/src/client/qwaylanddatadevice.cpp b/src/client/qwaylanddatadevice.cpp
+index e3e60ed..7f85aeb 100644
+--- a/src/client/qwaylanddatadevice.cpp
++++ b/src/client/qwaylanddatadevice.cpp
+@@ -48,6 +48,7 @@
+ #include "qwaylanddisplay_p.h"
+ #include "qwaylandabstractdecoration_p.h"
+ #include "qwaylandsurface_p.h"
++#include "qwaylandcursor_p.h"
+ 
+ #include <QtCore/QMimeData>
+ #include <QtGui/QGuiApplication>
+@@ -250,6 +251,7 @@ void QWaylandDataDevice::data_device_motion(uint32_t time, wl_fixed_t x, wl_fixe
+         return;
+ 
+     m_dragPoint = calculateDragPosition(x, y, m_dragWindow);
++    m_display->waylandCursor()->updateDragCursorPos(m_dragWindow->mapToGlobal(m_dragPoint));
+ 
+     QMimeData *dragData = nullptr;
+     Qt::DropActions supportedActions;
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index bd83953..ebe1e09 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -942,8 +942,12 @@ QWaylandWindow *QWaylandWindow::transientParent() const
+     if (auto transientParent = closestShellSurfaceWindow(window()->transientParent()))
+         return transientParent;
+ 
+-    if (QGuiApplication::focusWindow() && (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup))
+-        return closestShellSurfaceWindow(QGuiApplication::focusWindow());
++    if (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup) {
++        if (QGuiApplication::focusWindow())
++            return closestShellSurfaceWindow(QGuiApplication::focusWindow());
++        if (mDisplay->lastInputDevice() && mDisplay->lastInputDevice()->keyboardFocus())
++            return closestShellSurfaceWindow(mDisplay->lastInputDevice()->keyboardFocus()->window());
++    }
+ 
+     return nullptr;
+ }
+diff --git a/src/plugins/shellintegration/ukui-shell/ukuishellsurface.cpp b/src/plugins/shellintegration/ukui-shell/ukuishellsurface.cpp
+index 594f37d..bd0dd23 100644
+--- a/src/plugins/shellintegration/ukui-shell/ukuishellsurface.cpp
++++ b/src/plugins/shellintegration/ukui-shell/ukuishellsurface.cpp
+@@ -371,6 +371,8 @@ void UkuiShellSurface::setPopup(QWaylandWindow *parent)
+     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());
++    positioner->set_constraint_adjustment(QtWayland::xdg_positioner::constraint_adjustment_slide_x
++        | QtWayland::xdg_positioner::constraint_adjustment_slide_y);
+     m_popup = new Popup(this, parent, positioner);
+     positioner->destroy();
+ 
diff -Nru qtwayland-opensource-src-5.15.10/debian/patches/0082-update-changelog-5.15.10-2ok26update1.patch qtwayland-opensource-src-5.15.10/debian/patches/0082-update-changelog-5.15.10-2ok26update1.patch
--- qtwayland-opensource-src-5.15.10/debian/patches/0082-update-changelog-5.15.10-2ok26update1.patch	1970-01-01 08:00:00.000000000 +0800
+++ qtwayland-opensource-src-5.15.10/debian/patches/0082-update-changelog-5.15.10-2ok26update1.patch	2025-02-27 17:25:13.000000000 +0800
@@ -0,0 +1,261 @@
+From: Jie Liu <liujie01@kylinos.cn>
+Date: Thu, 27 Feb 2025 17:27:08 +0800
+Subject: update changelog: 5.15.10-2ok26update1
+
+---
+ include/QtWaylandClient/headers.pri             |  2 +-
+ src/3rdparty/protocol/kde-primary-output-v1.xml | 22 +++++++++++++++
+ src/3rdparty/protocol/qt_attribution.json       | 17 ++++++++++++
+ src/client/client.pro                           |  3 ++
+ src/client/qwaylanddisplay.cpp                  |  3 ++
+ src/client/qwaylanddisplay_p.h                  |  3 ++
+ src/client/qwaylandprimaryoutput.cpp            | 37 +++++++++++++++++++++++++
+ src/client/qwaylandprimaryoutput.h              | 30 ++++++++++++++++++++
+ sync.profile                                    |  2 ++
+ 9 files changed, 118 insertions(+), 1 deletion(-)
+ create mode 100644 src/3rdparty/protocol/kde-primary-output-v1.xml
+ create mode 100644 src/client/qwaylandprimaryoutput.cpp
+ create mode 100644 src/client/qwaylandprimaryoutput.h
+
+diff --git a/include/QtWaylandClient/headers.pri b/include/QtWaylandClient/headers.pri
+index bddf319..6840e8b 100644
+--- a/include/QtWaylandClient/headers.pri
++++ b/include/QtWaylandClient/headers.pri
+@@ -3,4 +3,4 @@ SYNCQT.GENERATED_HEADER_FILES = QWaylandClientExtension QWaylandClientExtensionT
+ SYNCQT.PRIVATE_HEADER_FILES = qtwaylandclientglobal_p.h qwaylandabstractdecoration_p.h qwaylandbuffer_p.h qwaylandclipboard_p.h qwaylandcursor_p.h qwaylanddatadevice_p.h qwaylanddatadevicemanager_p.h qwaylanddataoffer_p.h qwaylanddatasource_p.h qwaylanddecorationfactory_p.h qwaylanddecorationplugin_p.h qwaylanddisplay_p.h qwaylanddnd_p.h qwaylandextendedsurface_p.h qwaylandinputcontext_p.h qwaylandinputdevice_p.h qwaylandintegration_p.h qwaylandnativeinterface_p.h qwaylandprimaryselectionv1_p.h qwaylandqtkey_p.h qwaylandscreen_p.h qwaylandshellsurface_p.h qwaylandshm_p.h qwaylandshmbackingstore_p.h qwaylandshmwindow_p.h qwaylandsubsurface_p.h qwaylandsurface_p.h qwaylandtabletv2_p.h qwaylandtouch_p.h qwaylandvulkaninstance_p.h qwaylandvulkanwindow_p.h qwaylandwindow_p.h qwaylandwindowmanagerintegration_p.h global/qwaylandclientextension_p.h hardwareintegration/qwaylandclientbufferintegration_p.h hardwareintegration/qwaylandclientbufferintegrationfactory_p.h hardwareintegration/qwaylandclientbufferintegrationplugin_p.h hardwareintegration/qwaylandhardwareintegration_p.h hardwareintegration/qwaylandserverbufferintegration_p.h hardwareintegration/qwaylandserverbufferintegrationfactory_p.h hardwareintegration/qwaylandserverbufferintegrationplugin_p.h inputdeviceintegration/qwaylandinputdeviceintegration_p.h inputdeviceintegration/qwaylandinputdeviceintegrationfactory_p.h inputdeviceintegration/qwaylandinputdeviceintegrationplugin_p.h shellintegration/qwaylandshellintegration_p.h shellintegration/qwaylandshellintegrationfactory_p.h shellintegration/qwaylandshellintegrationplugin_p.h 
+ SYNCQT.QPA_HEADER_FILES = 
+ SYNCQT.CLEAN_HEADER_FILES = qtwaylandclientglobal.h global/qwaylandclientextension.h 
+-SYNCQT.INJECTIONS = src/client/qwayland-hardware-integration.h:^5.15.10/QtWaylandClient/private/qwayland-hardware-integration.h src/client/qwayland-qt-windowmanager.h:^5.15.10/QtWaylandClient/private/qwayland-qt-windowmanager.h src/client/qwayland-qt-key-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-qt-key-unstable-v1.h src/client/qwayland-server-buffer-extension.h:^5.15.10/QtWaylandClient/private/qwayland-server-buffer-extension.h src/client/qwayland-surface-extension.h:^5.15.10/QtWaylandClient/private/qwayland-surface-extension.h src/client/qwayland-tablet-unstable-v2.h:^5.15.10/QtWaylandClient/private/qwayland-tablet-unstable-v2.h src/client/qwayland-text-input-unstable-v2.h:^5.15.10/QtWaylandClient/private/qwayland-text-input-unstable-v2.h src/client/qwayland-touch-extension.h:^5.15.10/QtWaylandClient/private/qwayland-touch-extension.h src/client/qwayland-wayland.h:^5.15.10/QtWaylandClient/private/qwayland-wayland.h src/client/qwayland-wp-primary-selection-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-wp-primary-selection-unstable-v1.h src/client/qwayland-xdg-output-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-xdg-output-unstable-v1.h src/client/wayland-hardware-integration-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-hardware-integration-client-protocol.h src/client/wayland-qt-windowmanager-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-qt-windowmanager-client-protocol.h src/client/wayland-qt-key-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-qt-key-unstable-v1-client-protocol.h src/client/wayland-server-buffer-extension-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-server-buffer-extension-client-protocol.h src/client/wayland-surface-extension-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-surface-extension-client-protocol.h src/client/wayland-tablet-unstable-v2-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-tablet-unstable-v2-client-protocol.h src/client/wayland-text-input-unstable-v2-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-text-input-unstable-v2-client-protocol.h src/client/wayland-touch-extension-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-touch-extension-client-protocol.h src/client/wayland-wayland-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wayland-client-protocol.h src/client/wayland-wp-primary-selection-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wp-primary-selection-unstable-v1-client-protocol.h src/client/wayland-xdg-output-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-xdg-output-unstable-v1-client-protocol.h src/client/qwayland-wlr-data-control-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-wlr-data-control-unstable-v1.h src/client/wayland-wlr-data-control-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wlr-data-control-unstable-v1-client-protocol.h src/client/qwayland-wlr-screencopy-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-wlr-screencopy-unstable-v1.h src/client/wayland-wlr-screencopy-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wlr-screencopy-unstable-v1-client-protocol.h
+\ No newline at end of file
++SYNCQT.INJECTIONS = src/client/qwayland-hardware-integration.h:^5.15.10/QtWaylandClient/private/qwayland-hardware-integration.h src/client/qwayland-qt-windowmanager.h:^5.15.10/QtWaylandClient/private/qwayland-qt-windowmanager.h src/client/qwayland-qt-key-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-qt-key-unstable-v1.h src/client/qwayland-server-buffer-extension.h:^5.15.10/QtWaylandClient/private/qwayland-server-buffer-extension.h src/client/qwayland-surface-extension.h:^5.15.10/QtWaylandClient/private/qwayland-surface-extension.h src/client/qwayland-tablet-unstable-v2.h:^5.15.10/QtWaylandClient/private/qwayland-tablet-unstable-v2.h src/client/qwayland-text-input-unstable-v2.h:^5.15.10/QtWaylandClient/private/qwayland-text-input-unstable-v2.h src/client/qwayland-touch-extension.h:^5.15.10/QtWaylandClient/private/qwayland-touch-extension.h src/client/qwayland-wayland.h:^5.15.10/QtWaylandClient/private/qwayland-wayland.h src/client/qwayland-wp-primary-selection-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-wp-primary-selection-unstable-v1.h src/client/qwayland-xdg-output-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-xdg-output-unstable-v1.h src/client/wayland-hardware-integration-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-hardware-integration-client-protocol.h src/client/wayland-qt-windowmanager-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-qt-windowmanager-client-protocol.h src/client/wayland-qt-key-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-qt-key-unstable-v1-client-protocol.h src/client/wayland-server-buffer-extension-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-server-buffer-extension-client-protocol.h src/client/wayland-surface-extension-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-surface-extension-client-protocol.h src/client/wayland-tablet-unstable-v2-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-tablet-unstable-v2-client-protocol.h src/client/wayland-text-input-unstable-v2-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-text-input-unstable-v2-client-protocol.h src/client/wayland-touch-extension-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-touch-extension-client-protocol.h src/client/wayland-wayland-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wayland-client-protocol.h src/client/wayland-wp-primary-selection-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wp-primary-selection-unstable-v1-client-protocol.h src/client/wayland-xdg-output-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-xdg-output-unstable-v1-client-protocol.h src/client/qwayland-wlr-data-control-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-wlr-data-control-unstable-v1.h src/client/wayland-wlr-data-control-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wlr-data-control-unstable-v1-client-protocol.h src/client/qwayland-wlr-screencopy-unstable-v1.h:^5.15.10/QtWaylandClient/private/qwayland-wlr-screencopy-unstable-v1.h src/client/wayland-wlr-screencopy-unstable-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-wlr-screencopy-unstable-v1-client-protocol.h src/client/qwayland-kde-primary-output-v1.h:^5.15.10/QtWaylandClient/private/qwayland-kde-primary-output-v1.h src/client/wayland-kde-primary-output-v1-client-protocol.h:^5.15.10/QtWaylandClient/private/wayland-kde-primary-output-v1-client-protocol.h
+\ No newline at end of file
+diff --git a/src/3rdparty/protocol/kde-primary-output-v1.xml b/src/3rdparty/protocol/kde-primary-output-v1.xml
+new file mode 100644
+index 0000000..7da58ee
+--- /dev/null
++++ b/src/3rdparty/protocol/kde-primary-output-v1.xml
+@@ -0,0 +1,22 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="kde_primary_output_v1">
++  <copyright><![CDATA[
++    SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
++
++    SPDX-License-Identifier: MIT-CMU
++    ]]></copyright>
++
++<interface name="kde_primary_output_v1" version="1">
++  <description summary="expose which is the primary display">
++      Protocol for telling which is the primary display among the selection of enabled outputs.
++  </description>
++
++  <event name="primary_output">
++    <description summary="Provide the current primary output's name">
++      Specifies which output is the primary one identified by their uuid. See kde_output_device_v2 uuid event for more information about it.
++    </description>
++    <arg name="output_name" type="string" summary="the name of the output"/>
++  </event>
++</interface>
++
++</protocol>
+diff --git a/src/3rdparty/protocol/qt_attribution.json b/src/3rdparty/protocol/qt_attribution.json
+index 46318a8..569a1a7 100644
+--- a/src/3rdparty/protocol/qt_attribution.json
++++ b/src/3rdparty/protocol/qt_attribution.json
+@@ -285,4 +285,21 @@
+         "LicenseFile": "MIT_LICENSE.txt",
+         "Copyright": "Copyright © 2015 Martin Gräßlin\nCopyright © 2015 Marco Martin\n"
+     },
++
++    {
++        "Id": "kde-primary-output",
++        "Name": "KDE Primary Output Protocol",
++        "QDocModule": "qtwaylandcompositor",
++        "QtUsage": "Used in the Qt Wayland platform plugin",
++        "Files": "kde-primary-output-v1.xml",
++
++        "Description": "Protocol for telling which is the primary display among the selection of enabled outputs",
++        "Homepage": "https://invent.kde.org/libraries/plasma-wayland-protocols/",
++        "Version": "1",
++        "DownloadLocation": "https://invent.kde.org/libraries/plasma-wayland-protocols/-/raw/master/src/protocols/kde-primary-output-v1.xml",
++        "LicenseId": "MIT",
++        "License": "MIT License",
++        "LicenseFile": "MIT_LICENSE.txt",
++        "Copyright": "Copyright © 2021 Aleix Pol Gonzalez <aleixpol@kde.org>"
++    },
+ ]
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 3311340..48b2ac8 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -42,6 +42,7 @@ WAYLANDCLIENTSOURCES += \
+             ../3rdparty/protocol/tablet-unstable-v2.xml \
+             ../3rdparty/protocol/text-input-unstable-v2.xml \
+             ../3rdparty/protocol/xdg-output-unstable-v1.xml \
++            ../3rdparty/protocol/kde-primary-output-v1.xml \
+             ../3rdparty/protocol/wayland.xml
+ 
+ SOURCES +=  qwaylandintegration.cpp \
+@@ -52,6 +53,7 @@ SOURCES +=  qwaylandintegration.cpp \
+             qwaylandwindow.cpp \
+             qwaylandscreen.cpp \
+             qwaylandscreencopy.cpp \
++            qwaylandprimaryoutput.cpp \
+             qwaylandshmwindow.cpp \
+             qwaylandshellsurface.cpp \
+             qwaylandextendedsurface.cpp \
+@@ -78,6 +80,7 @@ HEADERS +=  qwaylandintegration_p.h \
+             qwaylandwindow_p.h \
+             qwaylandscreen_p.h \
+             qwaylandscreencopy_p.h \
++            qwaylandprimaryoutput.h \
+             qwaylandshmbackingstore_p.h \
+             qwaylandinputdevice_p.h \
+             qwaylandbuffer_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 7705a59..3fb953f 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -51,6 +51,7 @@
+ #include "qwaylanddatacontrolv1_p.h"
+ #endif
+ #include "qwaylandscreencopy_p.h"
++#include "qwaylandprimaryoutput.h"
+ #if QT_CONFIG(wayland_datadevice)
+ #include "qwaylanddatadevicemanager_p.h"
+ #include "qwaylanddatadevice_p.h"
+@@ -558,6 +559,8 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+         } else {
+             qCWarning(lcQpaWayland) << "Screencopy is disabled by environment, set env QT_WAYLAND_USE_WLR_SCREENCOPY=1 to enable";
+         }
++    } else if (interface == QLatin1String("kde_primary_output_v1")) {
++        m_primaryOutput.reset(new QWaylandPrimaryOutputV1(this, id, version));
+     }
+ 
+     mGlobals.append(RegistryGlobal(id, interface, version, registry));
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index 8475452..f52f9b1 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -99,6 +99,7 @@ class QWaylandWindowManagerIntegration;
+ class QWaylandDataControlManagerV1;
+ #endif
+ class QWaylandScreenCopyManagerV1;
++class QWaylandPrimaryOutputV1;
+ class QWaylandDataDeviceManager;
+ #if QT_CONFIG(wayland_client_primary_selection)
+ class QWaylandPrimarySelectionDeviceManagerV1;
+@@ -183,6 +184,7 @@ public:
+     QWaylandDataControlManagerV1 *dataControlManager() const { return m_dataControlManager.data(); }
+ #endif
+     QWaylandScreenCopyManagerV1 *screencopyManager() const { return m_screencopyManager.data(); }
++    QWaylandPrimaryOutputV1 *primaryOutput() const { return m_primaryOutput.data(); }
+ 
+     struct RegistryGlobal {
+         uint32_t id;
+@@ -282,6 +284,7 @@ private:
+     QScopedPointer<QWaylandDataControlManagerV1> m_dataControlManager;
+ #endif
+     QScopedPointer<QWaylandScreenCopyManagerV1> m_screencopyManager;
++    QScopedPointer<QWaylandPrimaryOutputV1> m_primaryOutput;
+     QSocketNotifier *mReadNotifier = nullptr;
+     int mFd = -1;
+     int mWritableNotificationFd = -1;
+diff --git a/src/client/qwaylandprimaryoutput.cpp b/src/client/qwaylandprimaryoutput.cpp
+new file mode 100644
+index 0000000..d694839
+--- /dev/null
++++ b/src/client/qwaylandprimaryoutput.cpp
+@@ -0,0 +1,37 @@
++// SPDX-FileCopyrightText: 2024 KylinSoft Co., Ltd.
++//
++// SPDX-License-Identifier: GPL-1.0-or-later
++
++#include "qwaylandprimaryoutput.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtGui/qpa/qwindowsysteminterface.h>
++
++#include <QScreen>
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWaylandClient
++{
++
++QWaylandPrimaryOutputV1::QWaylandPrimaryOutputV1(QWaylandDisplay *display, uint id, uint version)
++    : QtWayland::kde_primary_output_v1(display->wl_registry(), id, qMin(version, uint(1)))
++    , m_display(display)
++{
++}
++
++void QWaylandPrimaryOutputV1::kde_primary_output_v1_primary_output(const QString &output_name)
++{
++    const auto screens = m_display->screens();
++    for (auto *screen : screens) {
++        if (screen->name() == output_name) {
++            QWindowSystemInterface::handlePrimaryScreenChanged(screen);
++            break;
++        }
++    }
++}
++} // namespace QtWaylandClient
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandprimaryoutput.h b/src/client/qwaylandprimaryoutput.h
+new file mode 100644
+index 0000000..c61a6c3
+--- /dev/null
++++ b/src/client/qwaylandprimaryoutput.h
+@@ -0,0 +1,30 @@
++// SPDX-FileCopyrightText: 2024 KylinSoft Co., Ltd.
++//
++// SPDX-License-Identifier: GPL-1.0-or-later
++
++#pragma once
++
++#include <QtWaylandClient/private/qwayland-kde-primary-output-v1.h>
++
++QT_BEGIN_NAMESPACE
++
++namespace QtWaylandClient {
++
++class QWaylandDisplay;
++
++class QWaylandPrimaryOutputV1 : public QtWayland::kde_primary_output_v1
++{
++public:
++    QWaylandPrimaryOutputV1(QWaylandDisplay *display, uint id, uint version);
++    ~QWaylandPrimaryOutputV1() = default;
++
++protected:
++    void kde_primary_output_v1_primary_output(const QString &output_name) override;
++
++private:
++    QWaylandDisplay *m_display = nullptr;
++};
++
++} // namespace QtWaylandClient
++
++QT_END_NAMESPACE
+diff --git a/sync.profile b/sync.profile
+index 7d9fb62..c5a4375 100644
+--- a/sync.profile
++++ b/sync.profile
+@@ -31,6 +31,7 @@
+         "^qwayland-wp-primary-selection-unstable-v1.h",
+         "^qwayland-wlr-data-control-unstable-v1.h",
+         "^qwayland-wlr-screencopy-unstable-v1.h",
++        "^qwayland-kde-primary-output-v1.h",
+         "^qwayland-xdg-output-unstable-v1.h",
+         "^wayland-hardware-integration-client-protocol.h",
+         "^wayland-qt-windowmanager-client-protocol.h",
+@@ -44,6 +45,7 @@
+         "^wayland-wp-primary-selection-unstable-v1-client-protocol.h",
+         "^wayland-wlr-data-control-unstable-v1-client-protocol.h",
+         "^wayland-wlr-screencopy-unstable-v1-client-protocol.h",
++        "^wayland-kde-primary-output-v1-client-protocol.h",
+         "^wayland-xdg-output-unstable-v1-client-protocol.h",
+     ],
+     "$basedir/src/plugins/shellintegration/xdg-shell" => [
diff -Nru qtwayland-opensource-src-5.15.10/debian/patches/series qtwayland-opensource-src-5.15.10/debian/patches/series
--- qtwayland-opensource-src-5.15.10/debian/patches/series	2024-12-09 16:30:30.000000000 +0800
+++ qtwayland-opensource-src-5.15.10/debian/patches/series	2025-02-27 17:25:13.000000000 +0800
@@ -78,3 +78,5 @@
 0078-update-changelog-5.15.10-2ok24.patch
 0079-Revert-wayland-tooltip.patch
 0080-update-changed-5.15.10-2ok26.patch
+0081-update-changlog-5.15.10-2ok30.patch
+0082-update-changelog-5.15.10-2ok26update1.patch