diff -pruN 4:6.3.5-1/debian/changelog 4:6.3.5-0ubuntu2/debian/changelog
--- 4:6.3.5-1/debian/changelog	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/changelog	2025-06-14 07:15:21.000000000 +0000
@@ -1,135 +1,82 @@
-kwin (4:6.3.5-1) unstable; urgency=medium
+kwin (4:6.3.5-0ubuntu2) questing; urgency=medium
 
-  [ Aurélien COUDERC ]
-  * New upstream release (6.3.5).
-    - Renderloop: take subsurfaces into account for vrr scheduling.
-    - Backends/drm: with "prefer color accuracy", don't allow direct scaonut
-    with color ops. (kde#503742)
-    - Effect/offscreeneffect: guard against allocating zero-size textures.
-    (kde#485884)
-    - Input: set the current surface correctly for tablet events. (kde#499576,
-    kde#498386)
-    - Backends/drm: guard updateCursorLayer for a nullptr pipeline.
-    (kde#502951)
-    - Core/colorpipeline: optimize out black point compensation. (kde#500019)
-    - Revert "plugins/nightlight: Fix conversion between local time and utc
-    time".
-    - Plugins/nightlight: Fix conversion between local time and utc time.
-    - Compositor: fix dimming constantly scheduling repaints.
-    - Input: do not pass power button to lockscreen.
-    - Effect: Allow AnimationEffect running while the screen is locked.
-    - Outputconfigurationstore: disable autorotate when screen is off.
-    - Autotests/x11keyread: fix race condition.
-    - Autotests/x11keyread: re-format the code.
-    - Core/colorspace: fix primaries for generic film.
-    - Ci: Adjust to SUSE CI image changes.
-    - Opengl/eglcontext: only delete the vao if the context is current.
-    - Wayland: fix the rendering intent being ignored, and add a test for it.
-    - Opengl/glshader: ensure no tone mapping gets applied with colorimetric
-    rendering intents.
-    - Wayland/colormanagement: use 203cd/m² reference luminance for Windows
-    scRGB.
-    - Kcms/xwayland: Fix highlighting on first radiobutton.
-    - Plugins/minimizeall: fix unreachable activity check.
-    - Disconnected signal in X11Window::associate().
-    - Break Workspace::outputRemoved connection when a layer shell window is
-    destroyed.
-    - Layershellv1window: close the window when the desired output gets
-    removed.
-    - Simplify xwayland surface association.
-    - Fix a crash in RenderLoop::scheduleRepaint.
-    - Xdgshellwindow: Keep window on output when opening under cursor.
-    (kde#495987)
-    - Xdgactivation: downgrade "cannot grant a token" warning to a debug
-    message. (kde#500393)
-    - Backends/drm: also clean up pending with legacy modesetting.
-    - Backends/drm: set internal display brightness with HDR in
-    applyQueuedChanges.
-    - Backends/drm: set laptop display brightness to 100% with HDR.
-    - Backends/drm: reduce minimum luminance for SDR. (kde#501247)
-    - Avoid synchronizing keyboard modifiers if dnd source is null.
-    (kde#502504)
-    - Backends/drm: immediately force a modeset on bad link status.
-    (kde#502542)
-    - Xwayland: Only pass actual mime type offers to Wayland clients.
-    - Xkb: Guard more methods against not having a keymap or state.
-    - Plugins/eis: Guard against empty keymap.
-  * Relax inter-plasma versioned dependency constraint so we can upload
-    only 6.3.5 packages that have actual code changes.
-  * Drop backported patch now part of the upstream release.
-  * Backport upstream commits scheduled for 6.3.6:
-    - Fix crash on Display disconnect. (kde#504516)
-    - core/iccprofile: also estimate black point even if there's no luminance
-    tag.
-    - wayland/colormanagement: fix sending target luminance levels.
-    - wayland/colormanagement: compare primaries with the protocol's
-    resolution.
-    - x11: Add an environment variable to disable _NET_WM_SYNC_REQUEST in
-    X11Window.
-    - Fixed several cases where using a color picker to pick a screen color
-    could return a very subtly wrong result when using certain combinations of
-    Night Light, ICC profiles, HDR, 10-bit color, or any other features that
-    globally change all colors on the screen. (kde#491633)
-    - Don't leak lcms tone curves.
-    - When XWayland-using apps deliberately ask to open on a specific screen,
-    the screen they open on now more reliably matches the one they wanted.
-    - Fixed a case where junky graphical glitches could briefly be seen on the
-    screen after logging in but before Plasma’s splash screen or desktop
-    loads. (kde#504258)
-    - outputconfigurationstore: disable adaptive sync by default since there
-    are too many driver bugs with VRR to make it active by default.
-    - backends/drm: Fix potential crash by adding missing null guard.
-    - The Legacy X11 App Support settings now apply accurately no matter what
-    keyboard layout you’re using. (kde#500032)
-    - backends/drm: reduce severity of pageflip failure logging to avoid
-    journal spam when playing fullscreen videos. (kde#505028)
-  * Backport other upstream commits:
-    - Dim the rest of the screen when there’s an active system /
-    authentication prompt to ensure it gets user attention.
-    - Fix framerate drops with night light on when changing brightness.
-    (kde#495167)
-    - Add support for the MouseKeys accessibility feature also on Wayland.
-    (kde#478620)
-    - Fix sticky keys not unlatching after mouse click.
-    - Fix Severe input latency and limited refresh rate option on resolutions
-    other than the native one on kwin wayland. (kde#504655)
-    - Fix Firefox download popup drag not working. (kde#497031)
-  * Point upstream source to invent git repo.
-
- -- Aurélien COUDERC <coucouf@debian.org>  Tue, 20 May 2025 08:34:30 +0200
-
-kwin (4:6.3.4-3) unstable; urgency=medium
-
-  [ Aurélien COUDERC ]
-  * Backport upstream commit to fix common kwin crash.
-
- -- Aurélien COUDERC <coucouf@debian.org>  Sun, 13 Apr 2025 01:05:17 +0200
-
-kwin (4:6.3.4-2) unstable; urgency=medium
+  * Add xorg dependency to kwin-x11 as that dependency will sonn be
+    removed from desktop-common. (LP: #2114015)
 
-  [ Aurélien COUDERC ]
-  * Merge keys in upstream keyring.
-  * Set correct capabilities for kwin-wayland. (Closes: #1102069)
+ -- Rik Mills <rikmills@kde.org>  Sat, 14 Jun 2025 08:15:21 +0100
 
- -- Aurélien COUDERC <coucouf@debian.org>  Sat, 05 Apr 2025 09:44:33 +0200
+kwin (4:6.3.5-0ubuntu1) questing; urgency=medium
 
-kwin (4:6.3.4-1) unstable; urgency=medium
+  * New upstream release (6.3.5)
+  * Drop included upstream_backport-crash-fix-93bf2f98.patch
 
-  [ Patrick Franz ]
-  * New upstream release (6.3.4).
-  * Update build-deps and deps with the info from cmake.
+ -- Rik Mills <rikmills@kde.org>  Tue, 06 May 2025 21:34:10 +0100
+
+kwin (4:6.3.4-0ubuntu2) plucky; urgency=medium
+
+  * Backport crash fix requested by KDE developers:
+    https://mail.kde.org/pipermail/distributions/2025-April/001573.html
+    - d/p: upstream_backport-crash-fix-93bf2f98.patch
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 10 Apr 2025 17:56:15 +0100
+
+kwin (4:6.3.4-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.3.4)
+  * Drop no longer required upstream patches.
+    - Remove upstream_fix-kde-bug-501357.patch
+    - Remove bump-project-version.patch
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 02 Apr 2025 08:55:53 +0100
+
+kwin (4:6.3.3-0ubuntu4) plucky; urgency=medium
+
+  * No-change rebuild for Qt 6.8.3 (LP: #2103945).
+
+ -- Simon Quigley <tsimonq2@ubuntu.com>  Sat, 29 Mar 2025 15:14:20 -0500
+
+kwin (4:6.3.3-0ubuntu3) plucky; urgency=medium
+
+  * Add upstream_fix-kde-bug-501357.patch to fix kwin/rules kcm options
+    comboboxes not showing content.
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 20 Mar 2025 10:48:31 +0000
+
+kwin (4:6.3.3-0ubuntu2) plucky; urgency=medium
+
+  * Add patch to bump project version in CMakeLists to 6.3.3.
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 11 Mar 2025 18:34:24 +0000
+
+kwin (4:6.3.3-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.3.3)
+  * Drop included upstream patches.
 
- -- Patrick Franz <deltaone@debian.org>  Thu, 03 Apr 2025 01:02:51 +0200
+ -- Rik Mills <rikmills@kde.org>  Tue, 11 Mar 2025 15:19:46 +0000
 
-kwin (4:6.3.2.1-2) unstable; urgency=medium
+kwin (4:6.3.2.1-1ubuntu2) plucky; urgency=medium
 
-  * Team upload.
-  * Bump Standards-Version to 4.7.2, no changes required.
-  * Switch the hwdata dependency to pnp.ids, as kwin uses only pnp.ids;
-    note the build dependency is left unchanged on purpose.
-  * CI: simplify/improve config.
+  * Add patch recommended by upstream for KDE Bug 500819
+    https://bugs.kde.org/500819
 
- -- Pino Toscano <pino@debian.org>  Fri, 14 Mar 2025 17:18:43 +0100
+ -- Rik Mills <rikmills@kde.org>  Thu, 06 Mar 2025 00:03:39 +0000
+
+kwin (4:6.3.2.1-1ubuntu1) plucky; urgency=medium
+
+  * Merge from Debian unstable. Remaining changes:
+    - Kubuntu Vcs and maintainer fields.
+    - Build depend on KF6 6.10.0 and Plasma 6.3.2.
+    - Breaks/Replaces to suit Ubuntu upload history.
+    - Install org.kde.kwin.killer.desktop in kwin-data with the other
+      .desktop files.
+    - Add depend on qml6-module-qtqml-workerscript.
+    - Build depend on libcap2-bin so setcap binary can be found when
+      configuring.
+    - Do setcap CAP_SYS_NICE for kwin_wayland as requested by Plasma devs.
+    - Add ${python3:Depends} for kwin-data.
+
+ -- Rik Mills <rikmills@kde.org>  Mon, 03 Mar 2025 17:55:52 +0000
 
 kwin (4:6.3.2.1-1) unstable; urgency=medium
 
@@ -145,6 +92,30 @@ kwin (4:6.3.2.1-1) unstable; urgency=med
 
  -- Aurélien COUDERC <coucouf@debian.org>  Fri, 28 Feb 2025 01:01:30 +0100
 
+kwin (4:6.3.2.1-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.3.2.1)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 25 Feb 2025 23:16:19 +0000
+
+kwin (4:6.3.2-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.3.2)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 25 Feb 2025 18:16:15 +0000
+
+kwin (4:6.3.1-0ubuntu2) plucky; urgency=high
+
+  * Sync copyright update from Debian.
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 19 Feb 2025 06:45:47 +0000
+
+kwin (4:6.3.1-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.3.1)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 18 Feb 2025 14:23:15 +0000
+
 kwin (4:6.3.0-2) unstable; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -163,6 +134,12 @@ kwin (4:6.3.0-1) unstable; urgency=mediu
 
  -- Aurélien COUDERC <coucouf@debian.org>  Mon, 10 Feb 2025 15:07:44 +0100
 
+kwin (4:6.3.0-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.3.0)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 11 Feb 2025 12:55:21 +0000
+
 kwin (4:6.2.91-1) experimental; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -171,6 +148,18 @@ kwin (4:6.2.91-1) experimental; urgency=
 
  -- Aurélien COUDERC <coucouf@debian.org>  Thu, 23 Jan 2025 23:54:44 +0100
 
+kwin (4:6.2.91-0ubuntu2) plucky; urgency=medium
+
+  * No-change rebuild for Qt 6.8.2.
+
+ -- Simon Quigley <tsimonq2@ubuntu.com>  Thu, 06 Feb 2025 11:20:41 -0600
+
+kwin (4:6.2.91-0ubuntu1) plucky; urgency=medium
+
+  * New upstream (beta) release (6.2.91)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 23 Jan 2025 13:41:54 +0000
+
 kwin (4:6.2.90-1) experimental; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -181,6 +170,14 @@ kwin (4:6.2.90-1) experimental; urgency=
 
  -- Aurélien COUDERC <coucouf@debian.org>  Sun, 12 Jan 2025 00:48:50 +0100
 
+kwin (4:6.2.90-0ubuntu1) plucky; urgency=medium
+
+  * New upstream (beta) release (6.2.90)
+  * Switch kdecorations build dep to libkdecorations3-dev
+  * Update install files.
+
+ -- Rik Mills <rikmills@kde.org>  Sat, 11 Jan 2025 07:19:45 +0000
+
 kwin (4:6.2.5-1) unstable; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -189,6 +186,12 @@ kwin (4:6.2.5-1) unstable; urgency=mediu
 
  -- Aurélien COUDERC <coucouf@debian.org>  Sun, 05 Jan 2025 11:24:18 +0100
 
+kwin (4:6.2.5-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.2.5)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 31 Dec 2024 19:01:07 +0000
+
 kwin (4:6.2.4-1) unstable; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -197,6 +200,18 @@ kwin (4:6.2.4-1) unstable; urgency=mediu
 
  -- Aurélien COUDERC <coucouf@debian.org>  Tue, 03 Dec 2024 16:39:24 +0100
 
+kwin (4:6.2.4-0ubuntu2) plucky; urgency=medium
+
+  * No-change rebuild for Qt 6.8.1.
+
+ -- Simon Quigley <tsimonq2@ubuntu.com>  Sat, 07 Dec 2024 01:06:25 -0600
+
+kwin (4:6.2.4-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.2.4)
+
+ -- Rik Mills <rikmills@kde.org>  Tue, 26 Nov 2024 12:13:57 +0000
+
 kwin (4:6.2.3-1) unstable; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -209,6 +224,17 @@ kwin (4:6.2.3-1) unstable; urgency=mediu
 
  -- Aurélien COUDERC <coucouf@debian.org>  Sat, 23 Nov 2024 21:57:37 +0100
 
+kwin (4:6.2.3-0ubuntu1) plucky; urgency=medium
+
+  * New upstream release (6.2.0)
+  * New build depends on qt6-svg-dev and libcanberra-dev
+  * New upstream release (6.2.1)
+  * New upstream hotfix release (6.2.1.1)
+  * New upstream release (6.2.2)
+  * New upstream release (6.2.3)
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 07 Nov 2024 19:57:08 +0000
+
 kwin (4:6.2.2-1) experimental; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -258,6 +284,25 @@ kwin (4:6.1.5-1) experimental; urgency=m
 
  -- Aurélien COUDERC <coucouf@debian.org>  Wed, 11 Sep 2024 23:58:09 +0200
 
+kwin (4:6.1.5-0ubuntu3) plucky; urgency=medium
+
+  * Rebuild against Qt 6.7.2 private-abi.
+
+ -- Rik Mills <rikmills@kde.org>  Thu, 17 Oct 2024 17:07:04 +0100
+
+kwin (4:6.1.5-0ubuntu2) oracular; urgency=medium
+
+  * kwin-wayland: Recommend xwaylandvideobridge for screen sharing of
+    X11 apps under Wayland.
+
+ -- Rik Mills <rikmills@kde.org>  Fri, 13 Sep 2024 06:18:51 +0100
+
+kwin (4:6.1.5-0ubuntu1) oracular; urgency=medium
+
+  * New upstream release (6.1.5)
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 11 Sep 2024 05:59:35 +0100
+
 kwin (4:6.1.4-1) experimental; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -268,6 +313,19 @@ kwin (4:6.1.4-1) experimental; urgency=m
 
  -- Aurélien COUDERC <coucouf@debian.org>  Sun, 11 Aug 2024 23:58:28 +0200
 
+kwin (4:6.1.4-0ubuntu2) oracular; urgency=medium
+
+  * Add Breaks/Replaces for kwin-data -> kwin-addons (<< 4:6.1.4~).
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 21 Aug 2024 06:06:33 +0100
+
+kwin (4:6.1.4-0ubuntu1) oracular; urgency=medium
+
+  * New upstream release (6.1.4)
+  * Drop included upstream patch.
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 14 Aug 2024 21:42:24 +0100
+
 kwin (4:6.1.3-4) experimental; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -275,6 +333,15 @@ kwin (4:6.1.3-4) experimental; urgency=m
 
  -- Aurélien COUDERC <coucouf@debian.org>  Sun, 11 Aug 2024 22:51:39 +0200
 
+kwin (4:6.1.3-3ubuntu1) UNRELEASED; urgency=medium
+
+  * Add depend on qml6-module-qtqml-workerscript.
+  * Build depend on libcap2-bin so setcap binary can be found when
+    configuring.
+  * Do setcap CAP_SYS_NICE for kwin_wayland.
+
+ -- Rik Mills <rikmills@kde.org>  Wed, 31 Jul 2024 16:06:56 +0100
+
 kwin (4:6.1.3-3) experimental; urgency=medium
 
   [ Aurélien COUDERC ]
@@ -338,6 +405,12 @@ kwin (4:5.27.11-1) unstable; urgency=med
 
  -- Patrick Franz <deltaone@debian.org>  Sun, 19 May 2024 14:25:38 +0200
 
+kwin (4:5.27.11-0ubuntu4) oracular; urgency=medium
+
+  * No-change rebuild against wayland 1.23.0 (LP: #2074059)
+
+ -- Rik Mills <rikmills@kde.org>  Mon, 29 Jul 2024 17:48:33 +0100
+
 kwin (4:5.27.10-1) unstable; urgency=medium
 
   [ Patrick Franz ]
diff -pruN 4:6.3.5-1/debian/control 4:6.3.5-0ubuntu2/debian/control
--- 4:6.3.5-1/debian/control	2025-05-07 22:40:27.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/control	2025-06-14 07:15:21.000000000 +0000
@@ -1,18 +1,20 @@
 Source: kwin
 Section: kde
 Priority: optional
-Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
+Maintainer: Kubuntu Developers <kubuntu-devel@lists.ubuntu.com>
+XSBC-Original-Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
 Uploaders: Aurélien COUDERC <coucouf@debian.org>,
            Patrick Franz <deltaone@debian.org>,
-Build-Depends: debhelper-compat (= 13),
-               dh-sequence-kf6,
-               breeze-dev (>= 4:6.3.4~),
+Build-Depends: breeze-dev (>= 4:6.3.5~),
                cmake (>= 3.16~),
+               debhelper-compat (= 13),
+               dh-sequence-kf6,
+               dh-sequence-python3,
                extra-cmake-modules (>= 6.10.0~),
                gettext,
                hwdata,
-               kscreenlocker-dev (>= 6.3.4~),
-               kwayland-dev (>= 4:6.3.4~),
+               kscreenlocker-dev (>= 6.3.5~),
+               kwayland-dev (>= 4:6.3.5~),
                libcanberra-dev,
                libcap-dev [linux-any],
                libcap2-bin [linux-any],
@@ -26,7 +28,7 @@ Build-Depends: debhelper-compat (= 13),
                libgbm-dev,
                libice-dev,
                libinput-dev (>= 1.26~),
-               libkdecorations3-dev (>= 4:6.3.4~),
+               libkdecorations3-dev (>= 4:6.3.5~),
                libkf6auth-dev (>= 6.10.0~),
                libkf6colorscheme-dev (>= 6.10.0~),
                libkf6config-dev (>= 6.10.0~),
@@ -40,23 +42,23 @@ Build-Depends: debhelper-compat (= 13),
                libkf6guiaddons-dev (>= 6.10.0~),
                libkf6i18n-dev (>= 6.10.0~),
                libkf6idletime-dev (>= 6.10.0~),
-               libkf6itemviews-dev (>= 6.2.0~),
+               libkf6itemviews-dev (>= 6.10.0~),
                libkf6kcmutils-dev (>= 6.10.0~),
                libkf6newstuff-dev (>= 6.10.0~),
                libkf6notifications-dev (>= 6.10.0~),
                libkf6package-dev (>= 6.10.0~),
-               libkf6runner-dev (>= 6.2.0~),
+               libkf6runner-dev (>= 6.10.0~),
                libkf6service-dev (>= 6.10.0~),
                libkf6svg-dev (>= 6.10.0~),
                libkf6widgetsaddons-dev (>= 6.10.0~),
                libkf6windowsystem-dev (>= 6.10.0~),
                libkf6xmlgui-dev (>= 6.10.0~),
-               libkglobalacceld-dev (>= 6.3.4~),
+               libkglobalacceld-dev (>= 6.3.5~),
                libkirigami-dev (>= 6.10.0~),
                liblcms2-dev,
                libpipewire-0.3-dev (>= 0.3.29),
-               libplasma-dev (>= 6.3.4~),
-               libplasmaactivities-dev (>= 6.3.4~),
+               libplasma-dev (>= 6.3.5~),
+               libplasmaactivities-dev (>= 6.3.5~),
                libqaccessibilityclient-qt6-dev,
                libsm-dev,
                libsystemd-dev,
@@ -90,6 +92,7 @@ Build-Depends: debhelper-compat (= 13),
                libxkbcommon-x11-dev,
                pkgconf,
                plasma-wayland-protocols (>= 1.14.0~),
+               python3:any,
                qt6-5compat-dev (>= 6.7.0~),
                qt6-base-dev (>= 6.7.0~),
                qt6-base-private-dev (>= 6.6.0+dfsg~),
@@ -102,18 +105,18 @@ Build-Depends: debhelper-compat (= 13),
                qt6-wayland-dev-tools,
                wayland-protocols (>= 1.38~),
                xwayland (>= 2:22.1.7-1~),
-Standards-Version: 4.7.2
+Standards-Version: 4.7.0
 Homepage: https://projects.kde.org/projects/kde/workspace/kwin
-Vcs-Browser: https://salsa.debian.org/qt-kde-team/kde/kwin
-Vcs-Git: https://salsa.debian.org/qt-kde-team/kde/kwin.git
+Vcs-Browser: https://code.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/kwin
+Vcs-Git: https://git.launchpad.net/~kubuntu-packagers/kubuntu-packaging/+git/kwin
 Rules-Requires-Root: no
 
 Package: kwin-common
 Architecture: any
-Depends: kglobalacceld,
+Depends: hwdata,
+         kglobalacceld,
          kwin-data (= ${source:Version}),
          plasma-desktoptheme,
-         pnp.ids,
          qml6-module-org-kde-kirigami,
          qml6-module-org-kde-ksvg,
          qml6-module-qt5compat-graphicaleffects,
@@ -123,8 +126,6 @@ Depends: kglobalacceld,
          ${shlibs:Depends},
 Recommends: plasma-desktop (>= 4:6.2.90~),
 Suggests: kwin-addons (>= 4:6.2.90~),
-Breaks: kwin-data (<< 4:6.1.4-1),
-Replaces: kwin-data (<< 4:6.1.4-1),
 Description: KDE window manager, common files
  KWin (pronounced as one syllable "kwin") is the window
  manager for the KDE Plasma Desktop. It gives you complete
@@ -139,7 +140,7 @@ Description: KDE window manager, common
 Package: kwin-data
 Architecture: all
 Multi-Arch: foreign
-Depends: ${misc:Depends},
+Depends: ${misc:Depends}, ${python3:Depends},
 Recommends: plasma-desktoptheme,
             qml6-module-org-kde-kirigami,
             qml6-module-org-kde-kitemmodels,
@@ -147,14 +148,15 @@ Recommends: plasma-desktoptheme,
             qml6-module-org-kde-ksvg,
             qml6-module-org-kde-quickcharts,
             qml6-module-qt5compat-graphicaleffects,
+            qml6-module-qtqml-workerscript,
             qml6-module-qtmultimedia,
             qml6-module-qtquick,
             qml6-module-qtquick-controls,
             qml6-module-qtquick-layouts,
             qml6-module-qtquick-window,
             systemsettings,
-Breaks: kwin-addons (<< 4:6.0.0~),
-Replaces: kwin-addons (<< 4:6.0.0~),
+Breaks: kwin-addons (<< 4:6.1.4~),
+Replaces: kwin-addons (<< 4:6.1.4~),
 Description: KDE window manager data files
  KWin (pronounced as one syllable "kwin") is the window
  manager for the KDE Plasma Desktop. It gives you complete
@@ -209,7 +211,7 @@ Description: KDE window manager, Wayland
 
 Package: kwin-x11
 Architecture: any
-Depends: ${misc:Depends}, ${shlibs:Depends},
+Depends: xorg, ${misc:Depends}, ${shlibs:Depends},
 Provides: kwin, x-window-manager,
 Description: KDE window manager, X11 version
  KWin (pronounced as one syllable "kwin") is the window
diff -pruN 4:6.3.5-1/debian/copyright 4:6.3.5-0ubuntu2/debian/copyright
--- 4:6.3.5-1/debian/copyright	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/copyright	2025-06-14 07:15:21.000000000 +0000
@@ -1,6 +1,6 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: kwin
-Source: https://invent.kde.org/plasma/kwin
+Source: git://anongit.kde.org/kwin
 Upstream-Contact: plasma-devel@kde.org
 
 Files: *
diff -pruN 4:6.3.5-1/debian/kwin-common.install 4:6.3.5-0ubuntu2/debian/kwin-common.install
--- 4:6.3.5-1/debian/kwin-common.install	2025-02-10 13:50:56.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/kwin-common.install	2025-06-14 07:15:21.000000000 +0000
@@ -13,4 +13,3 @@ usr/lib/*/qt6/plugins/org.kde.kdecoratio
 usr/lib/*/qt6/plugins/plasma/kcms/systemsettings/
 usr/lib/*/qt6/plugins/plasma/kcms/systemsettings_qwidgets/
 usr/lib/*/qt6/qml/org/kde/kwin/
-usr/share/applications/org.kde.kwin.killer.desktop
diff -pruN 4:6.3.5-1/debian/kwin-data.install 4:6.3.5-0ubuntu2/debian/kwin-data.install
--- 4:6.3.5-1/debian/kwin-data.install	2024-11-26 07:57:07.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/kwin-data.install	2025-06-14 07:15:21.000000000 +0000
@@ -1,6 +1,7 @@
 usr/share/applications/kcm_kwin*.desktop
 usr/share/applications/kcm_virtualkeyboard.desktop
 usr/share/applications/kwin*.desktop
+usr/share/applications/org.kde.kwin.killer.desktop
 usr/share/config.kcfg/kwin*.kcfg
 usr/share/config.kcfg/nightlightsettings.kcfg
 usr/share/config.kcfg/virtualdesktopssettings.kcfg
diff -pruN 4:6.3.5-1/debian/kwin-wayland.postinst 4:6.3.5-0ubuntu2/debian/kwin-wayland.postinst
--- 4:6.3.5-1/debian/kwin-wayland.postinst	2025-04-05 08:21:56.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/kwin-wayland.postinst	2025-06-14 07:15:21.000000000 +0000
@@ -4,16 +4,12 @@ set -e
 
 if [ "$1" = configure ]; then
     # Set the capabilities
-    if command -v setcap > /dev/null ; then
-        cap="CAP_SYS_NICE=+ep"
-        binary=/usr/bin/kwin_wayland
-        if ! setcap -v "${cap}" "${binary}" > /dev/null; then
-            setcap "${cap}" "${binary}" \
-                && echo "Successfully set ${cap} for ${binary}" \
-                || echo "Failed to set ${cap} for ${binary}" >&2
-        fi
+    if command -v setcap > /dev/null && \
+       setcap "CAP_SYS_NICE=+ep" \
+            /usr/bin/kwin_wayland; then
+        echo "Sucessfully set capabilities for kwin_wayland"
     else
-        echo "setcap command not found, failed to set capabilities for kwin_wayland" >&2
+        echo "Failed to set capabilities for kwin_wayland" >&2
     fi
 fi
 
diff -pruN 4:6.3.5-1/debian/patches/relax-interplasma-versioned-deps.patch 4:6.3.5-0ubuntu2/debian/patches/relax-interplasma-versioned-deps.patch
--- 4:6.3.5-1/debian/patches/relax-interplasma-versioned-deps.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/relax-interplasma-versioned-deps.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -7,7 +7,7 @@
- set(CMAKE_CXX_STANDARD 23)
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
- 
--set(PROJECT_DEP_VERSION "6.3.5")
-+set(PROJECT_DEP_VERSION "6.3.4")
- set(QT_MIN_VERSION "6.7.0")
- set(KF6_MIN_VERSION "6.10.0")
- set(KDE_COMPILERSETTINGS_LEVEL "5.82")
diff -pruN 4:6.3.5-1/debian/patches/series 4:6.3.5-0ubuntu2/debian/patches/series
--- 4:6.3.5-1/debian/patches/series	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/series	1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-relax-interplasma-versioned-deps.patch
-upstream_3f0a8a88_plugins-dimscreen-Enable-by-default.patch
-upstream_68dbfe7a_backends-drm-prevent-the-main-thread-from-moving-the-target-pageflip-time-forward.patch
-upstream_602072c9_backends-drm-remove-unused-method.patch
-upstream_85eeafa0_backends-drm-dynamically-adjust-the-safety-margin-based-on-commit-time.patch
-upstream_7b93a776_Implement-MouseKeys-on-Wayland.patch
-upstream_801d31a9_plugins-stickykeys-Unlatch-keys-after-mouse-click.patch
-upstream_f1f25d2d_backends-drm-also-guard-DrmOutput-cursorLayer-for-nullptr-pipeline.patch
-upstream_1c071e40_core-iccprofile-also-estimate-black-point-even-if-there-s-no-luminance-tag.patch
-upstream_be55cfa2_wayland-colormanagement-fix-sending-target-luminance-levels.patch
-upstream_3c724b83_wayland-colormanagement-also-around-max-fall-and-max-cll.patch
-upstream_5cc72fe9_wayland-colormanagement-compare-primaries-with-the-protocol-s-resolution.patch
-upstream_473aebf0_x11-Add-an-environment-variable-to-disable-NET-WM-SYNC-REQUEST-in-X11Window.patch
-upstream_2d70fe62_plugins-colorpicker-use-BPC-when-converting-to-sRGB.patch
-upstream_cfd044a3_plugins-colorpicker-round-the-result.patch
-upstream_f82034f0_don-t-leak-lcms-tone-curves.patch
-upstream_8450d9a8_wayland-xdgoutput-round-the-scaled-output-position.patch
-upstream_04713f7b_Map-xinerama-index-to-Output-by-output-name.patch
-upstream_56760937_backends-drm-clear-the-test-buffer-with-legacy-modesetting.patch
-upstream_cc5d1256_outputconfigurationstore-disable-adaptive-sync-by-default.patch
-upstream_7f088c1b_backends-drm-Add-missing-null-guard.patch
-upstream_5c7d2de5_xwayland-Fix-leaking-normal-key-presses-with-keyboard-layouts-other-than-English.patch
-upstream_27d28c9c_backends-drm-reduce-severity-of-pageflip-failure-logging.patch
-upstream_612ec743_backends-drm-also-generate-modes-for-the-native-refresh-rate-of-the-display.patch
-upstream_1a6871de_wayland-Fix-focused-surface-check-in-wl-data-device-start-drag.patch
diff -pruN 4:6.3.5-1/debian/patches/upstream_04713f7b_Map-xinerama-index-to-Output-by-output-name.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_04713f7b_Map-xinerama-index-to-Output-by-output-name.patch
--- 4:6.3.5-1/debian/patches/upstream_04713f7b_Map-xinerama-index-to-Output-by-output-name.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_04713f7b_Map-xinerama-index-to-Output-by-output-name.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,214 +0,0 @@
-From 04713f7b76bc07ed0f24e8f2603702ef57dd42a6 Mon Sep 17 00:00:00 2001
-From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
-Date: Fri, 23 May 2025 12:46:17 +0000
-Subject: [PATCH] Map xinerama index to Output by output name
-
-Currently, xinerama indices are mapped to outputs by comparing geometries.
-The problem with that approach is that geometries may mismatch due to
-scaling being applied.
-
-Since version 23.1.0, Xwayland uses provided output connector names, so
-we can use them to find the matching output. This approach should be less
-affected by rounding issues.
-
-
-(cherry picked from commit 2de458c9fa643dc56acdd03609d6dcd20598920f)
-
-Co-authored-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
----
- src/utils/xcbutils.cpp     | 15 ++++++++++++++
- src/utils/xcbutils.h       |  2 ++
- src/workspace.cpp          | 41 ++++++++++++++++++++------------------
- src/workspace.h            |  1 +
- src/xwayland/drag_x.cpp    |  2 +-
- src/xwayland/selection.cpp | 17 +---------------
- src/xwayland/selection.h   |  1 -
- 7 files changed, 42 insertions(+), 37 deletions(-)
-
-diff --git a/src/utils/xcbutils.cpp b/src/utils/xcbutils.cpp
-index 171158ce57d..dbf55076e65 100644
---- a/src/utils/xcbutils.cpp
-+++ b/src/utils/xcbutils.cpp
-@@ -672,5 +672,20 @@ QRectF nativeFloor(const QRectF &rect)
-                                       nativeFloor(outputRect.width()), nativeFloor(outputRect.height())));
- }
- 
-+QString atomName(xcb_atom_t atom)
-+{
-+    xcb_connection_t *xcbConn = kwinApp()->x11Connection();
-+    xcb_get_atom_name_cookie_t nameCookie = xcb_get_atom_name(xcbConn, atom);
-+    xcb_get_atom_name_reply_t *nameReply = xcb_get_atom_name_reply(xcbConn, nameCookie, nullptr);
-+    if (!nameReply) {
-+        return QString();
-+    }
-+
-+    const size_t length = xcb_get_atom_name_name_length(nameReply);
-+    QString name = QString::fromLatin1(xcb_get_atom_name_name(nameReply), length);
-+    free(nameReply);
-+    return name;
-+}
-+
- } // namespace Xcb
- } // namespace KWin
-diff --git a/src/utils/xcbutils.h b/src/utils/xcbutils.h
-index 85e20c196fb..bfe6f8ae0b8 100644
---- a/src/utils/xcbutils.h
-+++ b/src/utils/xcbutils.h
-@@ -61,6 +61,8 @@ qreal KWIN_EXPORT nativeRound(qreal value);
-  */
- QRectF KWIN_EXPORT nativeFloor(const QRectF &value);
- 
-+QString KWIN_EXPORT atomName(xcb_atom_t atom);
-+
- // forward declaration of methods
- static void defineCursor(xcb_window_t window, xcb_cursor_t cursor);
- static void setInputFocus(xcb_window_t window, uint8_t revertTo = XCB_INPUT_FOCUS_POINTER_ROOT, xcb_timestamp_t time = xTime());
-diff --git a/src/workspace.cpp b/src/workspace.cpp
-index 192c5ca95eb..191a72f6c36 100644
---- a/src/workspace.cpp
-+++ b/src/workspace.cpp
-@@ -82,8 +82,6 @@
- #include <QDBusConnection>
- #include <QDBusPendingCall>
- #include <QMetaProperty>
--// xcb
--#include <xcb/xinerama.h>
- 
- namespace KWin
- {
-@@ -1185,6 +1183,16 @@ Output *Workspace::outputAt(const QPointF &pos) const
-     return bestOutput;
- }
- 
-+Output *Workspace::findOutput(const QString &name) const
-+{
-+    for (Output *output : std::as_const(m_outputs)) {
-+        if (output->name() == name) {
-+            return output;
-+        }
-+    }
-+    return nullptr;
-+}
-+
- Output *Workspace::findOutput(Output *reference, Direction direction, bool wrapAround) const
- {
-     QList<Output *> relevantOutputs;
-@@ -2582,31 +2590,26 @@ Output *Workspace::xineramaIndexToOutput(int index) const
-         return nullptr;
-     }
- 
--    const UniqueCPtr<xcb_xinerama_is_active_reply_t> active{xcb_xinerama_is_active_reply(connection, xcb_xinerama_is_active(connection), nullptr)};
--    if (!active || !active->state) {
-+    xcb_randr_get_monitors_cookie_t cookie = xcb_randr_get_monitors(kwinApp()->x11Connection(), kwinApp()->x11RootWindow(), 1);
-+    const UniqueCPtr<xcb_randr_get_monitors_reply_t> monitors(xcb_randr_get_monitors_reply(kwinApp()->x11Connection(), cookie, nullptr));
-+    if (!monitors) {
-         return nullptr;
-     }
- 
--    const UniqueCPtr<xcb_xinerama_query_screens_reply_t> screens(xcb_xinerama_query_screens_reply(connection, xcb_xinerama_query_screens(connection), nullptr));
--    if (!screens) {
--        return nullptr;
-+    xcb_randr_monitor_info_t *monitorInfo = nullptr;
-+    for (auto it = xcb_randr_get_monitors_monitors_iterator(monitors.get()); it.rem; xcb_randr_monitor_info_next(&it)) {
-+        const int current = monitors->nMonitors - it.rem;
-+        if (current == index) {
-+            monitorInfo = it.data;
-+            break;
-+        }
-     }
- 
--    const int infoCount = xcb_xinerama_query_screens_screen_info_length(screens.get());
--    if (index < 0 || index >= infoCount) {
-+    if (!monitorInfo) {
-         return nullptr;
-     }
- 
--    const xcb_xinerama_screen_info_t *infos = xcb_xinerama_query_screens_screen_info(screens.get());
--    const QRect needle(infos[index].x_org, infos[index].y_org, infos[index].width, infos[index].height);
--
--    for (Output *output : std::as_const(m_outputs)) {
--        if (Xcb::toXNative(output->geometryF()) == needle) {
--            return output;
--        }
--    }
--
--    return nullptr;
-+    return findOutput(Xcb::atomName(monitorInfo->name));
- }
- #endif
- 
-diff --git a/src/workspace.h b/src/workspace.h
-index e31f3702486..3112513bc35 100644
---- a/src/workspace.h
-+++ b/src/workspace.h
-@@ -357,6 +357,7 @@ public:
-         DirectionNext
-     };
-     Output *findOutput(Output *reference, Direction direction, bool wrapAround = false) const;
-+    Output *findOutput(const QString &name) const;
-     void switchToOutput(Output *output);
- 
-     QList<Output *> outputs() const;
-diff --git a/src/xwayland/drag_x.cpp b/src/xwayland/drag_x.cpp
-index 93d0c9d1f62..d61f1beff6b 100644
---- a/src/xwayland/drag_x.cpp
-+++ b/src/xwayland/drag_x.cpp
-@@ -51,7 +51,7 @@ static QStringList atomToMimeTypes(xcb_atom_t atom)
-     } else if (atom == atoms->netscape_url) {
-         mimeTypes << QStringLiteral("_NETSCAPE_URL");
-     } else {
--        mimeTypes << Selection::atomName(atom);
-+        mimeTypes << Xcb::atomName(atom);
-     }
-     return mimeTypes;
- }
-diff --git a/src/xwayland/selection.cpp b/src/xwayland/selection.cpp
-index 3f489b1a9a6..4409075332b 100644
---- a/src/xwayland/selection.cpp
-+++ b/src/xwayland/selection.cpp
-@@ -45,21 +45,6 @@ xcb_atom_t Selection::mimeTypeToAtomLiteral(const QString &mimeType)
-     return Xcb::Atom(mimeType.toLatin1(), false, kwinApp()->x11Connection());
- }
- 
--QString Selection::atomName(xcb_atom_t atom)
--{
--    xcb_connection_t *xcbConn = kwinApp()->x11Connection();
--    xcb_get_atom_name_cookie_t nameCookie = xcb_get_atom_name(xcbConn, atom);
--    xcb_get_atom_name_reply_t *nameReply = xcb_get_atom_name_reply(xcbConn, nameCookie, nullptr);
--    if (!nameReply) {
--        return QString();
--    }
--
--    const size_t length = xcb_get_atom_name_name_length(nameReply);
--    QString name = QString::fromLatin1(xcb_get_atom_name_name(nameReply), length);
--    free(nameReply);
--    return name;
--}
--
- QStringList Selection::atomToMimeTypes(xcb_atom_t atom)
- {
-     QStringList mimeTypes;
-@@ -74,7 +59,7 @@ QStringList Selection::atomToMimeTypes(xcb_atom_t atom)
-     } else if (atom == atoms->targets || atom == atoms->timestamp) {
-         // Ignore known ICCCM internal atoms
-     } else {
--        const QString atomNameName = atomName(atom);
-+        const QString atomNameName = Xcb::atomName(atom);
-         // Ignore other non-mimetype atoms
-         if (atomNameName.contains(QLatin1Char('/'))) {
-             mimeTypes << atomNameName;
-diff --git a/src/xwayland/selection.h b/src/xwayland/selection.h
-index 438fc4c6a6b..65a6ca87c09 100644
---- a/src/xwayland/selection.h
-+++ b/src/xwayland/selection.h
-@@ -49,7 +49,6 @@ public:
-     static xcb_atom_t mimeTypeToAtom(const QString &mimeType);
-     static xcb_atom_t mimeTypeToAtomLiteral(const QString &mimeType);
-     static QStringList atomToMimeTypes(xcb_atom_t atom);
--    static QString atomName(xcb_atom_t atom);
-     static void sendSelectionNotify(xcb_selection_request_event_t *event, bool success);
- 
-     // on selection owner changes by X clients (Xwl -> Wl)
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_1a6871de_wayland-Fix-focused-surface-check-in-wl-data-device-start-drag.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_1a6871de_wayland-Fix-focused-surface-check-in-wl-data-device-start-drag.patch
--- 4:6.3.5-1/debian/patches/upstream_1a6871de_wayland-Fix-focused-surface-check-in-wl-data-device-start-drag.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_1a6871de_wayland-Fix-focused-surface-check-in-wl-data-device-start-drag.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,162 +0,0 @@
-From 1a6871de0d17c7f65da8b96a703326437d736c17 Mon Sep 17 00:00:00 2001
-From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
-Date: Thu, 29 May 2025 16:13:23 +0000
-Subject: [PATCH] wayland: Fix focused surface check in
- wl_data_device.start_drag
-
-SeatInterface::focusedPointerSurface() contains the main surface, but the
-client can specify a subsurface.
-
-BUG: 497031
-
-
-(cherry picked from commit 40379821ee527ad7666de916f890852578c3a591)
-
-Co-authored-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
----
- autotests/wayland/client/test_drag_drop.cpp | 95 +++++++++++++++++++++
- src/wayland/datadevice.cpp                  |  2 +-
- src/wayland/seat.cpp                        |  1 -
- 3 files changed, 96 insertions(+), 2 deletions(-)
-
-diff --git a/autotests/wayland/client/test_drag_drop.cpp b/autotests/wayland/client/test_drag_drop.cpp
-index 86e033b4251..d2ea5b97804 100644
---- a/autotests/wayland/client/test_drag_drop.cpp
-+++ b/autotests/wayland/client/test_drag_drop.cpp
-@@ -42,6 +42,7 @@ private Q_SLOTS:
-     void cleanup();
- 
-     void testPointerDragAndDrop();
-+    void testPointerSubsurfaceDragAndDrop();
-     void testTouchDragAndDrop();
-     void testTouchSubsurfacesDragAndDrop();
-     void testDragAndDropWithCancelByDestroyDataSource();
-@@ -293,6 +294,100 @@ void TestDragAndDrop::testPointerDragAndDrop()
-     QVERIFY(pointerMotionSpy.isEmpty());
- }
- 
-+void TestDragAndDrop::testPointerSubsurfaceDragAndDrop()
-+{
-+    // this test verifies drag and drop from a subsurface works
-+    using namespace KWin;
-+
-+    std::unique_ptr<KWayland::Client::Surface> parentSurface(createSurface());
-+    parentSurface->setSize(QSize(100, 100));
-+    auto parentServerSurface = getServerSurface();
-+    QVERIFY(parentServerSurface);
-+
-+    std::unique_ptr<KWayland::Client::Surface> childSurface(createSurface());
-+    childSurface->setSize(QSize(100, 100));
-+    std::unique_ptr<KWayland::Client::SubSurface> subSurface(createSubSurface(childSurface.get(), parentSurface.get()));
-+    QVERIFY(subSurface);
-+    subSurface->setPosition({0, 0});
-+    auto childServerSurface = getServerSurface();
-+    QVERIFY(childServerSurface);
-+
-+    QSignalSpy dataSourceSelectedActionChangedSpy(m_dataSource, &KWayland::Client::DataSource::selectedDragAndDropActionChanged);
-+    auto timestamp = 2ms;
-+
-+    // now we need to pass pointer focus to the Surface and simulate a button press
-+    QSignalSpy buttonPressSpy(m_pointer, &KWayland::Client::Pointer::buttonStateChanged);
-+    m_seatInterface->setTimestamp(timestamp++);
-+    m_seatInterface->notifyPointerEnter(parentServerSurface, QPointF(0, 0));
-+    m_seatInterface->notifyPointerButton(1, PointerButtonState::Pressed);
-+    m_seatInterface->notifyPointerFrame();
-+    QVERIFY(buttonPressSpy.wait());
-+    QCOMPARE(buttonPressSpy.first().at(1).value<quint32>(), quint32(2));
-+
-+    // add some signal spies for client side
-+    QSignalSpy dragEnteredSpy(m_dataDevice, &KWayland::Client::DataDevice::dragEntered);
-+    QSignalSpy dragMotionSpy(m_dataDevice, &KWayland::Client::DataDevice::dragMotion);
-+    QSignalSpy pointerMotionSpy(m_pointer, &KWayland::Client::Pointer::motion);
-+    QSignalSpy sourceDropSpy(m_dataSource, &KWayland::Client::DataSource::dragAndDropPerformed);
-+
-+    // now we can start the drag and drop
-+    QSignalSpy dragStartedSpy(m_seatInterface, &SeatInterface::dragStarted);
-+    m_dataSource->setDragAndDropActions(KWayland::Client::DataDeviceManager::DnDAction::Copy | KWayland::Client::DataDeviceManager::DnDAction::Move);
-+    m_dataDevice->startDrag(buttonPressSpy.first().first().value<quint32>(), m_dataSource, childSurface.get());
-+    QVERIFY(dragStartedSpy.wait());
-+    QCOMPARE(m_seatInterface->dragSurface(), parentServerSurface);
-+    QCOMPARE(m_seatInterface->dragSurfaceTransformation(), QMatrix4x4());
-+    QVERIFY(!m_seatInterface->dragIcon());
-+    QCOMPARE(SeatInterfacePrivate::get(m_seatInterface)->drag.dragImplicitGrabSerial, buttonPressSpy.first().first().value<quint32>());
-+    QVERIFY(dragEnteredSpy.wait());
-+    QCOMPARE(dragEnteredSpy.count(), 1);
-+    QCOMPARE(dragEnteredSpy.first().first().value<quint32>(), m_display->serial());
-+    QCOMPARE(dragEnteredSpy.first().last().toPointF(), QPointF(0, 0));
-+    QCOMPARE(m_dataDevice->dragSurface().data(), parentSurface.get());
-+    auto offer = m_dataDevice->dragOffer();
-+    QVERIFY(offer);
-+    QCOMPARE(offer->selectedDragAndDropAction(), KWayland::Client::DataDeviceManager::DnDAction::None);
-+    QSignalSpy offerActionChangedSpy(offer, &KWayland::Client::DataOffer::selectedDragAndDropActionChanged);
-+    QCOMPARE(m_dataDevice->dragOffer()->offeredMimeTypes().count(), 1);
-+    QCOMPARE(m_dataDevice->dragOffer()->offeredMimeTypes().first().name(), QStringLiteral("text/plain"));
-+    QTRY_COMPARE(offer->sourceDragAndDropActions(), KWayland::Client::DataDeviceManager::DnDAction::Copy | KWayland::Client::DataDeviceManager::DnDAction::Move);
-+    offer->accept(QStringLiteral("text/plain"), dragEnteredSpy.last().at(0).toUInt());
-+    offer->setDragAndDropActions(KWayland::Client::DataDeviceManager::DnDAction::Copy | KWayland::Client::DataDeviceManager::DnDAction::Move, KWayland::Client::DataDeviceManager::DnDAction::Move);
-+    QVERIFY(offerActionChangedSpy.wait());
-+    QCOMPARE(offerActionChangedSpy.count(), 1);
-+    QCOMPARE(offer->selectedDragAndDropAction(), KWayland::Client::DataDeviceManager::DnDAction::Move);
-+    QCOMPARE(dataSourceSelectedActionChangedSpy.count(), 1);
-+    QCOMPARE(m_dataSource->selectedDragAndDropAction(), KWayland::Client::DataDeviceManager::DnDAction::Move);
-+
-+    // simulate motion
-+    m_seatInterface->setTimestamp(timestamp++);
-+    m_seatInterface->notifyPointerMotion(QPointF(3, 3));
-+    m_seatInterface->notifyPointerFrame();
-+    QVERIFY(dragMotionSpy.wait());
-+    QCOMPARE(dragMotionSpy.count(), 1);
-+    QCOMPARE(dragMotionSpy.first().first().toPointF(), QPointF(3, 3));
-+    QCOMPARE(dragMotionSpy.first().last().toUInt(), 3u);
-+
-+    // simulate drop
-+    QSignalSpy serverDragEndedSpy(m_seatInterface, &SeatInterface::dragEnded);
-+    QSignalSpy droppedSpy(m_dataDevice, &KWayland::Client::DataDevice::dropped);
-+    m_seatInterface->setTimestamp(timestamp++);
-+    m_seatInterface->notifyPointerButton(1, PointerButtonState::Released);
-+    m_seatInterface->notifyPointerFrame();
-+    QVERIFY(sourceDropSpy.isEmpty());
-+    QVERIFY(droppedSpy.wait());
-+    QCOMPARE(sourceDropSpy.count(), 1);
-+    QCOMPARE(serverDragEndedSpy.count(), 1);
-+
-+    QSignalSpy finishedSpy(m_dataSource, &KWayland::Client::DataSource::dragAndDropFinished);
-+    offer->dragAndDropFinished();
-+    QVERIFY(finishedSpy.wait());
-+    delete offer;
-+
-+    // verify that we did not get any further input events
-+    QVERIFY(pointerMotionSpy.isEmpty());
-+}
-+
- void TestDragAndDrop::testTouchSubsurfacesDragAndDrop()
- {
-     // this test verifies the very basic drag and drop on one surface, an enter, a move and the drop
-diff --git a/src/wayland/datadevice.cpp b/src/wayland/datadevice.cpp
-index c28f4265c15..1becb8290df 100644
---- a/src/wayland/datadevice.cpp
-+++ b/src/wayland/datadevice.cpp
-@@ -84,7 +84,7 @@ void DataDeviceInterfacePrivate::data_device_start_drag(Resource *resource,
-                                                         wl_resource *iconResource,
-                                                         uint32_t serial)
- {
--    SurfaceInterface *focusSurface = SurfaceInterface::get(originResource);
-+    SurfaceInterface *focusSurface = SurfaceInterface::get(originResource)->mainSurface();
-     DataSourceInterface *dataSource = nullptr;
-     if (sourceResource) {
-         dataSource = DataSourceInterface::get(sourceResource);
-diff --git a/src/wayland/seat.cpp b/src/wayland/seat.cpp
-index ff828913528..5520255a8a1 100644
---- a/src/wayland/seat.cpp
-+++ b/src/wayland/seat.cpp
-@@ -1297,7 +1297,6 @@ void SeatInterface::startDrag(AbstractDataSource *dragSource, SurfaceInterface *
-     if (d->drag.mode != SeatInterfacePrivate::Drag::Mode::None) {
-         return;
-     }
--    originSurface = originSurface->mainSurface();
- 
-     if (hasImplicitPointerGrab(dragSerial)) {
-         d->drag.mode = SeatInterfacePrivate::Drag::Mode::Pointer;
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_1c071e40_core-iccprofile-also-estimate-black-point-even-if-there-s-no-luminance-tag.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_1c071e40_core-iccprofile-also-estimate-black-point-even-if-there-s-no-luminance-tag.patch
--- 4:6.3.5-1/debian/patches/upstream_1c071e40_core-iccprofile-also-estimate-black-point-even-if-there-s-no-luminance-tag.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_1c071e40_core-iccprofile-also-estimate-black-point-even-if-there-s-no-luminance-tag.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,127 +0,0 @@
-From 1c071e4006f725b4a2b04ddcfb1891320912e95d Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Mon, 19 May 2025 14:25:56 +0200
-Subject: [PATCH] core/iccprofile: also estimate black point even if there's no
- luminance tag
-
-We can still get a relative value out of it
-
-(cherry picked from commit 0ee6eb5fb3b4389f187d8b9784d5e23b4c883f84)
----
- src/backends/drm/drm_output.cpp |  2 +-
- src/core/iccprofile.cpp         | 20 ++++++++++----------
- src/core/iccprofile.h           |  6 +++---
- 3 files changed, 14 insertions(+), 14 deletions(-)
-
-diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp
-index 151cb2d466f..f2024b223db 100644
---- a/src/backends/drm/drm_output.cpp
-+++ b/src/backends/drm/drm_output.cpp
-@@ -427,8 +427,8 @@ std::pair<ColorDescription, QVector3D> DrmOutput::createColorDescription(const s
-     const double sdrGamutWideness = props->sdrGamutWideness.value_or(m_state.sdrGamutWideness);
-     const auto iccProfile = props->iccProfile.value_or(m_state.iccProfile);
-     if (colorSource == ColorProfileSource::ICC && !effectiveHdr && !effectiveWcg && iccProfile) {
--        const double minBrightness = iccProfile->minBrightness().value_or(0);
-         const double maxBrightness = iccProfile->maxBrightness().value_or(200);
-+        const double minBrightness = iccProfile->relativeBlackPoint().value_or(0) * maxBrightness;
-         const auto sdrColor = Colorimetry::fromName(NamedColorimetry::BT709).interpolateGamutTo(iccProfile->colorimetry(), sdrGamutWideness);
-         const bool allowSdrSoftwareBrightness = props->allowSdrSoftwareBrightness.value_or(m_state.allowSdrSoftwareBrightness);
-         const double brightnessFactor = (!m_brightnessDevice && allowSdrSoftwareBrightness) ? brightness : 1.0;
-diff --git a/src/core/iccprofile.cpp b/src/core/iccprofile.cpp
-index 91ab1f92c64..17be36c93d5 100644
---- a/src/core/iccprofile.cpp
-+++ b/src/core/iccprofile.cpp
-@@ -27,14 +27,14 @@ static const Colorimetry CIEXYZD50 = Colorimetry{
- 
- const ColorDescription IccProfile::s_connectionSpace = ColorDescription(CIEXYZD50, TransferFunction(TransferFunction::linear, 0, 1), 1, 0, 1, 1);
- 
--IccProfile::IccProfile(cmsHPROFILE handle, const Colorimetry &colorimetry, std::optional<ColorPipeline> &&bToA0Tag, std::optional<ColorPipeline> &&bToA1Tag, const std::shared_ptr<ColorTransformation> &inverseEOTF, const std::shared_ptr<ColorTransformation> &vcgt, std::optional<double> minBrightness, std::optional<double> maxBrightness)
-+IccProfile::IccProfile(cmsHPROFILE handle, const Colorimetry &colorimetry, std::optional<ColorPipeline> &&bToA0Tag, std::optional<ColorPipeline> &&bToA1Tag, const std::shared_ptr<ColorTransformation> &inverseEOTF, const std::shared_ptr<ColorTransformation> &vcgt, std::optional<double> relativeBlackPoint, std::optional<double> maxBrightness)
-     : m_handle(handle)
-     , m_colorimetry(colorimetry)
-     , m_bToA0Tag(std::move(bToA0Tag))
-     , m_bToA1Tag(std::move(bToA1Tag))
-     , m_inverseEOTF(inverseEOTF)
-     , m_vcgt(vcgt)
--    , m_minBrightness(minBrightness)
-+    , m_relativeBlackPoint(relativeBlackPoint)
-     , m_maxBrightness(maxBrightness)
- {
- }
-@@ -44,9 +44,9 @@ IccProfile::~IccProfile()
-     cmsCloseProfile(m_handle);
- }
- 
--std::optional<double> IccProfile::minBrightness() const
-+std::optional<double> IccProfile::relativeBlackPoint() const
- {
--    return m_minBrightness;
-+    return m_relativeBlackPoint;
- }
- 
- std::optional<double> IccProfile::maxBrightness() const
-@@ -341,16 +341,16 @@ IccProfile::Expected IccProfile::load(const QString &path)
-         return Expected(i18n("ICC profile \"%1\" is broken, its primaries are invalid", path));
-     }
- 
--    std::optional<double> minBrightness;
-     std::optional<double> maxBrightness;
-     if (cmsCIEXYZ *luminance = static_cast<cmsCIEXYZ *>(cmsReadTag(handle, cmsSigLuminanceTag))) {
-         // for some reason, lcms exposes the luminance as a XYZ triple...
-         // only Y is non-zero, and it's the brightness in nits
-         maxBrightness = luminance->Y;
--        cmsCIEXYZ blackPoint;
--        if (cmsDetectDestinationBlackPoint(&blackPoint, handle, INTENT_RELATIVE_COLORIMETRIC, 0)) {
--            minBrightness = blackPoint.Y * luminance->Y;
--        }
-+    }
-+    std::optional<double> relativeBlackPoint;
-+    cmsCIEXYZ blackPoint;
-+    if (cmsDetectDestinationBlackPoint(&blackPoint, handle, INTENT_RELATIVE_COLORIMETRIC, 0)) {
-+        relativeBlackPoint = blackPoint.Y;
-     }
- 
-     if (cmsIsTag(handle, cmsSigBToD1Tag) && !cmsIsTag(handle, cmsSigBToA1Tag) && !cmsIsTag(handle, cmsSigBToA0Tag)) {
-@@ -404,7 +404,7 @@ IccProfile::Expected IccProfile::load(const QString &path)
-     std::vector<std::unique_ptr<ColorPipelineStage>> stages;
-     stages.push_back(std::make_unique<ColorPipelineStage>(cmsStageAllocToneCurves(nullptr, toneCurves.size(), toneCurves.data())));
-     const auto inverseEOTF = std::make_shared<ColorTransformation>(std::move(stages));
--    return std::make_unique<IccProfile>(handle, Colorimetry(red, green, blue, white), std::move(bToA0), std::move(bToA1), inverseEOTF, vcgt, minBrightness, maxBrightness);
-+    return std::make_unique<IccProfile>(handle, Colorimetry(red, green, blue, white), std::move(bToA0), std::move(bToA1), inverseEOTF, vcgt, relativeBlackPoint, maxBrightness);
- }
- 
- }
-diff --git a/src/core/iccprofile.h b/src/core/iccprofile.h
-index be4e2e4a74c..bc4057acfd9 100644
---- a/src/core/iccprofile.h
-+++ b/src/core/iccprofile.h
-@@ -25,7 +25,7 @@ class ColorLUT3D;
- class KWIN_EXPORT IccProfile
- {
- public:
--    explicit IccProfile(cmsHPROFILE handle, const Colorimetry &colorimetry, std::optional<ColorPipeline> &&bToA0Tag, std::optional<ColorPipeline> &&bToA1Tag, const std::shared_ptr<ColorTransformation> &inverseEOTF, const std::shared_ptr<ColorTransformation> &vcgt, std::optional<double> minBrightness, std::optional<double> maxBrightness);
-+    explicit IccProfile(cmsHPROFILE handle, const Colorimetry &colorimetry, std::optional<ColorPipeline> &&bToA0Tag, std::optional<ColorPipeline> &&bToA1Tag, const std::shared_ptr<ColorTransformation> &inverseEOTF, const std::shared_ptr<ColorTransformation> &vcgt, std::optional<double> relativeBlackPoint, std::optional<double> maxBrightness);
-     ~IccProfile();
- 
-     /**
-@@ -44,7 +44,7 @@ public:
-      */
-     std::shared_ptr<ColorTransformation> vcgt() const;
-     const Colorimetry &colorimetry() const;
--    std::optional<double> minBrightness() const;
-+    std::optional<double> relativeBlackPoint() const;
-     std::optional<double> maxBrightness() const;
- 
-     // TODO Plasma 6.4 port this back to std::expected
-@@ -72,7 +72,7 @@ private:
-     const std::optional<ColorPipeline> m_bToA1Tag;
-     const std::shared_ptr<ColorTransformation> m_inverseEOTF;
-     const std::shared_ptr<ColorTransformation> m_vcgt;
--    const std::optional<double> m_minBrightness;
-+    const std::optional<double> m_relativeBlackPoint;
-     const std::optional<double> m_maxBrightness;
- };
- 
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_27d28c9c_backends-drm-reduce-severity-of-pageflip-failure-logging.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_27d28c9c_backends-drm-reduce-severity-of-pageflip-failure-logging.patch
--- 4:6.3.5-1/debian/patches/upstream_27d28c9c_backends-drm-reduce-severity-of-pageflip-failure-logging.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_27d28c9c_backends-drm-reduce-severity-of-pageflip-failure-logging.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-From 27d28c9cf3070de9b3102bf4d7dd93cf9d9ebf38 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Mon, 2 Jun 2025 14:46:25 +0200
-Subject: [PATCH] backends/drm: reduce severity of pageflip failure logging
-
-It can happen with attempted direct scanout
-
-BUG: 505028
-
-
-(cherry picked from commit f061994d57e2b0cd2d2dd8ddccdd8a349624d4c4)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@kde.org>
----
- src/backends/drm/drm_pipeline_legacy.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/backends/drm/drm_pipeline_legacy.cpp b/src/backends/drm/drm_pipeline_legacy.cpp
-index b8099fb59e4..1f796dfa33e 100644
---- a/src/backends/drm/drm_pipeline_legacy.cpp
-+++ b/src/backends/drm/drm_pipeline_legacy.cpp
-@@ -35,7 +35,7 @@ DrmPipeline::Error DrmPipeline::presentLegacy(const std::shared_ptr<OutputFrame>
-     }
-     auto commit = std::make_unique<DrmLegacyCommit>(this, buffer, frame);
-     if (!commit->doPageflip(m_pending.presentationMode)) {
--        qCWarning(KWIN_DRM) << "Page flip failed:" << strerror(errno);
-+        qCDebug(KWIN_DRM) << "Page flip failed:" << strerror(errno);
-         return errnoToError();
-     }
-     m_commitThread->setPendingCommit(std::move(commit));
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_2d70fe62_plugins-colorpicker-use-BPC-when-converting-to-sRGB.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_2d70fe62_plugins-colorpicker-use-BPC-when-converting-to-sRGB.patch
--- 4:6.3.5-1/debian/patches/upstream_2d70fe62_plugins-colorpicker-use-BPC-when-converting-to-sRGB.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_2d70fe62_plugins-colorpicker-use-BPC-when-converting-to-sRGB.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-From 2d70fe6248591bda75e7fba2d07cd80e3eec3d72 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@kde.org>
-Date: Thu, 22 May 2025 01:03:38 +0200
-Subject: [PATCH] plugins/colorpicker: use BPC when converting to sRGB
-
-It's how most applications present to the screen; without BPC the roundtrip of
-picking an sRGB color off the screen may not work out
-
-CCBUG: 491633
----
- src/plugins/colorpicker/colorpicker.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/plugins/colorpicker/colorpicker.cpp b/src/plugins/colorpicker/colorpicker.cpp
-index dd9204f0af1..77ebd1d29bb 100644
---- a/src/plugins/colorpicker/colorpicker.cpp
-+++ b/src/plugins/colorpicker/colorpicker.cpp
-@@ -69,7 +69,7 @@ void ColorPickerEffect::paintScreen(const RenderTarget &renderTarget, const Rend
-         OpenGlContext *context = effects->openglContext();
- 
-         context->glReadnPixels(texturePosition.x(), renderTarget.size().height() - texturePosition.y() - PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE, GL_RGBA, GL_FLOAT, sizeof(float) * data.size(), data.data());
--        QVector3D sRGB = 255 * renderTarget.colorDescription().mapTo(QVector3D(data[0], data[1], data[2]), ColorDescription::sRGB, RenderingIntent::RelativeColorimetric);
-+        QVector3D sRGB = 255 * renderTarget.colorDescription().mapTo(QVector3D(data[0], data[1], data[2]), ColorDescription::sRGB, RenderingIntent::RelativeColorimetricWithBPC);
-         QDBusConnection::sessionBus().send(m_replyMessage.createReply(QColor(sRGB.x(), sRGB.y(), sRGB.z())));
-         setPicking(false);
-         m_scheduledPosition = QPoint(-1, -1);
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_3c724b83_wayland-colormanagement-also-around-max-fall-and-max-cll.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_3c724b83_wayland-colormanagement-also-around-max-fall-and-max-cll.patch
--- 4:6.3.5-1/debian/patches/upstream_3c724b83_wayland-colormanagement-also-around-max-fall-and-max-cll.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_3c724b83_wayland-colormanagement-also-around-max-fall-and-max-cll.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-From 3c724b83719dfb1ea6a09a1ab2b0af832a27e04d Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Tue, 20 May 2025 01:13:46 +0200
-Subject: [PATCH] wayland/colormanagement: also around max_fall and max_cll
-
-To be consistent with the other luminance properties
-
-(cherry picked from commit f8e4168a084a350114968e1eb17902c16092f441)
----
- src/wayland/colormanagement_v1.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/wayland/colormanagement_v1.cpp b/src/wayland/colormanagement_v1.cpp
-index 979517f70f6..4a721bbc6cd 100644
---- a/src/wayland/colormanagement_v1.cpp
-+++ b/src/wayland/colormanagement_v1.cpp
-@@ -528,10 +528,10 @@ void ImageDescriptionV1::wp_image_description_v1_get_information(Resource *qtRes
-                                                            round(masterWhite.x), round(masterWhite.y));
-     }
-     if (auto maxfall = m_description->maxAverageLuminance()) {
--        wp_image_description_info_v1_send_target_max_fall(resource, *maxfall);
-+        wp_image_description_info_v1_send_target_max_fall(resource, std::round(*maxfall));
-     }
-     if (auto maxcll = m_description->maxHdrLuminance()) {
--        wp_image_description_info_v1_send_target_max_cll(resource, *maxcll);
-+        wp_image_description_info_v1_send_target_max_cll(resource, std::round(*maxcll));
-     }
-     wp_image_description_info_v1_send_luminances(resource, std::round(m_description->transferFunction().minLuminance / s_minLuminanceUnit), std::round(m_description->transferFunction().maxLuminance), std::round(m_description->referenceLuminance()));
-     wp_image_description_info_v1_send_target_luminance(resource, std::round(m_description->minLuminance() / s_minLuminanceUnit), std::round(m_description->maxHdrLuminance().value_or(800)));
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_3f0a8a88_plugins-dimscreen-Enable-by-default.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_3f0a8a88_plugins-dimscreen-Enable-by-default.patch
--- 4:6.3.5-1/debian/patches/upstream_3f0a8a88_plugins-dimscreen-Enable-by-default.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_3f0a8a88_plugins-dimscreen-Enable-by-default.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,27 +0,0 @@
-From 3f0a8a886239cf57c5a8d122c334739d150560b5 Mon Sep 17 00:00:00 2001
-From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
-Date: Thu, 20 Mar 2025 12:18:14 +0200
-Subject: [PATCH] plugins/dimscreen: Enable by default
-
-It helps to attract user's attention to the system prompt. It seems like
-a good default.
----
- src/plugins/dimscreen/package/metadata.json | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/plugins/dimscreen/package/metadata.json b/src/plugins/dimscreen/package/metadata.json
-index 3efb222ceda..cba7dd4dcd0 100644
---- a/src/plugins/dimscreen/package/metadata.json
-+++ b/src/plugins/dimscreen/package/metadata.json
-@@ -99,7 +99,7 @@
-         "Description[x-test]": "xxDarkens the entire screen when requesting root privilegesxx",
-         "Description[zh_CN]": "系统请求 root 权限时降低屏幕亮度",
-         "Description[zh_TW]": "請求 root 權限時將整個螢幕變暗",
--        "EnabledByDefault": false,
-+        "EnabledByDefault": true,
-         "Icon": "preferences-system-windows-effect-dimscreen",
-         "Id": "dimscreen",
-         "License": "GPL",
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_473aebf0_x11-Add-an-environment-variable-to-disable-NET-WM-SYNC-REQUEST-in-X11Window.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_473aebf0_x11-Add-an-environment-variable-to-disable-NET-WM-SYNC-REQUEST-in-X11Window.patch
--- 4:6.3.5-1/debian/patches/upstream_473aebf0_x11-Add-an-environment-variable-to-disable-NET-WM-SYNC-REQUEST-in-X11Window.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_473aebf0_x11-Add-an-environment-variable-to-disable-NET-WM-SYNC-REQUEST-in-X11Window.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
-From 473aebf0f752c5fccb1c270841c14c1bb345e9d9 Mon Sep 17 00:00:00 2001
-From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
-Date: Wed, 21 May 2025 20:36:31 +0000
-Subject: [PATCH] x11: Add an environment variable to disable
- _NET_WM_SYNC_REQUEST in X11Window
-
-This can be useful for debugging purposes.
-
-
-(cherry picked from commit 9b48a9ec8a1be84403f322f7f07d5ef89324ec2e)
-
-Co-authored-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
----
- src/x11window.cpp | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/x11window.cpp b/src/x11window.cpp
-index 218bc76af9a..b0e0b3e52a6 100644
---- a/src/x11window.cpp
-+++ b/src/x11window.cpp
-@@ -2529,6 +2529,11 @@ void X11Window::getSyncCounter()
-         return;
-     }
- 
-+    static bool noXsync = qEnvironmentVariableIntValue("KWIN_X11_NO_SYNC_REQUEST") == 1;
-+    if (noXsync) {
-+        return;
-+    }
-+
-     Xcb::Property syncProp(false, window(), atoms->net_wm_sync_request_counter, XCB_ATOM_CARDINAL, 0, 1);
-     const xcb_sync_counter_t counter = syncProp.value<xcb_sync_counter_t>(XCB_NONE);
-     if (counter != XCB_NONE) {
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_56760937_backends-drm-clear-the-test-buffer-with-legacy-modesetting.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_56760937_backends-drm-clear-the-test-buffer-with-legacy-modesetting.patch
--- 4:6.3.5-1/debian/patches/upstream_56760937_backends-drm-clear-the-test-buffer-with-legacy-modesetting.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_56760937_backends-drm-clear-the-test-buffer-with-legacy-modesetting.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-From 56760937743b42f50f46e2ff2a1fa811502132d7 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Fri, 23 May 2025 14:30:44 +0200
-Subject: [PATCH] backends/drm: clear the test buffer with legacy modesetting
-
-With atomic modesetting, we only show the buffer once the compositor has rendered to
-it. With legacy modesetting however, the "test" the drm backend does immediately shows
-the buffer, so not clearing it may mean we show a frame of random VRAM contents.
-
-BUG: 504258
-
-
-(cherry picked from commit ef88b6425278564096d9394537ca9442d750c0cf)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@kde.org>
----
- src/backends/drm/drm_egl_layer_surface.cpp | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/src/backends/drm/drm_egl_layer_surface.cpp b/src/backends/drm/drm_egl_layer_surface.cpp
-index 129024da9d7..eb4f9189cf5 100644
---- a/src/backends/drm/drm_egl_layer_surface.cpp
-+++ b/src/backends/drm/drm_egl_layer_surface.cpp
-@@ -594,6 +594,12 @@ std::shared_ptr<DrmFramebuffer> EglGbmLayerSurface::doRenderTestBuffer(Surface *
-     if (!slot) {
-         return nullptr;
-     }
-+    if (!m_gpu->atomicModeSetting()) {
-+        EglContext::currentContext()->pushFramebuffer(slot->framebuffer());
-+        glClearColor(0, 0, 0, 0);
-+        glClear(GL_COLOR_BUFFER_BIT);
-+        EglContext::currentContext()->popFramebuffer();
-+    }
-     if (const auto ret = importBuffer(surface, slot.get(), FileDescriptor{}, nullptr, infiniteRegion())) {
-         surface->currentSlot = slot;
-         surface->currentFramebuffer = ret;
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_5c7d2de5_xwayland-Fix-leaking-normal-key-presses-with-keyboard-layouts-other-than-English.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_5c7d2de5_xwayland-Fix-leaking-normal-key-presses-with-keyboard-layouts-other-than-English.patch
--- 4:6.3.5-1/debian/patches/upstream_5c7d2de5_xwayland-Fix-leaking-normal-key-presses-with-keyboard-layouts-other-than-English.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_5c7d2de5_xwayland-Fix-leaking-normal-key-presses-with-keyboard-layouts-other-than-English.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,365 +0,0 @@
-From 5c7d2de59d6afda320feab9c08a2dd3c4cbc728a Mon Sep 17 00:00:00 2001
-From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
-Date: Wed, 28 May 2025 08:36:38 +0000
-Subject: [PATCH] xwayland: Fix leaking normal key presses with keyboard
- layouts other than English
-
-When using a keyboard layout that's not English, QXkbCommon will report
-a unicode character code for the key code.
-
-In order to address that, this change makes the input sniffing code
-filter out any key with code less than 0x01000000.
-
-Key codes are split in two parts: 0-0x01000000: regular keys (there is
-strong correlation with Unicode codes); and 0x01000000-...: other
-custom keys, e.g. F1, Escape, Enter, etc.
-
-BUG: 500032
-
-
-(cherry picked from commit 68e2fc1a32beab64c072d14a14efc60f36d8a04a)
-
-Co-authored-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
----
- src/xwayland/xwayland.cpp | 313 +++++++++++---------------------------
- 1 file changed, 93 insertions(+), 220 deletions(-)
-
-diff --git a/src/xwayland/xwayland.cpp b/src/xwayland/xwayland.cpp
-index 755f39ea82d..8aeddf6f9c7 100644
---- a/src/xwayland/xwayland.cpp
-+++ b/src/xwayland/xwayland.cpp
-@@ -118,224 +118,97 @@ public:
-             Qt::MetaModifier,
-         };
- 
--        static const QSet<quint32> characterKeys = {
--            Qt::Key_Any,
--            Qt::Key_Space,
--            Qt::Key_Exclam,
--            Qt::Key_QuoteDbl,
--            Qt::Key_NumberSign,
--            Qt::Key_Dollar,
--            Qt::Key_Percent,
--            Qt::Key_Ampersand,
--            Qt::Key_Apostrophe,
--            Qt::Key_ParenLeft,
--            Qt::Key_ParenRight,
--            Qt::Key_Asterisk,
--            Qt::Key_Plus,
--            Qt::Key_Comma,
--            Qt::Key_Minus,
--            Qt::Key_Period,
--            Qt::Key_Slash,
--            Qt::Key_0,
--            Qt::Key_1,
--            Qt::Key_2,
--            Qt::Key_3,
--            Qt::Key_4,
--            Qt::Key_5,
--            Qt::Key_6,
--            Qt::Key_7,
--            Qt::Key_8,
--            Qt::Key_9,
--            Qt::Key_Colon,
--            Qt::Key_Semicolon,
--            Qt::Key_Less,
--            Qt::Key_Equal,
--            Qt::Key_Greater,
--            Qt::Key_Question,
--            Qt::Key_At,
--            Qt::Key_A,
--            Qt::Key_B,
--            Qt::Key_C,
--            Qt::Key_D,
--            Qt::Key_E,
--            Qt::Key_F,
--            Qt::Key_G,
--            Qt::Key_H,
--            Qt::Key_I,
--            Qt::Key_J,
--            Qt::Key_K,
--            Qt::Key_L,
--            Qt::Key_M,
--            Qt::Key_N,
--            Qt::Key_O,
--            Qt::Key_P,
--            Qt::Key_Q,
--            Qt::Key_R,
--            Qt::Key_S,
--            Qt::Key_T,
--            Qt::Key_U,
--            Qt::Key_V,
--            Qt::Key_W,
--            Qt::Key_X,
--            Qt::Key_Y,
--            Qt::Key_Z,
--            Qt::Key_BracketLeft,
--            Qt::Key_Backslash,
--            Qt::Key_BracketRight,
--            Qt::Key_AsciiCircum,
--            Qt::Key_Underscore,
--            Qt::Key_QuoteLeft,
--            Qt::Key_BraceLeft,
--            Qt::Key_Bar,
--            Qt::Key_BraceRight,
--            Qt::Key_AsciiTilde,
--            Qt::Key_nobreakspace,
--            Qt::Key_exclamdown,
--            Qt::Key_cent,
--            Qt::Key_sterling,
--            Qt::Key_currency,
--            Qt::Key_yen,
--            Qt::Key_brokenbar,
--            Qt::Key_section,
--            Qt::Key_diaeresis,
--            Qt::Key_copyright,
--            Qt::Key_ordfeminine,
--            Qt::Key_guillemotleft,
--            Qt::Key_notsign,
--            Qt::Key_hyphen,
--            Qt::Key_registered,
--            Qt::Key_macron,
--            Qt::Key_degree,
--            Qt::Key_plusminus,
--            Qt::Key_twosuperior,
--            Qt::Key_threesuperior,
--            Qt::Key_acute,
--            Qt::Key_micro,
--            Qt::Key_paragraph,
--            Qt::Key_periodcentered,
--            Qt::Key_cedilla,
--            Qt::Key_onesuperior,
--            Qt::Key_masculine,
--            Qt::Key_guillemotright,
--            Qt::Key_onequarter,
--            Qt::Key_onehalf,
--            Qt::Key_threequarters,
--            Qt::Key_questiondown,
--            Qt::Key_Agrave,
--            Qt::Key_Aacute,
--            Qt::Key_Acircumflex,
--            Qt::Key_Atilde,
--            Qt::Key_Adiaeresis,
--            Qt::Key_Aring,
--            Qt::Key_AE,
--            Qt::Key_Ccedilla,
--            Qt::Key_Egrave,
--            Qt::Key_Eacute,
--            Qt::Key_Ecircumflex,
--            Qt::Key_Ediaeresis,
--            Qt::Key_Igrave,
--            Qt::Key_Iacute,
--            Qt::Key_Icircumflex,
--            Qt::Key_Idiaeresis,
--            Qt::Key_ETH,
--            Qt::Key_Ntilde,
--            Qt::Key_Ograve,
--            Qt::Key_Oacute,
--            Qt::Key_Ocircumflex,
--            Qt::Key_Otilde,
--            Qt::Key_Odiaeresis,
--            Qt::Key_multiply,
--            Qt::Key_Ooblique,
--            Qt::Key_Ugrave,
--            Qt::Key_Uacute,
--            Qt::Key_Ucircumflex,
--            Qt::Key_Udiaeresis,
--            Qt::Key_Yacute,
--            Qt::Key_THORN,
--            Qt::Key_ssharp,
--            Qt::Key_division,
--            Qt::Key_ydiaeresis,
--            Qt::Key_Multi_key,
--            Qt::Key_Codeinput,
--            Qt::Key_SingleCandidate,
--            Qt::Key_MultipleCandidate,
--            Qt::Key_PreviousCandidate,
--            Qt::Key_Mode_switch,
--            Qt::Key_Kanji,
--            Qt::Key_Muhenkan,
--            Qt::Key_Henkan,
--            Qt::Key_Romaji,
--            Qt::Key_Hiragana,
--            Qt::Key_Katakana,
--            Qt::Key_Hiragana_Katakana,
--            Qt::Key_Zenkaku,
--            Qt::Key_Hankaku,
--            Qt::Key_Zenkaku_Hankaku,
--            Qt::Key_Touroku,
--            Qt::Key_Massyo,
--            Qt::Key_Kana_Lock,
--            Qt::Key_Kana_Shift,
--            Qt::Key_Eisu_Shift,
--            Qt::Key_Eisu_toggle,
--            Qt::Key_Hangul,
--            Qt::Key_Hangul_Start,
--            Qt::Key_Hangul_End,
--            Qt::Key_Hangul_Hanja,
--            Qt::Key_Hangul_Jamo,
--            Qt::Key_Hangul_Romaja,
--            Qt::Key_Hangul_Jeonja,
--            Qt::Key_Hangul_Banja,
--            Qt::Key_Hangul_PreHanja,
--            Qt::Key_Hangul_PostHanja,
--            Qt::Key_Hangul_Special,
--            Qt::Key_Dead_Grave,
--            Qt::Key_Dead_Acute,
--            Qt::Key_Dead_Circumflex,
--            Qt::Key_Dead_Tilde,
--            Qt::Key_Dead_Macron,
--            Qt::Key_Dead_Breve,
--            Qt::Key_Dead_Abovedot,
--            Qt::Key_Dead_Diaeresis,
--            Qt::Key_Dead_Abovering,
--            Qt::Key_Dead_Doubleacute,
--            Qt::Key_Dead_Caron,
--            Qt::Key_Dead_Cedilla,
--            Qt::Key_Dead_Ogonek,
--            Qt::Key_Dead_Iota,
--            Qt::Key_Dead_Voiced_Sound,
--            Qt::Key_Dead_Semivoiced_Sound,
--            Qt::Key_Dead_Belowdot,
--            Qt::Key_Dead_Hook,
--            Qt::Key_Dead_Horn,
--            Qt::Key_Dead_Stroke,
--            Qt::Key_Dead_Abovecomma,
--            Qt::Key_Dead_Abovereversedcomma,
--            Qt::Key_Dead_Doublegrave,
--            Qt::Key_Dead_Belowring,
--            Qt::Key_Dead_Belowmacron,
--            Qt::Key_Dead_Belowcircumflex,
--            Qt::Key_Dead_Belowtilde,
--            Qt::Key_Dead_Belowbreve,
--            Qt::Key_Dead_Belowdiaeresis,
--            Qt::Key_Dead_Invertedbreve,
--            Qt::Key_Dead_Belowcomma,
--            Qt::Key_Dead_Currency,
--            Qt::Key_Dead_a,
--            Qt::Key_Dead_A,
--            Qt::Key_Dead_e,
--            Qt::Key_Dead_E,
--            Qt::Key_Dead_i,
--            Qt::Key_Dead_I,
--            Qt::Key_Dead_o,
--            Qt::Key_Dead_O,
--            Qt::Key_Dead_u,
--            Qt::Key_Dead_U,
--            Qt::Key_Dead_Small_Schwa,
--            Qt::Key_Dead_Capital_Schwa,
--            Qt::Key_Dead_Greek,
--            Qt::Key_Dead_Lowline,
--            Qt::Key_Dead_Aboveverticalline,
--            Qt::Key_Dead_Belowverticalline,
-+        static const auto isSpecialKey = [](quint32 key) {
-+            // All keys prior to 0x01000000 (Qt::Key_Escape) are considered as character keys.
-+            if (key < 0x01000000) {
-+                return false;
-+            }
-+
-+            static const QSet<quint32> excludedKeys = {
-+                Qt::Key_Multi_key,
-+                Qt::Key_Codeinput,
-+                Qt::Key_SingleCandidate,
-+                Qt::Key_MultipleCandidate,
-+                Qt::Key_PreviousCandidate,
-+                Qt::Key_Mode_switch,
-+                Qt::Key_Kanji,
-+                Qt::Key_Muhenkan,
-+                Qt::Key_Henkan,
-+                Qt::Key_Romaji,
-+                Qt::Key_Hiragana,
-+                Qt::Key_Katakana,
-+                Qt::Key_Hiragana_Katakana,
-+                Qt::Key_Zenkaku,
-+                Qt::Key_Hankaku,
-+                Qt::Key_Zenkaku_Hankaku,
-+                Qt::Key_Touroku,
-+                Qt::Key_Massyo,
-+                Qt::Key_Kana_Lock,
-+                Qt::Key_Kana_Shift,
-+                Qt::Key_Eisu_Shift,
-+                Qt::Key_Eisu_toggle,
-+                Qt::Key_Hangul,
-+                Qt::Key_Hangul_Start,
-+                Qt::Key_Hangul_End,
-+                Qt::Key_Hangul_Hanja,
-+                Qt::Key_Hangul_Jamo,
-+                Qt::Key_Hangul_Romaja,
-+                Qt::Key_Hangul_Jeonja,
-+                Qt::Key_Hangul_Banja,
-+                Qt::Key_Hangul_PreHanja,
-+                Qt::Key_Hangul_PostHanja,
-+                Qt::Key_Hangul_Special,
-+                Qt::Key_Dead_Grave,
-+                Qt::Key_Dead_Acute,
-+                Qt::Key_Dead_Circumflex,
-+                Qt::Key_Dead_Tilde,
-+                Qt::Key_Dead_Macron,
-+                Qt::Key_Dead_Breve,
-+                Qt::Key_Dead_Abovedot,
-+                Qt::Key_Dead_Diaeresis,
-+                Qt::Key_Dead_Abovering,
-+                Qt::Key_Dead_Doubleacute,
-+                Qt::Key_Dead_Caron,
-+                Qt::Key_Dead_Cedilla,
-+                Qt::Key_Dead_Ogonek,
-+                Qt::Key_Dead_Iota,
-+                Qt::Key_Dead_Voiced_Sound,
-+                Qt::Key_Dead_Semivoiced_Sound,
-+                Qt::Key_Dead_Belowdot,
-+                Qt::Key_Dead_Hook,
-+                Qt::Key_Dead_Horn,
-+                Qt::Key_Dead_Stroke,
-+                Qt::Key_Dead_Abovecomma,
-+                Qt::Key_Dead_Abovereversedcomma,
-+                Qt::Key_Dead_Doublegrave,
-+                Qt::Key_Dead_Belowring,
-+                Qt::Key_Dead_Belowmacron,
-+                Qt::Key_Dead_Belowcircumflex,
-+                Qt::Key_Dead_Belowtilde,
-+                Qt::Key_Dead_Belowbreve,
-+                Qt::Key_Dead_Belowdiaeresis,
-+                Qt::Key_Dead_Invertedbreve,
-+                Qt::Key_Dead_Belowcomma,
-+                Qt::Key_Dead_Currency,
-+                Qt::Key_Dead_a,
-+                Qt::Key_Dead_A,
-+                Qt::Key_Dead_e,
-+                Qt::Key_Dead_E,
-+                Qt::Key_Dead_i,
-+                Qt::Key_Dead_I,
-+                Qt::Key_Dead_o,
-+                Qt::Key_Dead_O,
-+                Qt::Key_Dead_u,
-+                Qt::Key_Dead_U,
-+                Qt::Key_Dead_Small_Schwa,
-+                Qt::Key_Dead_Capital_Schwa,
-+                Qt::Key_Dead_Greek,
-+                Qt::Key_Dead_Lowline,
-+                Qt::Key_Dead_Aboveverticalline,
-+                Qt::Key_Dead_Belowverticalline,
-+            };
-+
-+            return !excludedKeys.contains(key);
-         };
- 
-         switch (mode) {
-@@ -345,13 +218,13 @@ public:
-             break;
-         case NonCharacterKeys:
-             m_filterKey = [](int key, Qt::KeyboardModifiers) {
--                return !characterKeys.contains(key);
-+                return isSpecialKey(key);
-             };
-             m_filterMouse = eavesdropsMouse;
-             break;
-         case AllKeysWithModifier:
-             m_filterKey = [](int key, Qt::KeyboardModifiers m) {
--                return m.testAnyFlags(modifierKeys) || !characterKeys.contains(key);
-+                return m.testAnyFlags(modifierKeys) || isSpecialKey(key);
-             };
-             m_filterMouse = eavesdropsMouse;
-             break;
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_5cc72fe9_wayland-colormanagement-compare-primaries-with-the-protocol-s-resolution.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_5cc72fe9_wayland-colormanagement-compare-primaries-with-the-protocol-s-resolution.patch
--- 4:6.3.5-1/debian/patches/upstream_5cc72fe9_wayland-colormanagement-compare-primaries-with-the-protocol-s-resolution.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_5cc72fe9_wayland-colormanagement-compare-primaries-with-the-protocol-s-resolution.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,97 +0,0 @@
-From 5cc72fe966a9bc359300e22a9495d6a4ff4249c8 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@kde.org>
-Date: Wed, 21 May 2025 14:40:04 +0200
-Subject: [PATCH] wayland/colormanagement: compare primaries with the
- protocol's resolution
-
-Otherwise, small floating point differences that can't even be conveyed with the
-protocol prevent us from sending the primaries_named event.
-
-(cherry picked from commit 45f0fe0529f808e93dcb93092635e550f458484a)
----
- src/wayland/colormanagement_v1.cpp | 50 +++++++++++++++++++++---------
- 1 file changed, 35 insertions(+), 15 deletions(-)
-
-diff --git a/src/wayland/colormanagement_v1.cpp b/src/wayland/colormanagement_v1.cpp
-index 4a721bbc6cd..5514248b9f4 100644
---- a/src/wayland/colormanagement_v1.cpp
-+++ b/src/wayland/colormanagement_v1.cpp
-@@ -467,31 +467,51 @@ static uint32_t kwinTFtoProtoTF(TransferFunction tf)
-     Q_UNREACHABLE();
- }
- 
--static uint32_t kwinPrimariesToProtoPrimaires(NamedColorimetry primaries)
-+static bool compareXY(double left, double right)
- {
--    switch (primaries) {
--    case NamedColorimetry::BT709:
-+    return std::round(left / s_primaryUnit) == std::round(right / s_primaryUnit);
-+}
-+
-+static bool compareXY(xy left, xy right)
-+{
-+    return compareXY(left.x, right.x) && compareXY(left.y, right.y);
-+}
-+
-+static bool comparePrimaries(const Colorimetry &left, const Colorimetry &right)
-+{
-+    // this can't just use Colorimetry::operator==
-+    // as that has a different resolution from the Wayland protocol
-+    return compareXY(left.red().toxy(), right.red().toxy())
-+        && compareXY(left.green().toxy(), right.green().toxy())
-+        && compareXY(left.blue().toxy(), right.blue().toxy())
-+        && compareXY(left.white().toxy(), right.white().toxy());
-+}
-+
-+static std::optional<uint32_t> kwinPrimariesToProtoPrimaires(const Colorimetry &primaries)
-+{
-+    if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::BT709))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_srgb;
--    case NamedColorimetry::PAL_M:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::PAL_M))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_pal_m;
--    case NamedColorimetry::PAL:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::PAL))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_pal;
--    case NamedColorimetry::NTSC:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::NTSC))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_ntsc;
--    case NamedColorimetry::GenericFilm:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::GenericFilm))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_generic_film;
--    case NamedColorimetry::BT2020:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::BT2020))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_bt2020;
--    case NamedColorimetry::CIEXYZ:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::CIEXYZ))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_cie1931_xyz;
--    case NamedColorimetry::DCIP3:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::DCIP3))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_dci_p3;
--    case NamedColorimetry::DisplayP3:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::DisplayP3))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_display_p3;
--    case NamedColorimetry::AdobeRGB:
-+    } else if (comparePrimaries(primaries, Colorimetry::fromName(NamedColorimetry::AdobeRGB))) {
-         return QtWaylandServer::wp_color_manager_v1::primaries::primaries_adobe_rgb;
-+    } else {
-+        return std::nullopt;
-     }
--    Q_UNREACHABLE();
- }
- 
- void ImageDescriptionV1::wp_image_description_v1_get_information(Resource *qtResource, uint32_t information)
-@@ -513,8 +533,8 @@ void ImageDescriptionV1::wp_image_description_v1_get_information(Resource *qtRes
-                                                 round(containerGreen.x), round(containerGreen.y),
-                                                 round(containerBlue.x), round(containerBlue.y),
-                                                 round(containerWhite.x), round(containerWhite.y));
--    if (auto name = m_description->containerColorimetry().name()) {
--        wp_image_description_info_v1_send_primaries_named(resource, kwinPrimariesToProtoPrimaires(*name));
-+    if (auto name = kwinPrimariesToProtoPrimaires(m_description->containerColorimetry())) {
-+        wp_image_description_info_v1_send_primaries_named(resource, *name);
-     }
-     if (auto m = m_description->masteringColorimetry()) {
-         const xyY masterRed = m->red().toxyY();
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_602072c9_backends-drm-remove-unused-method.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_602072c9_backends-drm-remove-unused-method.patch
--- 4:6.3.5-1/debian/patches/upstream_602072c9_backends-drm-remove-unused-method.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_602072c9_backends-drm-remove-unused-method.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,60 +0,0 @@
-From 602072c9ccc50e0d2b9534dda9d306e20c85bf99 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Thu, 3 Apr 2025 18:20:08 +0200
-Subject: [PATCH] backends/drm: remove unused method
-
----
- src/backends/drm/drm_commit_thread.cpp | 17 -----------------
- src/backends/drm/drm_commit_thread.h   |  8 --------
- 2 files changed, 25 deletions(-)
-
-diff --git a/src/backends/drm/drm_commit_thread.cpp b/src/backends/drm/drm_commit_thread.cpp
-index d3dd4f2a60b..94c786acc78 100644
---- a/src/backends/drm/drm_commit_thread.cpp
-+++ b/src/backends/drm/drm_commit_thread.cpp
-@@ -383,23 +383,6 @@ std::chrono::nanoseconds DrmCommitThread::safetyMargin() const
-     return m_safetyMargin;
- }
- 
--bool DrmCommitThread::drain()
--{
--    std::unique_lock lock(m_mutex);
--    if (m_committed) {
--        return true;
--    }
--    if (m_commits.empty()) {
--        return false;
--    }
--    if (m_commits.size() > 1) {
--        m_commits.front() = mergeCommits(m_commits);
--        m_commits.erase(m_commits.begin() + 1, m_commits.end());
--    }
--    submit();
--    return m_committed != nullptr;
--}
--
- void DrmCommitThread::handlePing()
- {
-     // this will process the pageflip and call pageFlipped if there is one
-diff --git a/src/backends/drm/drm_commit_thread.h b/src/backends/drm/drm_commit_thread.h
-index 4c0dada590e..3973a650837 100644
---- a/src/backends/drm/drm_commit_thread.h
-+++ b/src/backends/drm/drm_commit_thread.h
-@@ -43,14 +43,6 @@ public:
-      */
-     std::chrono::nanoseconds safetyMargin() const;
- 
--    /**
--     * attempts to submit the currently scheduled commits as a single one,
--     * if there isn't already a commit pending
--     *
--     * @returns if there's a pending commit after this method returns
--     */
--    bool drain();
--
- private:
-     void clearDroppedCommits();
-     TimePoint estimateNextVblank(TimePoint now) const;
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_612ec743_backends-drm-also-generate-modes-for-the-native-refresh-rate-of-the-display.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_612ec743_backends-drm-also-generate-modes-for-the-native-refresh-rate-of-the-display.patch
--- 4:6.3.5-1/debian/patches/upstream_612ec743_backends-drm-also-generate-modes-for-the-native-refresh-rate-of-the-display.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_612ec743_backends-drm-also-generate-modes-for-the-native-refresh-rate-of-the-display.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,313 +0,0 @@
-From 612ec743b30c8a9c38553b6134b92f0de0ae3cad Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@kde.org>
-Date: Fri, 23 May 2025 16:50:01 +0200
-Subject: [PATCH] backends/drm: also generate modes for the native refresh rate
- of the display
-
-As we only do this when the scaling mode is available, it should be pretty safe,
-and these modes avoid driver issues where the refresh rate isn't switched to 60Hz.
-
-BUG: 504655
-
-
-(cherry picked from commit 6d82dbcb7f344db3e3e772f91ec738b9e431681d)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@kde.org>
----
- autotests/drm/drmTest.cpp          | 203 +++++++++++++++++------------
- src/backends/drm/drm_connector.cpp |  33 +++--
- 2 files changed, 142 insertions(+), 94 deletions(-)
-
-diff --git a/autotests/drm/drmTest.cpp b/autotests/drm/drmTest.cpp
-index f6ee1b8d15a..8ee2539173b 100644
---- a/autotests/drm/drmTest.cpp
-+++ b/autotests/drm/drmTest.cpp
-@@ -202,88 +202,123 @@ void DrmTest::testZeroModesHandling()
-     verifyCleanup(mockGpu.get());
- }
- 
-+// because QFETCH as a macro doesn't like commas in the type name
-+using Mode = std::pair<QSize, uint32_t>;
-+
- void DrmTest::testModeGeneration_data()
- {
--    QTest::addColumn<QSize>("nativeMode");
--    QTest::addColumn<QList<QSize>>("expectedModes");
--
--    QTest::newRow("2160p") << QSize(3840, 2160) << QList<QSize>{
--        QSize(1600, 1200),
--        QSize(1280, 1024),
--        QSize(1024, 768),
--        QSize(2560, 1600),
--        QSize(1920, 1200),
--        QSize(1280, 800),
--        QSize(3840, 2160),
--        QSize(3200, 1800),
--        QSize(2880, 1620),
--        QSize(2560, 1440),
--        QSize(1920, 1080),
--        QSize(1600, 900),
--        QSize(1368, 768),
--        QSize(1280, 720),
-+    QTest::addColumn<Mode>("nativeMode");
-+    QTest::addColumn<QList<Mode>>("expectedModes");
-+
-+    QTest::newRow("2160p") << std::make_pair(QSize(3840, 2160), 60u) << QList<Mode>{
-+        std::make_pair(QSize(1600, 1200), 60),
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(2560, 1600), 60),
-+        std::make_pair(QSize(1920, 1200), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(3840, 2160), 60),
-+        std::make_pair(QSize(3200, 1800), 60),
-+        std::make_pair(QSize(2880, 1620), 60),
-+        std::make_pair(QSize(2560, 1440), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-     };
--    QTest::newRow("1440p") << QSize(2560, 1440) << QList<QSize>{
--        QSize(1600, 1200),
--        QSize(1280, 1024),
--        QSize(1024, 768),
--        QSize(1920, 1200),
--        QSize(1280, 800),
--        QSize(2560, 1440),
--        QSize(1920, 1080),
--        QSize(1600, 900),
--        QSize(1368, 768),
--        QSize(1280, 720),
-+
-+    QTest::newRow("2160p") << std::make_pair(QSize(3840, 2160), 120u) << QList<Mode>{
-+        std::make_pair(QSize(1600, 1200), 120),
-+        std::make_pair(QSize(1280, 1024), 120),
-+        std::make_pair(QSize(1024, 768), 120),
-+        std::make_pair(QSize(2560, 1600), 120),
-+        std::make_pair(QSize(1920, 1200), 120),
-+        std::make_pair(QSize(1280, 800), 120),
-+        std::make_pair(QSize(3840, 2160), 120),
-+        std::make_pair(QSize(3200, 1800), 120),
-+        std::make_pair(QSize(2880, 1620), 120),
-+        std::make_pair(QSize(2560, 1440), 120),
-+        std::make_pair(QSize(1920, 1080), 120),
-+        std::make_pair(QSize(1600, 900), 120),
-+        std::make_pair(QSize(1368, 768), 120),
-+        std::make_pair(QSize(1280, 720), 120),
-+        std::make_pair(QSize(1600, 1200), 60),
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(2560, 1600), 60),
-+        std::make_pair(QSize(1920, 1200), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(3840, 2160), 60),
-+        std::make_pair(QSize(3200, 1800), 60),
-+        std::make_pair(QSize(2880, 1620), 60),
-+        std::make_pair(QSize(2560, 1440), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-     };
--    QTest::newRow("1080p") << QSize(1920, 1080) << QList<QSize>{
--        QSize(1280, 1024),
--        QSize(1024, 768),
--        QSize(1280, 800),
--        QSize(1920, 1080),
--        QSize(1600, 900),
--        QSize(1368, 768),
--        QSize(1280, 720),
-+
-+    QTest::newRow("1440p") << std::make_pair(QSize(2560, 1440), 60u) << QList<Mode>{
-+        std::make_pair(QSize(1600, 1200), 60),
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(1920, 1200), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(2560, 1440), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-+    };
-+    QTest::newRow("1080p") << std::make_pair(QSize(1920, 1080), 60u) << QList<Mode>{
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-     };
- 
--    QTest::newRow("2160p 21:9") << QSize(5120, 2160) << QList<QSize>{
--        QSize(5120, 2160),
--        QSize(1600, 1200),
--        QSize(1280, 1024),
--        QSize(1024, 768),
--        QSize(2560, 1600),
--        QSize(1920, 1200),
--        QSize(1280, 800),
--        QSize(3840, 2160),
--        QSize(3200, 1800),
--        QSize(2880, 1620),
--        QSize(2560, 1440),
--        QSize(1920, 1080),
--        QSize(1600, 900),
--        QSize(1368, 768),
--        QSize(1280, 720),
-+    QTest::newRow("2160p 21:9") << std::make_pair(QSize(5120, 2160), 60u) << QList<Mode>{
-+        std::make_pair(QSize(5120, 2160), 60),
-+        std::make_pair(QSize(1600, 1200), 60),
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(2560, 1600), 60),
-+        std::make_pair(QSize(1920, 1200), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(3840, 2160), 60),
-+        std::make_pair(QSize(3200, 1800), 60),
-+        std::make_pair(QSize(2880, 1620), 60),
-+        std::make_pair(QSize(2560, 1440), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-     };
--    QTest::newRow("1440p 21:9") << QSize(3440, 1440) << QList<QSize>{
--        QSize(3440, 1440),
--        QSize(1600, 1200),
--        QSize(1280, 1024),
--        QSize(1024, 768),
--        QSize(1920, 1200),
--        QSize(1280, 800),
--        QSize(2560, 1440),
--        QSize(1920, 1080),
--        QSize(1600, 900),
--        QSize(1368, 768),
--        QSize(1280, 720),
-+    QTest::newRow("1440p 21:9") << std::make_pair(QSize(3440, 1440), 60u) << QList<Mode>{
-+        std::make_pair(QSize(3440, 1440), 60),
-+        std::make_pair(QSize(1600, 1200), 60),
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(1920, 1200), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(2560, 1440), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-     };
--    QTest::newRow("1080p 21:9") << QSize(2560, 1080) << QList<QSize>{
--        QSize(2560, 1080),
--        QSize(1280, 1024),
--        QSize(1024, 768),
--        QSize(1280, 800),
--        QSize(1920, 1080),
--        QSize(1600, 900),
--        QSize(1368, 768),
--        QSize(1280, 720),
-+    QTest::newRow("1080p 21:9") << std::make_pair(QSize(2560, 1080), 60u) << QList<Mode>{
-+        std::make_pair(QSize(2560, 1080), 60),
-+        std::make_pair(QSize(1280, 1024), 60),
-+        std::make_pair(QSize(1024, 768), 60),
-+        std::make_pair(QSize(1280, 800), 60),
-+        std::make_pair(QSize(1920, 1080), 60),
-+        std::make_pair(QSize(1600, 900), 60),
-+        std::make_pair(QSize(1368, 768), 60),
-+        std::make_pair(QSize(1280, 720), 60),
-     };
- }
- 
-@@ -299,11 +334,13 @@ void DrmTest::testModeGeneration()
-     const auto renderBackend = backend->createQPainterBackend();
-     auto gpu = std::make_unique<DrmGpu>(backend.get(), mockGpu->fd, DrmDevice::open(mockGpu->devNode));
- 
--    QFETCH(QSize, nativeMode);
--    QFETCH(QList<QSize>, expectedModes);
-+    QFETCH(Mode, nativeMode);
-+    QFETCH(QList<Mode>, expectedModes);
-+
-+    const auto &[nativeSize, nativeRefreshHz] = nativeMode;
- 
-     conn->modes.clear();
--    conn->addMode(nativeMode.width(), nativeMode.height(), 60);
-+    conn->addMode(nativeSize.width(), nativeSize.height(), nativeRefreshHz);
-     QVERIFY(gpu->updateOutputs());
-     QCOMPARE(gpu->drmOutputs().size(), 1);
-     // no mode generation without the scaling property
-@@ -319,10 +356,14 @@ void DrmTest::testModeGeneration()
-     DrmOutput *const output = gpu->drmOutputs().front();
-     QCOMPARE(output->modes().size(), expectedModes.size());
-     for (const auto &mode : output->modes()) {
--        QVERIFY(expectedModes.contains(mode->size()));
--        QVERIFY(mode->size().width() <= nativeMode.width());
--        QVERIFY(mode->size().height() <= nativeMode.height());
--        QVERIFY(mode->refreshRate() <= 60000);
-+        const auto it = std::ranges::find_if(expectedModes, [mode](const auto &expectedMode) {
-+            return mode->size() == expectedMode.first
-+                && std::round(mode->refreshRate() / 1000.0) == expectedMode.second;
-+        });
-+        QVERIFY(it != expectedModes.end());
-+        QVERIFY(mode->size().width() <= nativeSize.width());
-+        QVERIFY(mode->size().height() <= nativeSize.height());
-+        QCOMPARE_LE(mode->refreshRate(), nativeRefreshHz * 1000);
-     }
- 
-     gpu.reset();
-diff --git a/src/backends/drm/drm_connector.cpp b/src/backends/drm/drm_connector.cpp
-index db3815b247f..c5995e95fd9 100644
---- a/src/backends/drm/drm_connector.cpp
-+++ b/src/backends/drm/drm_connector.cpp
-@@ -372,27 +372,34 @@ QList<std::shared_ptr<DrmConnectorMode>> DrmConnector::generateCommonModes()
- {
-     QList<std::shared_ptr<DrmConnectorMode>> ret;
-     QSize maxSize;
--    uint32_t maxSizeRefreshRate = 0;
-+    uint64_t maxSizeRefreshRate = 0;
-     for (const auto &mode : std::as_const(m_driverModes)) {
-         if (mode->size().width() >= maxSize.width() && mode->size().height() >= maxSize.height() && mode->refreshRate() >= maxSizeRefreshRate) {
-             maxSize = mode->size();
-             maxSizeRefreshRate = mode->refreshRate();
-         }
-     }
--    const uint64_t maxBandwidthEstimation = maxSize.width() * maxSize.height() * uint64_t(maxSizeRefreshRate);
-+    const uint64_t maxBandwidthEstimation = maxSize.width() * maxSize.height() * maxSizeRefreshRate;
-+    QList<uint64_t> refreshRates = {60000ul};
-+    if (maxSizeRefreshRate > 60000ul) {
-+        refreshRates.push_back(maxSizeRefreshRate);
-+    }
-     for (const auto &size : s_commonModes) {
--        const uint64_t bandwidthEstimation = size.width() * size.height() * 60000ull;
--        if (size.width() > maxSize.width() || size.height() > maxSize.height() || bandwidthEstimation > maxBandwidthEstimation) {
--            continue;
--        }
--        const auto generatedMode = generateMode(size, 60);
--        const bool alreadyExists = std::ranges::any_of(m_driverModes, [generatedMode](const auto &mode) {
--            return mode->size() == generatedMode->size() && mode->refreshRate() == generatedMode->refreshRate();
--        });
--        if (alreadyExists) {
--            continue;
-+        for (uint64_t refreshRate : refreshRates) {
-+            const uint64_t bandwidthEstimation = size.width() * size.height() * refreshRate;
-+            if (size.width() > maxSize.width() || size.height() > maxSize.height() || bandwidthEstimation > maxBandwidthEstimation) {
-+                continue;
-+            }
-+            const auto generatedMode = generateMode(size, refreshRate / 1000.0);
-+            const bool alreadyExists = std::ranges::any_of(m_driverModes, [generatedMode](const auto &mode) {
-+                return mode->size() == generatedMode->size()
-+                    && std::round(mode->refreshRate() / 1000.0) == std::round(generatedMode->refreshRate() / 1000.0);
-+            });
-+            if (alreadyExists) {
-+                continue;
-+            }
-+            ret.push_back(generatedMode);
-         }
--        ret << generatedMode;
-     }
-     return ret;
- }
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_68dbfe7a_backends-drm-prevent-the-main-thread-from-moving-the-target-pageflip-time-forward.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_68dbfe7a_backends-drm-prevent-the-main-thread-from-moving-the-target-pageflip-time-forward.patch
--- 4:6.3.5-1/debian/patches/upstream_68dbfe7a_backends-drm-prevent-the-main-thread-from-moving-the-target-pageflip-time-forward.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_68dbfe7a_backends-drm-prevent-the-main-thread-from-moving-the-target-pageflip-time-forward.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,47 +0,0 @@
-From 68dbfe7ac42974716e72e8ae3b59cdec14721d3f Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Thu, 5 Sep 2024 16:04:16 +0200
-Subject: [PATCH] backends/drm: prevent the main thread from moving the target
- pageflip time forward
-
-When the commit thread moves the target back by one refresh cycle, there's some time where
-estimateNextVblank will still return the old target - so if the main thread adds another
-commit to the queue and overrides the target, the commit thread's action would be undone.
----
- src/backends/drm/drm_commit_thread.cpp | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
-diff --git a/src/backends/drm/drm_commit_thread.cpp b/src/backends/drm/drm_commit_thread.cpp
-index 69f8000a549..d3dd4f2a60b 100644
---- a/src/backends/drm/drm_commit_thread.cpp
-+++ b/src/backends/drm/drm_commit_thread.cpp
-@@ -24,6 +24,7 @@ namespace KWin
- 
- DrmCommitThread::DrmCommitThread(DrmGpu *gpu, const QString &name)
-     : m_gpu(gpu)
-+    , m_targetPageflipTime(std::chrono::steady_clock::now())
- {
-     if (!gpu->atomicModeSetting()) {
-         return;
-@@ -314,13 +315,15 @@ void DrmCommitThread::addCommit(std::unique_ptr<DrmAtomicCommit> &&commit)
-     std::unique_lock lock(m_mutex);
-     m_commits.push_back(std::move(commit));
-     const auto now = std::chrono::steady_clock::now();
-+    TimePoint newTarget;
-     if (m_tearing) {
--        m_targetPageflipTime = now;
-+        newTarget = now;
-     } else if (m_vrr && now >= m_lastPageflip + m_minVblankInterval) {
--        m_targetPageflipTime = now;
-+        newTarget = now;
-     } else {
--        m_targetPageflipTime = estimateNextVblank(now);
-+        newTarget = estimateNextVblank(now);
-     }
-+    m_targetPageflipTime = std::max(m_targetPageflipTime, newTarget);
-     m_commits.back()->setDeadline(m_targetPageflipTime - m_safetyMargin);
-     m_commitPending.notify_all();
- }
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_7b93a776_Implement-MouseKeys-on-Wayland.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_7b93a776_Implement-MouseKeys-on-Wayland.patch
--- 4:6.3.5-1/debian/patches/upstream_7b93a776_Implement-MouseKeys-on-Wayland.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_7b93a776_Implement-MouseKeys-on-Wayland.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,694 +0,0 @@
-From 7b93a7761e1d3fe1ca9af863c3921a7a3a276530 Mon Sep 17 00:00:00 2001
-From: Nicolas Fella <nicolas.fella@gmx.de>
-Date: Mon, 26 Dec 2022 00:34:42 +0100
-Subject: [PATCH] Implement MouseKeys on Wayland
-
-This allows to move the mouse cursor using numpad keys.
-
-This is an accessibility feature. On X11 this is implemented in XKB, on Wayland we get to do it outself.
-
-It's implemented as a plugin that filters for relevant keys and generates mouse events through a virtual pointer device
-
-BUG: 478620
----
- autotests/integration/CMakeLists.txt      |   1 +
- autotests/integration/mouse_keys_test.cpp | 222 +++++++++++++++++++
- src/input.h                               |   1 +
- src/plugins/CMakeLists.txt                |   1 +
- src/plugins/mousekeys/CMakeLists.txt      |  18 ++
- src/plugins/mousekeys/main.cpp            |  25 +++
- src/plugins/mousekeys/metadata.json       |   5 +
- src/plugins/mousekeys/mousekeys.cpp       | 249 ++++++++++++++++++++++
- src/plugins/mousekeys/mousekeys.h         |  70 ++++++
- 9 files changed, 592 insertions(+)
- create mode 100644 autotests/integration/mouse_keys_test.cpp
- create mode 100644 src/plugins/mousekeys/CMakeLists.txt
- create mode 100644 src/plugins/mousekeys/main.cpp
- create mode 100644 src/plugins/mousekeys/metadata.json
- create mode 100644 src/plugins/mousekeys/mousekeys.cpp
- create mode 100644 src/plugins/mousekeys/mousekeys.h
-
-diff --git a/autotests/integration/CMakeLists.txt b/autotests/integration/CMakeLists.txt
-index a456d7f9001..59c67b088ae 100644
---- a/autotests/integration/CMakeLists.txt
-+++ b/autotests/integration/CMakeLists.txt
-@@ -147,6 +147,7 @@ integrationTest(NAME testMouseActions SRCS mouseactions_test.cpp LIBS)
- integrationTest(NAME testMouseActions SRCS mouseactions_test.cpp LIBS)
- integrationTest(NAME testColorManagement SRCS test_colormanagement.cpp)
- integrationTest(NAME testKeyboardInput SRCS keyboard_input_test.cpp)
-+integrationTest(NAME testMouseKeys SRCS mouse_keys_test.cpp)
- 
- if(KWIN_BUILD_X11)
-     integrationTest(NAME testDontCrashEmptyDeco SRCS dont_crash_empty_deco.cpp LIBS KDecoration3::KDecoration)
-diff --git a/autotests/integration/mouse_keys_test.cpp b/autotests/integration/mouse_keys_test.cpp
-new file mode 100644
-index 00000000000..9543f9e4398
---- /dev/null
-+++ b/autotests/integration/mouse_keys_test.cpp
-@@ -0,0 +1,222 @@
-+/*
-+    KWin - the KDE window manager
-+    This file is part of the KDE project.
-+
-+    SPDX-FileCopyrightText: 2024 Nicolas Fella <nicolas.fella@gmx.de>
-+
-+    SPDX-License-Identifier: GPL-2.0-or-later
-+*/
-+#include "kwin_wayland_test.h"
-+
-+#include "keyboard_input.h"
-+#include "pointer_input.h"
-+#include "wayland_server.h"
-+#include "window.h"
-+#include "workspace.h"
-+
-+#include <KWayland/Client/pointer.h>
-+#include <KWayland/Client/seat.h>
-+
-+#include <linux/input.h>
-+
-+namespace KWin
-+{
-+
-+static const QString s_socketName = QStringLiteral("wayland_test_kwin_mouse_keys-0");
-+
-+class MouseKeysTest : public QObject
-+{
-+    Q_OBJECT
-+private Q_SLOTS:
-+    void initTestCase();
-+    void init();
-+    void cleanup();
-+    void testMove();
-+    void testClick();
-+};
-+
-+void MouseKeysTest::initTestCase()
-+{
-+    KConfig kaccessConfig("kaccessrc");
-+    kaccessConfig.group(QStringLiteral("Mouse")).writeEntry("MouseKeys", true);
-+    kaccessConfig.sync();
-+
-+    qRegisterMetaType<KWin::Window *>();
-+    QVERIFY(waylandServer()->init(s_socketName));
-+
-+    qputenv("XKB_DEFAULT_RULES", "evdev");
-+
-+    kwinApp()->start();
-+
-+    Test::setOutputConfig({
-+        QRect(0, 0, 1280, 1024),
-+        QRect(1280, 0, 1280, 1024),
-+    });
-+}
-+
-+void MouseKeysTest::init()
-+{
-+    QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::Seat));
-+    QVERIFY(Test::waitForWaylandPointer());
-+
-+    workspace()->setActiveOutput(QPoint(500, 500));
-+    input()->pointer()->warp(QPoint(500, 500));
-+}
-+
-+void MouseKeysTest::cleanup()
-+{
-+    Test::destroyWaylandConnection();
-+}
-+
-+void MouseKeysTest::testMove()
-+{
-+    std::unique_ptr<KWayland::Client::Pointer> pointer(Test::waylandSeat()->createPointer());
-+
-+    std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
-+    QVERIFY(surface != nullptr);
-+    std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
-+    QVERIFY(shellSurface != nullptr);
-+    Window *waylandWindow = Test::renderAndWaitForShown(surface.get(), QSize(1000, 1000), Qt::blue);
-+    QVERIFY(waylandWindow);
-+
-+    QSignalSpy pointerSpy(pointer.get(), &KWayland::Client::Pointer::motion);
-+
-+    quint32 timestamp = 0;
-+
-+    // left
-+    Test::keyboardKeyPressed(KEY_KP4, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP4, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(495, 500));
-+    pointerSpy.clear();
-+
-+    // left up
-+    Test::keyboardKeyPressed(KEY_KP7, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP7, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(490, 495));
-+    pointerSpy.clear();
-+
-+    // up
-+    Test::keyboardKeyPressed(KEY_KP8, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP8, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(490, 490));
-+    pointerSpy.clear();
-+
-+    // right up
-+    Test::keyboardKeyPressed(KEY_KP9, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP9, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(495, 485));
-+    pointerSpy.clear();
-+
-+    // right
-+    Test::keyboardKeyPressed(KEY_KP6, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP6, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(500, 485));
-+    pointerSpy.clear();
-+
-+    // right down
-+    Test::keyboardKeyPressed(KEY_KP3, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP3, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(505, 490));
-+    pointerSpy.clear();
-+
-+    // down
-+    Test::keyboardKeyPressed(KEY_KP2, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP2, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(505, 495));
-+    pointerSpy.clear();
-+
-+    // left down
-+    Test::keyboardKeyPressed(KEY_KP1, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KP1, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first().first().toPointF(), QPointF(500, 500));
-+    pointerSpy.clear();
-+}
-+
-+void MouseKeysTest::testClick()
-+{
-+    std::unique_ptr<KWayland::Client::Pointer> pointer(Test::waylandSeat()->createPointer());
-+
-+    std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
-+    QVERIFY(surface != nullptr);
-+    std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
-+    QVERIFY(shellSurface != nullptr);
-+    Window *waylandWindow = Test::renderAndWaitForShown(surface.get(), QSize(1000, 1000), Qt::blue);
-+    QVERIFY(waylandWindow);
-+
-+    QSignalSpy pointerSpy(pointer.get(), &KWayland::Client::Pointer::buttonStateChanged);
-+
-+    quint32 timestamp = 0;
-+
-+    // left mouse button is default
-+    Test::keyboardKeyPressed(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_LEFT);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Pressed);
-+    pointerSpy.clear();
-+
-+    Test::keyboardKeyReleased(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_LEFT);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Released);
-+    pointerSpy.clear();
-+
-+    // switch to middle
-+    Test::keyboardKeyPressed(KEY_KPASTERISK, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KPASTERISK, ++timestamp);
-+
-+    Test::keyboardKeyPressed(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_MIDDLE);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Pressed);
-+    pointerSpy.clear();
-+
-+    Test::keyboardKeyReleased(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_MIDDLE);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Released);
-+    pointerSpy.clear();
-+
-+    // switch to right
-+    Test::keyboardKeyPressed(KEY_KPMINUS, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KPMINUS, ++timestamp);
-+
-+    Test::keyboardKeyPressed(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_RIGHT);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Pressed);
-+    pointerSpy.clear();
-+
-+    Test::keyboardKeyReleased(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_RIGHT);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Released);
-+    pointerSpy.clear();
-+
-+    // and back to left
-+    Test::keyboardKeyPressed(KEY_KPSLASH, ++timestamp);
-+    Test::keyboardKeyReleased(KEY_KPSLASH, ++timestamp);
-+
-+    Test::keyboardKeyPressed(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_LEFT);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Pressed);
-+    pointerSpy.clear();
-+
-+    Test::keyboardKeyReleased(KEY_KP5, ++timestamp);
-+    QVERIFY(pointerSpy.wait());
-+    QCOMPARE(pointerSpy.first()[2], BTN_LEFT);
-+    QCOMPARE(pointerSpy.first()[3], (int)KWayland::Client::Pointer::ButtonState::Released);
-+    pointerSpy.clear();
-+}
-+}
-+
-+WAYLANDTEST_MAIN(KWin::MouseKeysTest)
-+#include "mouse_keys_test.moc"
-diff --git a/src/input.h b/src/input.h
-index 03d49a15fa7..ca4f48a7212 100644
---- a/src/input.h
-+++ b/src/input.h
-@@ -326,6 +326,7 @@ enum Order {
-     ButtonRebind,
-     BounceKeys,
-     StickyKeys,
-+    MouseKeys,
-     EisInput,
- 
-     VirtualTerminal,
-diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt
-index cc92d696d2e..6984b95e69f 100644
---- a/src/plugins/CMakeLists.txt
-+++ b/src/plugins/CMakeLists.txt
-@@ -79,6 +79,7 @@ add_subdirectory(magnifier)
- add_subdirectory(maximize)
- add_subdirectory(minimizeall)
- add_subdirectory(mouseclick)
-+add_subdirectory(mousekeys)
- add_subdirectory(mousemark)
- add_subdirectory(nightlight)
- add_subdirectory(outputlocator)
-diff --git a/src/plugins/mousekeys/CMakeLists.txt b/src/plugins/mousekeys/CMakeLists.txt
-new file mode 100644
-index 00000000000..f711c9bd92d
---- /dev/null
-+++ b/src/plugins/mousekeys/CMakeLists.txt
-@@ -0,0 +1,18 @@
-+# SPDX-FileCopyrightText: 2022 Nicolas Fella <nicolas.fella@gmx.de>
-+# SPDX-License-Identifier: BSD-3-Clause
-+
-+kcoreaddons_add_plugin(MouseKeysPlugin INSTALL_NAMESPACE "kwin/plugins")
-+
-+ecm_qt_declare_logging_category(MouseKeysPlugin
-+    HEADER mousekeys_debug.h
-+    IDENTIFIER KWIN_MOUSEKEYS
-+    CATEGORY_NAME kwin_mousekeys
-+    DEFAULT_SEVERITY Warning
-+)
-+
-+target_sources(MouseKeysPlugin PRIVATE
-+    main.cpp
-+    mousekeys.cpp
-+)
-+target_link_libraries(MouseKeysPlugin PRIVATE kwin)
-+
-diff --git a/src/plugins/mousekeys/main.cpp b/src/plugins/mousekeys/main.cpp
-new file mode 100644
-index 00000000000..ae1e4c266d3
---- /dev/null
-+++ b/src/plugins/mousekeys/main.cpp
-@@ -0,0 +1,25 @@
-+/*
-+    SPDX-FileCopyrightText: 2022 Nicolas Fella <nicolas.fella@gmx.de>
-+
-+    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-+*/
-+
-+#include <main.h>
-+#include <plugin.h>
-+
-+#include "mousekeys.h"
-+
-+class KWIN_EXPORT MouseKeysFactory : public KWin::PluginFactory
-+{
-+    Q_OBJECT
-+    Q_PLUGIN_METADATA(IID PluginFactory_iid FILE "metadata.json")
-+    Q_INTERFACES(KWin::PluginFactory)
-+
-+public:
-+    std::unique_ptr<KWin::Plugin> create() const override
-+    {
-+        return std::make_unique<MouseKeysFilter>();
-+    }
-+};
-+
-+#include "main.moc"
-diff --git a/src/plugins/mousekeys/metadata.json b/src/plugins/mousekeys/metadata.json
-new file mode 100644
-index 00000000000..aa304f40935
---- /dev/null
-+++ b/src/plugins/mousekeys/metadata.json
-@@ -0,0 +1,5 @@
-+{
-+    "KPlugin": {
-+        "EnabledByDefault": true
-+    }
-+}
-diff --git a/src/plugins/mousekeys/mousekeys.cpp b/src/plugins/mousekeys/mousekeys.cpp
-new file mode 100644
-index 00000000000..517d97cc584
---- /dev/null
-+++ b/src/plugins/mousekeys/mousekeys.cpp
-@@ -0,0 +1,249 @@
-+/*
-+    SPDX-FileCopyrightText: 2022 Nicolas Fella <nicolas.fella@gmx.de>
-+
-+    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-+*/
-+
-+#include "mousekeys.h"
-+#include "mousekeys_debug.h"
-+
-+#include <cmath>
-+
-+QString MouseKeysInputDevice::name() const
-+{
-+    return QStringLiteral("Mouse keys device");
-+}
-+
-+void MouseKeysInputDevice::setEnabled(bool enabled)
-+{
-+}
-+
-+bool MouseKeysInputDevice::isEnabled() const
-+{
-+    return true;
-+}
-+
-+bool MouseKeysInputDevice::isKeyboard() const
-+{
-+    return false;
-+}
-+
-+bool MouseKeysInputDevice::isLidSwitch() const
-+{
-+    return false;
-+}
-+
-+bool MouseKeysInputDevice::isPointer() const
-+{
-+    return true;
-+}
-+
-+bool MouseKeysInputDevice::isTabletModeSwitch() const
-+{
-+    return false;
-+}
-+
-+bool MouseKeysInputDevice::isTabletPad() const
-+{
-+    return false;
-+}
-+
-+bool MouseKeysInputDevice::isTabletTool() const
-+{
-+    return false;
-+}
-+
-+bool MouseKeysInputDevice::isTouch() const
-+{
-+    return false;
-+}
-+
-+bool MouseKeysInputDevice::isTouchpad() const
-+{
-+    return false;
-+}
-+
-+MouseKeysFilter::MouseKeysFilter()
-+    : KWin::Plugin()
-+    , KWin::InputEventFilter(KWin::InputFilterOrder::MouseKeys)
-+    , m_configWatcher(KConfigWatcher::create(KSharedConfig::openConfig("kaccessrc")))
-+{
-+    const QLatin1String groupName("Mouse");
-+    connect(m_configWatcher.get(), &KConfigWatcher::configChanged, this, [this, groupName](const KConfigGroup &group) {
-+        if (group.name() == groupName) {
-+            loadConfig(group);
-+        }
-+    });
-+    loadConfig(m_configWatcher->config()->group(groupName));
-+
-+    m_delayTimer.setSingleShot(true);
-+    connect(&m_delayTimer, &QTimer::timeout, this, &MouseKeysFilter::delayTriggered);
-+    connect(&m_repeatTimer, &QTimer::timeout, this, &MouseKeysFilter::repeatTriggered);
-+}
-+
-+void MouseKeysFilter::loadConfig(const KConfigGroup &group)
-+{
-+    const bool newEnabled = group.readEntry<bool>("MouseKeys", false);
-+
-+    if (m_enabled && !newEnabled) {
-+        KWin::input()->uninstallInputEventFilter(this);
-+        KWin::input()->removeInputDevice(m_inputDevice.get());
-+        m_inputDevice = nullptr;
-+        m_delayTimer.stop();
-+        m_repeatTimer.stop();
-+    }
-+
-+    if (!m_enabled && newEnabled) {
-+        m_inputDevice = std::make_unique<MouseKeysInputDevice>();
-+        KWin::input()->addInputDevice(m_inputDevice.get());
-+        KWin::input()->installInputEventFilter(this);
-+    }
-+
-+    m_enabled = newEnabled;
-+    m_stepsToMax = group.readEntry<int>("MKTimeToMax", 30);
-+    m_curve = group.readEntry<int>("MKCurve", 0);
-+    m_maxSpeed = group.readEntry<int>("MKMaxSpeed", 30);
-+    m_delay = group.readEntry<int>("MKDelay", 160);
-+    m_interval = group.readEntry<int>("MKInterval", 40);
-+
-+    if (m_enabled) {
-+        m_delayTimer.setInterval(m_delay);
-+        m_repeatTimer.setInterval(m_interval);
-+
-+        m_keyStates[KEY_KP1] = false;
-+        m_keyStates[KEY_KP2] = false;
-+        m_keyStates[KEY_KP3] = false;
-+        m_keyStates[KEY_KP4] = false;
-+        m_keyStates[KEY_KP6] = false;
-+        m_keyStates[KEY_KP7] = false;
-+        m_keyStates[KEY_KP8] = false;
-+        m_keyStates[KEY_KP9] = false;
-+        m_mouseButton = BTN_LEFT;
-+        m_currentKey = 0;
-+        m_currentStep = 0;
-+    }
-+}
-+
-+static QPointF deltaForKey(int key)
-+{
-+    static constexpr int delta = 5;
-+
-+    switch (key) {
-+    case KEY_KP1:
-+        return {-delta, delta};
-+    case KEY_KP2:
-+        return {0, delta};
-+    case KEY_KP3:
-+        return {delta, delta};
-+    case KEY_KP4:
-+        return {-delta, 0};
-+    case KEY_KP6:
-+        return {delta, 0};
-+    case KEY_KP7:
-+        return {-delta, -delta};
-+    case KEY_KP8:
-+        return {0, -delta};
-+    case KEY_KP9:
-+        return {delta, -delta};
-+    }
-+
-+    return {0, 0};
-+}
-+
-+void MouseKeysFilter::delayTriggered()
-+{
-+    m_repeatTimer.start();
-+    movePointer(deltaForKey(m_currentKey));
-+}
-+
-+double MouseKeysFilter::deltaFactorForStep(int step) const
-+{
-+    // The algorithm to compute the delta is described in the XKB library
-+    // specification (http://www.xfree86.org/current/XKBlib.pdf), section 10.5
-+
-+    if (step > m_stepsToMax) {
-+        return m_maxSpeed;
-+    }
-+
-+    const double curveFactor = 1 + ((double)m_curve / 1000);
-+
-+    return (m_maxSpeed / std::pow(m_stepsToMax, curveFactor)) * std::pow(step, curveFactor);
-+}
-+
-+void MouseKeysFilter::repeatTriggered()
-+{
-+    ++m_currentStep;
-+
-+    movePointer(deltaForKey(m_currentKey) * deltaFactorForStep(m_currentStep));
-+}
-+
-+void MouseKeysFilter::movePointer(QPointF delta)
-+{
-+    const auto time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now().time_since_epoch());
-+    Q_EMIT m_inputDevice->pointerMotion(delta, delta, time, m_inputDevice.get());
-+    Q_EMIT m_inputDevice->pointerFrame(m_inputDevice.get());
-+}
-+
-+bool MouseKeysFilter::keyboardKey(KWin::KeyboardKeyEvent *event)
-+{
-+    if (!m_enabled) {
-+        return false;
-+    }
-+
-+    if (event->nativeScanCode == KEY_KP1
-+        || event->nativeScanCode == KEY_KP2
-+        || event->nativeScanCode == KEY_KP3
-+        || event->nativeScanCode == KEY_KP4
-+        || event->nativeScanCode == KEY_KP6
-+        || event->nativeScanCode == KEY_KP7
-+        || event->nativeScanCode == KEY_KP8
-+        || event->nativeScanCode == KEY_KP9) {
-+
-+        if (!m_keyStates[event->nativeScanCode] && event->state == KWin::KeyboardKeyState::Pressed && m_currentKey == 0) {
-+            m_keyStates[event->nativeScanCode] = true;
-+            m_delayTimer.start();
-+            m_currentKey = event->nativeScanCode;
-+
-+            movePointer(deltaForKey(event->nativeScanCode));
-+
-+        } else if (m_keyStates[event->nativeScanCode] && event->state == KWin::KeyboardKeyState::Released && event->nativeScanCode == m_currentKey) {
-+            m_keyStates[event->nativeScanCode] = false;
-+            m_delayTimer.stop();
-+            m_repeatTimer.stop();
-+            m_currentKey = 0;
-+            m_currentStep = 0;
-+        }
-+
-+        return true;
-+    }
-+
-+    if (event->nativeScanCode == KEY_KP5) {
-+        const auto time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now().time_since_epoch());
-+        if (event->state == KWin::KeyboardKeyState::Pressed) {
-+            Q_EMIT m_inputDevice->pointerButtonChanged(m_mouseButton, KWin::PointerButtonState::Pressed, time, m_inputDevice.get());
-+        } else {
-+            Q_EMIT m_inputDevice->pointerButtonChanged(m_mouseButton, KWin::PointerButtonState::Released, time, m_inputDevice.get());
-+        }
-+
-+        Q_EMIT m_inputDevice->pointerFrame(m_inputDevice.get());
-+
-+        return true;
-+    }
-+
-+    if (event->nativeScanCode == KEY_KPSLASH) {
-+        m_mouseButton = BTN_LEFT;
-+        return true;
-+    }
-+
-+    if (event->nativeScanCode == KEY_KPASTERISK) {
-+        m_mouseButton = BTN_MIDDLE;
-+        return true;
-+    }
-+
-+    if (event->nativeScanCode == KEY_KPMINUS) {
-+        m_mouseButton = BTN_RIGHT;
-+        return true;
-+    }
-+
-+    return false;
-+}
-diff --git a/src/plugins/mousekeys/mousekeys.h b/src/plugins/mousekeys/mousekeys.h
-new file mode 100644
-index 00000000000..02c7e539f6c
---- /dev/null
-+++ b/src/plugins/mousekeys/mousekeys.h
-@@ -0,0 +1,70 @@
-+/*
-+    SPDX-FileCopyrightText: 2022 Nicolas Fella <nicolas.fella@gmx.de>
-+
-+    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-+*/
-+
-+#pragma once
-+
-+#include "plugin.h"
-+
-+#include "core/inputdevice.h"
-+#include "input.h"
-+#include "input_event.h"
-+
-+#include <linux/input-event-codes.h>
-+
-+#include <QKeySequence>
-+#include <QTimer>
-+
-+class MouseKeysInputDevice : public KWin::InputDevice
-+{
-+    Q_OBJECT
-+
-+public:
-+    QString name() const override;
-+
-+    bool isEnabled() const override;
-+    void setEnabled(bool enabled) override;
-+
-+    bool isKeyboard() const override;
-+    bool isPointer() const override;
-+    bool isTouchpad() const override;
-+    bool isTouch() const override;
-+    bool isTabletTool() const override;
-+    bool isTabletPad() const override;
-+    bool isTabletModeSwitch() const override;
-+    bool isLidSwitch() const override;
-+};
-+
-+class MouseKeysFilter : public KWin::Plugin, public KWin::InputEventFilter
-+{
-+    Q_OBJECT
-+public:
-+    explicit MouseKeysFilter();
-+
-+    bool keyboardKey(KWin::KeyboardKeyEvent *event) override;
-+
-+private:
-+    void loadConfig(const KConfigGroup &group);
-+    void delayTriggered();
-+    void repeatTriggered();
-+    void movePointer(QPointF delta);
-+    double deltaFactorForStep(int step) const;
-+
-+    std::unique_ptr<MouseKeysInputDevice> m_inputDevice;
-+    KConfigWatcher::Ptr m_configWatcher;
-+    QMap<quint32, bool> m_keyStates;
-+    QTimer m_delayTimer;
-+    QTimer m_repeatTimer;
-+    quint32 m_currentKey = 0;
-+    int m_currentStep = 0;
-+    int m_mouseButton = BTN_LEFT;
-+
-+    bool m_enabled = false;
-+    int m_stepsToMax = 0;
-+    int m_curve = 0;
-+    int m_maxSpeed = 0;
-+    int m_delay = 0;
-+    int m_interval = 0;
-+};
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_7f088c1b_backends-drm-Add-missing-null-guard.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_7f088c1b_backends-drm-Add-missing-null-guard.patch
--- 4:6.3.5-1/debian/patches/upstream_7f088c1b_backends-drm-Add-missing-null-guard.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_7f088c1b_backends-drm-Add-missing-null-guard.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
-From 7f088c1b69a59c3e0d6696886394658ccec38e27 Mon Sep 17 00:00:00 2001
-From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
-Date: Mon, 26 May 2025 15:59:33 +0000
-Subject: [PATCH] backends/drm: Add missing null guard
-
-The `ret` pointer can be null if a graphics reset occurs.
-
-SENTRY: KWIN-CD0
-
-
-(cherry picked from commit f727f4d3229efc949d2b4d8817a0b868be8ee045)
-
-Co-authored-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
----
- src/backends/drm/drm_egl_layer.cpp | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/src/backends/drm/drm_egl_layer.cpp b/src/backends/drm/drm_egl_layer.cpp
-index 01d9d6a8062..26dbc57e626 100644
---- a/src/backends/drm/drm_egl_layer.cpp
-+++ b/src/backends/drm/drm_egl_layer.cpp
-@@ -80,7 +80,9 @@ std::shared_ptr<GLTexture> EglGbmLayer::texture() const
- {
-     if (m_scanoutBuffer) {
-         const auto ret = m_surface.eglBackend()->importDmaBufAsTexture(*m_scanoutBuffer->buffer()->dmabufAttributes());
--        ret->setContentTransform(offloadTransform().combine(OutputTransform::FlipY));
-+        if (ret) {
-+            ret->setContentTransform(offloadTransform().combine(OutputTransform::FlipY));
-+        }
-         return ret;
-     } else {
-         return m_surface.texture();
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_801d31a9_plugins-stickykeys-Unlatch-keys-after-mouse-click.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_801d31a9_plugins-stickykeys-Unlatch-keys-after-mouse-click.patch
--- 4:6.3.5-1/debian/patches/upstream_801d31a9_plugins-stickykeys-Unlatch-keys-after-mouse-click.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_801d31a9_plugins-stickykeys-Unlatch-keys-after-mouse-click.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,145 +0,0 @@
-From 801d31a926a4ad7ceeeecc64b273cd514550d613 Mon Sep 17 00:00:00 2001
-From: Nicolas Fella <nicolas.fella@gmx.de>
-Date: Tue, 9 Jul 2024 12:41:14 +0200
-Subject: [PATCH] plugins/stickykeys: Unlatch keys after mouse click
-
-This is how X11 behaves and it allows things like Ctrl+Click to work as expected with sticky keys
----
- autotests/integration/sticky_keys_test.cpp | 57 ++++++++++++++++++++++
- src/plugins/stickykeys/stickykeys.cpp      | 27 ++++++++++
- src/plugins/stickykeys/stickykeys.h        |  1 +
- 3 files changed, 85 insertions(+)
-
-diff --git a/autotests/integration/sticky_keys_test.cpp b/autotests/integration/sticky_keys_test.cpp
-index 29fb6110f4f..d0780db627f 100644
---- a/autotests/integration/sticky_keys_test.cpp
-+++ b/autotests/integration/sticky_keys_test.cpp
-@@ -37,6 +37,8 @@ private Q_SLOTS:
-     void testStick_data();
-     void testLock();
-     void testLock_data();
-+    void testMouse();
-+    void testMouse_data();
-     void testDisableTwoKeys();
- };
- 
-@@ -280,6 +282,61 @@ void StickyKeysTest::testDisableTwoKeys()
-     Test::keyboardKeyReleased(KEY_A, ++timestamp);
-     QVERIFY(!modifierSpy.wait(10));
- }
-+
-+void StickyKeysTest::testMouse_data()
-+{
-+    QTest::addColumn<int>("modifierKey");
-+    QTest::addColumn<int>("expectedMods");
-+
-+    QTest::addRow("Shift") << KEY_LEFTSHIFT << 1;
-+    QTest::addRow("Ctrl") << KEY_LEFTCTRL << 4;
-+    QTest::addRow("Alt") << KEY_LEFTALT << 8;
-+    QTest::addRow("AltGr") << KEY_RIGHTALT << 128;
-+}
-+
-+void StickyKeysTest::testMouse()
-+{
-+    QFETCH(int, modifierKey);
-+    QFETCH(int, expectedMods);
-+
-+    std::unique_ptr<KWayland::Client::Keyboard> keyboard(Test::waylandSeat()->createKeyboard());
-+
-+    std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
-+    QVERIFY(surface != nullptr);
-+    std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
-+    QVERIFY(shellSurface != nullptr);
-+    Window *waylandWindow = Test::renderAndWaitForShown(surface.get(), QSize(10, 10), Qt::blue);
-+    QVERIFY(waylandWindow);
-+
-+    QSignalSpy modifierSpy(keyboard.get(), &KWayland::Client::Keyboard::modifiersChanged);
-+    QVERIFY(modifierSpy.wait());
-+    modifierSpy.clear();
-+
-+    quint32 timestamp = 0;
-+
-+    // press mod to latch it
-+    Test::keyboardKeyPressed(modifierKey, ++timestamp);
-+    QVERIFY(modifierSpy.wait());
-+    // arguments are: quint32 depressed, quint32 latched, quint32 locked, quint32 group
-+    QCOMPARE(modifierSpy.first()[0], expectedMods); // verify that mod is depressed
-+    QCOMPARE(modifierSpy.first()[1], expectedMods); // verify that mod is latched
-+
-+    modifierSpy.clear();
-+    // release mod, the modifier should still be latched
-+    Test::keyboardKeyReleased(modifierKey, ++timestamp);
-+    QVERIFY(modifierSpy.wait());
-+    QCOMPARE(modifierSpy.first()[0], 0); // verify that mod is not depressed
-+    QCOMPARE(modifierSpy.first()[1], expectedMods); // verify that mod is still latched
-+
-+    // press and release a mouse button, this unlatches the modifier
-+    modifierSpy.clear();
-+    Test::pointerButtonPressed(BTN_LEFT, ++timestamp);
-+    QVERIFY(!modifierSpy.wait(10));
-+    Test::pointerButtonReleased(BTN_LEFT, ++timestamp);
-+    QVERIFY(modifierSpy.wait());
-+    QCOMPARE(modifierSpy.first()[0], 0); // verify that mod is not depressed
-+    QCOMPARE(modifierSpy.first()[1], 0); // verify that mod is not latched any more
-+}
- }
- 
- WAYLANDTEST_MAIN(KWin::StickyKeysTest)
-diff --git a/src/plugins/stickykeys/stickykeys.cpp b/src/plugins/stickykeys/stickykeys.cpp
-index 2b699438fa1..32f586f60d1 100644
---- a/src/plugins/stickykeys/stickykeys.cpp
-+++ b/src/plugins/stickykeys/stickykeys.cpp
-@@ -9,6 +9,8 @@
- #include "keyboard_input.h"
- #include "xkb.h"
- 
-+#include <QTimer>
-+
- #include <KLazyLocalizedString>
- #if KWIN_BUILD_NOTIFICATIONS
- #include <KNotification>
-@@ -183,4 +185,29 @@ void StickyKeysFilter::disableStickyKeys()
-     KWin::input()->uninstallInputEventFilter(this);
- }
- 
-+bool StickyKeysFilter::pointerButton(KWin::PointerButtonEvent *event)
-+{
-+    if (event->state == KWin::PointerButtonState::Released) {
-+        // unlatch all unlocked modifiers
-+        for (auto it = m_keyStates.keyValueBegin(); it != m_keyStates.keyValueEnd(); ++it) {
-+
-+            if (it->second == Locked) {
-+                continue;
-+            }
-+
-+            it->second = KeyState::None;
-+
-+            KWin::input()->keyboard()->xkb()->setModifierLatched(keyToModifier(static_cast<Qt::Key>(it->first)), false);
-+
-+            // We need to delay the modifier update until the client received the mouse event, otherwise
-+            // the updated modifiers arrive before the mouse event and e.g. Ctrl+Click won't work
-+            QTimer::singleShot(0, this, [] {
-+                KWin::input()->keyboard()->xkb()->forwardModifiers();
-+            });
-+        }
-+    }
-+
-+    return false;
-+}
-+
- #include "moc_stickykeys.cpp"
-diff --git a/src/plugins/stickykeys/stickykeys.h b/src/plugins/stickykeys/stickykeys.h
-index f432618c4e1..f76a7ebfcea 100644
---- a/src/plugins/stickykeys/stickykeys.h
-+++ b/src/plugins/stickykeys/stickykeys.h
-@@ -18,6 +18,7 @@ public:
-     explicit StickyKeysFilter();
- 
-     bool keyboardKey(KWin::KeyboardKeyEvent *event) override;
-+    bool pointerButton(KWin::PointerButtonEvent *event) override;
- 
-     enum KeyState {
-         None,
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_8450d9a8_wayland-xdgoutput-round-the-scaled-output-position.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_8450d9a8_wayland-xdgoutput-round-the-scaled-output-position.patch
--- 4:6.3.5-1/debian/patches/upstream_8450d9a8_wayland-xdgoutput-round-the-scaled-output-position.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_8450d9a8_wayland-xdgoutput-round-the-scaled-output-position.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-From 8450d9a8ed43b03eb69bc565297fe846a00c81a5 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Thu, 22 May 2025 17:12:26 +0200
-Subject: [PATCH] wayland/xdgoutput: round the scaled output position
-
-Otherwise it just gets clipped, making the result differ from what
-Xwayland::updatePrimary expects (and potentially overlap with another output)
-
-
-(cherry picked from commit 611be1e7f4a19cd3694e3f0d55d9879fccd83caf)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@kde.org>
----
- src/wayland/xdgoutput_v1.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/wayland/xdgoutput_v1.cpp b/src/wayland/xdgoutput_v1.cpp
-index 850af72623a..58da0093bc0 100644
---- a/src/wayland/xdgoutput_v1.cpp
-+++ b/src/wayland/xdgoutput_v1.cpp
-@@ -185,7 +185,7 @@ void XdgOutputV1Interface::sendLogicalPosition(Resource *resource)
-     ClientConnection *connection = output->display()->getConnection(resource->client());
-     qreal scaleOverride = connection->scaleOverride();
- 
--    send_logical_position(resource->handle, pos.x() * scaleOverride, pos.y() * scaleOverride);
-+    send_logical_position(resource->handle, std::round(pos.x() * scaleOverride), std::round(pos.y() * scaleOverride));
- }
- 
- void XdgOutputV1Interface::sendDone(Resource *resource)
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_85eeafa0_backends-drm-dynamically-adjust-the-safety-margin-based-on-commit-time.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_85eeafa0_backends-drm-dynamically-adjust-the-safety-margin-based-on-commit-time.patch
--- 4:6.3.5-1/debian/patches/upstream_85eeafa0_backends-drm-dynamically-adjust-the-safety-margin-based-on-commit-time.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_85eeafa0_backends-drm-dynamically-adjust-the-safety-margin-based-on-commit-time.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,113 +0,0 @@
-From 85eeafa09282cd6bda8effb0523ee656cb0eab2f Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Thu, 3 Apr 2025 18:46:07 +0200
-Subject: [PATCH] backends/drm: dynamically adjust the safety margin based on
- commit time
-
-Atomic (test) commits can take a varying amount of time, and that depends on
-the content of the commits as well as CPU frequency. For example, changing
-GAMMA_LUT can take a whole additional millisecond on my desktop PC, and may
-take even longer on laptops in power saving mode.
-
-To mitigate that, as well as the scheduler not necessarily waking up the commit
-thread at the desired time, the added logic compares the desired vs. achieved
-commit completion timestamp after every atomic commit, and adjusts the safety
-margin accordingly.
-
-As we currently don't know exactly when the atomic commit is actually applied,
-and the timestamp for when the ioctl returns is just an approximation (which
-fails on NVidia), this keeps the base safety margin at 1.5ms. We can reduce
-that once we have some API to actually know when the commit is applied.
-
-BUG: 495167
----
- src/backends/drm/drm_commit_thread.cpp | 27 ++++++++++++++++++++++++--
- src/backends/drm/drm_commit_thread.h   |  2 ++
- src/backends/drm/drm_pipeline.cpp      |  2 ++
- 3 files changed, 29 insertions(+), 2 deletions(-)
-
-diff --git a/src/backends/drm/drm_commit_thread.cpp b/src/backends/drm/drm_commit_thread.cpp
-index 94c786acc78..3761ae241e0 100644
---- a/src/backends/drm/drm_commit_thread.cpp
-+++ b/src/backends/drm/drm_commit_thread.cpp
-@@ -144,11 +144,31 @@ void DrmCommitThread::submit()
-     const auto vrr = commit->isVrr();
-     const bool success = commit->commit();
-     if (success) {
--        m_lastCommitTime = std::chrono::steady_clock::now();
-         m_vrr = vrr.value_or(m_vrr);
-         m_tearing = commit->isTearing();
-         m_committed = std::move(m_commits.front());
-         m_commits.erase(m_commits.begin());
-+
-+        // the kernel might still take some time to actually apply the commit
-+        // after we return from the commit ioctl, but we don't have any better
-+        // way to know when it's done
-+        m_lastCommitTime = std::chrono::steady_clock::now();
-+        // this is when we wanted to have completed the commit
-+        const auto targetTimestamp = m_targetPageflipTime - m_baseSafetyMargin;
-+        // this is how much safety we need to add or remove to achieve that next time
-+        const auto safetyDifference = targetTimestamp - m_lastCommitTime;
-+        if (safetyDifference < std::chrono::nanoseconds::zero()) {
-+            // the commit was done later than desired, immediately add the
-+            // required difference to make sure that it doesn't happen again
-+            m_additionalSafetyMargin -= safetyDifference;
-+        } else {
-+            // we were done earlier than desired. This isn't problematic, but
-+            // we want to keep latency at a minimum, so slowly reduce the safety margin
-+            m_additionalSafetyMargin -= safetyDifference / 10;
-+        }
-+        const auto maximumReasonableMargin = std::min<std::chrono::nanoseconds>(3ms, m_minVblankInterval / 2);
-+        m_additionalSafetyMargin = std::clamp(m_additionalSafetyMargin, 0ns, maximumReasonableMargin);
-+        m_safetyMargin = m_baseSafetyMargin + m_additionalSafetyMargin;
-     } else {
-         if (m_commits.size() > 1) {
-             // the failure may have been because of the reordering of commits
-@@ -339,6 +359,8 @@ void DrmCommitThread::clearDroppedCommits()
-     m_commitsToDelete.clear();
- }
- 
-+// TODO reduce the default for this, once we have a more accurate way to know when an atomic commit
-+// is actually applied. Waiting for the commit returning seems to work on Intel and AMD, but not with NVidia
- static const std::chrono::microseconds s_safetyMarginMinimum = []() {
-     bool ok = false;
-     int value = qEnvironmentVariableIntValue("KWIN_DRM_OVERRIDE_SAFETY_MARGIN", &ok);
-@@ -347,7 +369,8 @@ void DrmCommitThread::setModeInfo(uint32_t maximum, std::chrono::nanoseconds vbl
-     m_minVblankInterval = std::chrono::nanoseconds(1'000'000'000'000ull / maximum);
-     // the kernel rejects commits that happen during vblank
-     // the 1.5ms on top of that was chosen experimentally, for the time it takes to commit + scheduling inaccuracies
--    m_safetyMargin = vblankTime + s_safetyMarginMinimum;
-+    m_baseSafetyMargin = vblankTime + s_safetyMarginMinimum;
-+    m_safetyMargin = m_baseSafetyMargin + m_additionalSafetyMargin;
- }
- 
- void DrmCommitThread::pageFlipped(std::chrono::nanoseconds timestamp)
-diff --git a/src/backends/drm/drm_commit_thread.h b/src/backends/drm/drm_commit_thread.h
-index 3973a650837..aeb6ad007cc 100644
---- a/src/backends/drm/drm_commit_thread.h
-+++ b/src/backends/drm/drm_commit_thread.h
-@@ -65,6 +65,8 @@ private:
-     bool m_vrr = false;
-     bool m_tearing = false;
-     std::chrono::nanoseconds m_safetyMargin{0};
-+    std::chrono::nanoseconds m_baseSafetyMargin{0};
-+    std::chrono::nanoseconds m_additionalSafetyMargin = std::chrono::milliseconds(1);
-     bool m_ping = false;
-     bool m_pageflipTimeoutDetected = false;
- };
-diff --git a/src/backends/drm/drm_pipeline.cpp b/src/backends/drm/drm_pipeline.cpp
-index 71b52661854..215899629f6 100644
---- a/src/backends/drm/drm_pipeline.cpp
-+++ b/src/backends/drm/drm_pipeline.cpp
-@@ -458,6 +458,8 @@ void DrmPipeline::pageFlipped(std::chrono::nanoseconds timestamp)
- {
-     RenderLoopPrivate::get(m_output->renderLoop())->notifyVblank(timestamp);
-     m_commitThread->pageFlipped(timestamp);
-+    // the commit thread adjusts the safety margin on every commit
-+    m_output->renderLoop()->setPresentationSafetyMargin(m_commitThread->safetyMargin());
-     if (gpu()->needsModeset()) {
-         gpu()->maybeModeset(nullptr, nullptr);
-     }
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_be55cfa2_wayland-colormanagement-fix-sending-target-luminance-levels.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_be55cfa2_wayland-colormanagement-fix-sending-target-luminance-levels.patch
--- 4:6.3.5-1/debian/patches/upstream_be55cfa2_wayland-colormanagement-fix-sending-target-luminance-levels.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_be55cfa2_wayland-colormanagement-fix-sending-target-luminance-levels.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,26 +0,0 @@
-From be55cfa27efb7d477ffd96daba438f61b57eb82a Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Tue, 20 May 2025 01:06:09 +0200
-Subject: [PATCH] wayland/colormanagement: fix sending target luminance levels
-
-(cherry picked from commit c6ea19d4594de393cf0dbff6dc568c5051fb463b)
----
- src/wayland/colormanagement_v1.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/wayland/colormanagement_v1.cpp b/src/wayland/colormanagement_v1.cpp
-index 94859f5b61c..979517f70f6 100644
---- a/src/wayland/colormanagement_v1.cpp
-+++ b/src/wayland/colormanagement_v1.cpp
-@@ -534,7 +534,7 @@ void ImageDescriptionV1::wp_image_description_v1_get_information(Resource *qtRes
-         wp_image_description_info_v1_send_target_max_cll(resource, *maxcll);
-     }
-     wp_image_description_info_v1_send_luminances(resource, std::round(m_description->transferFunction().minLuminance / s_minLuminanceUnit), std::round(m_description->transferFunction().maxLuminance), std::round(m_description->referenceLuminance()));
--    wp_image_description_info_v1_send_target_luminance(resource, m_description->minLuminance(), m_description->maxHdrLuminance().value_or(800));
-+    wp_image_description_info_v1_send_target_luminance(resource, std::round(m_description->minLuminance() / s_minLuminanceUnit), std::round(m_description->maxHdrLuminance().value_or(800)));
-     wp_image_description_info_v1_send_tf_named(resource, kwinTFtoProtoTF(m_description->transferFunction()));
-     wp_image_description_info_v1_send_done(resource);
-     wl_resource_destroy(resource);
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_cc5d1256_outputconfigurationstore-disable-adaptive-sync-by-default.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_cc5d1256_outputconfigurationstore-disable-adaptive-sync-by-default.patch
--- 4:6.3.5-1/debian/patches/upstream_cc5d1256_outputconfigurationstore-disable-adaptive-sync-by-default.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_cc5d1256_outputconfigurationstore-disable-adaptive-sync-by-default.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,40 +0,0 @@
-From cc5d125619bebfa93eb956f2020a014103caab3a Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Fri, 23 May 2025 19:35:31 +0200
-Subject: [PATCH] outputconfigurationstore: disable adaptive sync by default
-
-I've seen too many driver bugs with VRR since we added it, ranging from displays blanking for
-a moment when enabling or disabling VRR to even turning off completely while it's actually used.
-There is also a secondary issue that many displays have some amount of brightness flicker while
-VRR is used, which we can't properly limit without new KMS APIs.
-
-Some of these issues are rather bad, and while they're not our fault, it still gives people a
-bad user experience and bad impression of Plasma, so this should be turned off by default at
-least until the most severe issues are resolved.
-
-This change does not affect existing configurations.
-
-
-(cherry picked from commit 701f1cec07753b3b27d11b9a71e95fab929d3a8a)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@kde.org>
----
- src/outputconfigurationstore.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/outputconfigurationstore.cpp b/src/outputconfigurationstore.cpp
-index 255fc9dfaa1..dbe6efecf4d 100644
---- a/src/outputconfigurationstore.cpp
-+++ b/src/outputconfigurationstore.cpp
-@@ -509,7 +509,7 @@ std::pair<OutputConfiguration, QList<Output *>> OutputConfigurationStore::genera
-             .manualTransform = existingData.manualTransform.value_or(kscreenChangeSet.transform.value_or(output->panelOrientation())),
-             .overscan = existingData.overscan.value_or(kscreenChangeSet.overscan.value_or(0)),
-             .rgbRange = existingData.rgbRange.value_or(kscreenChangeSet.rgbRange.value_or(Output::RgbRange::Automatic)),
--            .vrrPolicy = existingData.vrrPolicy.value_or(kscreenChangeSet.vrrPolicy.value_or(VrrPolicy::Automatic)),
-+            .vrrPolicy = existingData.vrrPolicy.value_or(kscreenChangeSet.vrrPolicy.value_or(VrrPolicy::Never)),
-             .highDynamicRange = existingData.highDynamicRange.value_or(false),
-             .referenceLuminance = existingData.referenceLuminance.value_or(std::clamp(output->maxAverageBrightness().value_or(200), 200.0, 500.0)),
-             .wideColorGamut = existingData.wideColorGamut.value_or(false),
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_cfd044a3_plugins-colorpicker-round-the-result.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_cfd044a3_plugins-colorpicker-round-the-result.patch
--- 4:6.3.5-1/debian/patches/upstream_cfd044a3_plugins-colorpicker-round-the-result.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_cfd044a3_plugins-colorpicker-round-the-result.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-From cfd044a3f2c55c83df86bae5b065352199dc3069 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@kde.org>
-Date: Thu, 22 May 2025 01:02:32 +0200
-Subject: [PATCH] plugins/colorpicker: round the result
-
-Otherwise it gets clipped, which means the tiniest of rounding errors can
-change the 8 bit result.
-
-BUG: 491633
----
- src/plugins/colorpicker/colorpicker.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/plugins/colorpicker/colorpicker.cpp b/src/plugins/colorpicker/colorpicker.cpp
-index 77ebd1d29bb..8ba8562727d 100644
---- a/src/plugins/colorpicker/colorpicker.cpp
-+++ b/src/plugins/colorpicker/colorpicker.cpp
-@@ -70,7 +70,7 @@ void ColorPickerEffect::paintScreen(const RenderTarget &renderTarget, const Rend
- 
-         context->glReadnPixels(texturePosition.x(), renderTarget.size().height() - texturePosition.y() - PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE, GL_RGBA, GL_FLOAT, sizeof(float) * data.size(), data.data());
-         QVector3D sRGB = 255 * renderTarget.colorDescription().mapTo(QVector3D(data[0], data[1], data[2]), ColorDescription::sRGB, RenderingIntent::RelativeColorimetricWithBPC);
--        QDBusConnection::sessionBus().send(m_replyMessage.createReply(QColor(sRGB.x(), sRGB.y(), sRGB.z())));
-+        QDBusConnection::sessionBus().send(m_replyMessage.createReply(QColor(std::round(sRGB.x()), std::round(sRGB.y()), std::round(sRGB.z()))));
-         setPicking(false);
-         m_scheduledPosition = QPoint(-1, -1);
-     }
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_f1f25d2d_backends-drm-also-guard-DrmOutput-cursorLayer-for-nullptr-pipeline.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_f1f25d2d_backends-drm-also-guard-DrmOutput-cursorLayer-for-nullptr-pipeline.patch
--- 4:6.3.5-1/debian/patches/upstream_f1f25d2d_backends-drm-also-guard-DrmOutput-cursorLayer-for-nullptr-pipeline.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_f1f25d2d_backends-drm-also-guard-DrmOutput-cursorLayer-for-nullptr-pipeline.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
-From f1f25d2da9e6a7c0b28a333684449cc7733dc388 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Mon, 19 May 2025 14:37:58 +0000
-Subject: [PATCH] backends/drm: also guard DrmOutput::cursorLayer for nullptr
- pipeline
-
-BUG: 504516
-
-
-(cherry picked from commit ceb2415e5bc314bb325ddc1664e684844f1a7ff3)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@gmail.com>
----
- src/backends/drm/drm_output.cpp | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp
-index a467d737901..151cb2d466f 100644
---- a/src/backends/drm/drm_output.cpp
-+++ b/src/backends/drm/drm_output.cpp
-@@ -568,6 +568,11 @@ DrmOutputLayer *DrmOutput::primaryLayer() const
- 
- DrmOutputLayer *DrmOutput::cursorLayer() const
- {
-+    if (!m_pipeline) {
-+        // this can happen when the output gets hot-unplugged
-+        // FIXME fix output lifetimes so that this doesn't happen anymore...
-+        return nullptr;
-+    }
-     return m_pipeline->cursorLayer();
- }
- 
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/patches/upstream_f82034f0_don-t-leak-lcms-tone-curves.patch 4:6.3.5-0ubuntu2/debian/patches/upstream_f82034f0_don-t-leak-lcms-tone-curves.patch
--- 4:6.3.5-1/debian/patches/upstream_f82034f0_don-t-leak-lcms-tone-curves.patch	2025-05-20 06:34:30.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/patches/upstream_f82034f0_don-t-leak-lcms-tone-curves.patch	1970-01-01 00:00:00.000000000 +0000
@@ -1,79 +0,0 @@
-From f82034f0ac7f3a89b360fbf30bdd61e94aaee8fa Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Thu, 22 May 2025 14:54:40 +0200
-Subject: [PATCH] don't leak lcms tone curves
-
-cmsStageAllocToneCurves duplicates them, it does not take ownership
-
-
-(cherry picked from commit 14604f68f835c88427fcef0a9e7380d5a182a182)
-
-Co-authored-by: Xaver Hugl <xaver.hugl@kde.org>
----
- src/colors/colordevice.cpp       |  2 --
- src/core/colortransformation.cpp |  5 +++++
- src/core/iccprofile.cpp          | 11 ++++-------
- 3 files changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/src/colors/colordevice.cpp b/src/colors/colordevice.cpp
-index ff2de5713fc..c58f2bae1a9 100644
---- a/src/colors/colordevice.cpp
-+++ b/src/colors/colordevice.cpp
-@@ -14,8 +14,6 @@
- 
- #include <QTimer>
- 
--#include <lcms2.h>
--
- namespace KWin
- {
- 
-diff --git a/src/core/colortransformation.cpp b/src/core/colortransformation.cpp
-index c6d063e05b9..03a688f4003 100644
---- a/src/core/colortransformation.cpp
-+++ b/src/core/colortransformation.cpp
-@@ -86,6 +86,11 @@ std::unique_ptr<ColorTransformation> ColorTransformation::createScalingTransform
-     auto g = cmsBuildParametricToneCurve(nullptr, 2, curveParams.data());
-     curveParams = {1.0, scale.z(), 0.0};
-     auto b = cmsBuildParametricToneCurve(nullptr, 2, curveParams.data());
-+    const auto guard = qScopeGuard([r, g, b]() {
-+        cmsFreeToneCurve(r);
-+        cmsFreeToneCurve(g);
-+        cmsFreeToneCurve(b);
-+    });
-     if (!r || !g || !b) {
-         qCWarning(KWIN_CORE) << "Failed to build tone curves";
-         return nullptr;
-diff --git a/src/core/iccprofile.cpp b/src/core/iccprofile.cpp
-index 17be36c93d5..4707224ef67 100644
---- a/src/core/iccprofile.cpp
-+++ b/src/core/iccprofile.cpp
-@@ -267,14 +267,8 @@ IccProfile::Expected IccProfile::load(const QString &path)
-     std::shared_ptr<ColorTransformation> vcgt;
-     cmsToneCurve **vcgtTag = static_cast<cmsToneCurve **>(cmsReadTag(handle, cmsSigVcgtTag));
-     if (vcgtTag && vcgtTag[0]) {
--        // Need to duplicate the VCGT tone curves as they are owned by the profile.
--        cmsToneCurve *toneCurves[] = {
--            cmsDupToneCurve(vcgtTag[0]),
--            cmsDupToneCurve(vcgtTag[1]),
--            cmsDupToneCurve(vcgtTag[2]),
--        };
-         std::vector<std::unique_ptr<ColorPipelineStage>> stages;
--        stages.push_back(std::make_unique<ColorPipelineStage>(cmsStageAllocToneCurves(nullptr, 3, toneCurves)));
-+        stages.push_back(std::make_unique<ColorPipelineStage>(cmsStageAllocToneCurves(nullptr, 3, vcgtTag)));
-         vcgt = std::make_shared<ColorTransformation>(std::move(stages));
-     }
- 
-@@ -403,6 +397,9 @@ IccProfile::Expected IccProfile::load(const QString &path)
-     }
-     std::vector<std::unique_ptr<ColorPipelineStage>> stages;
-     stages.push_back(std::make_unique<ColorPipelineStage>(cmsStageAllocToneCurves(nullptr, toneCurves.size(), toneCurves.data())));
-+    for (auto toneCurve : toneCurves) {
-+        cmsFreeToneCurve(toneCurve);
-+    }
-     const auto inverseEOTF = std::make_shared<ColorTransformation>(std::move(stages));
-     return std::make_unique<IccProfile>(handle, Colorimetry(red, green, blue, white), std::move(bToA0), std::move(bToA1), inverseEOTF, vcgt, relativeBlackPoint, maxBrightness);
- }
--- 
-GitLab
-
diff -pruN 4:6.3.5-1/debian/rules 4:6.3.5-0ubuntu2/debian/rules
--- 4:6.3.5-1/debian/rules	2024-11-26 07:57:07.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/rules	2025-06-14 07:15:21.000000000 +0000
@@ -6,6 +6,9 @@ export DEB_BUILD_MAINT_OPTIONS=hardening
 %:
 	dh $@
 
+override_dh_python3:
+	dh_python3 usr/share/kconf_update/
+
 override_dh_auto_configure:
 	dh_auto_configure -- -DBUILD_TESTING=OFF \
 		-DQTWAYLANDSCANNER_KDE_EXECUTABLE=/usr/lib/qt6/libexec/qtwaylandscanner
diff -pruN 4:6.3.5-1/debian/salsa/extra_repository.list 4:6.3.5-0ubuntu2/debian/salsa/extra_repository.list
--- 4:6.3.5-1/debian/salsa/extra_repository.list	1970-01-01 00:00:00.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/salsa/extra_repository.list	2025-06-14 07:15:21.000000000 +0000
@@ -0,0 +1 @@
+deb https://qt-kde-team.debian.net/debian qt-kde-snapshots main
diff -pruN 4:6.3.5-1/debian/salsa/qt-kde-team.debian.net.asc 4:6.3.5-0ubuntu2/debian/salsa/qt-kde-team.debian.net.asc
--- 4:6.3.5-1/debian/salsa/qt-kde-team.debian.net.asc	1970-01-01 00:00:00.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/salsa/qt-kde-team.debian.net.asc	2025-06-14 07:15:21.000000000 +0000
@@ -0,0 +1,51 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+bMTcHe5rk6snXqz1neEmP2K7qdNwwakRdAA=
+=o8PI
+-----END PGP PUBLIC KEY BLOCK-----
diff -pruN 4:6.3.5-1/debian/salsa-ci.yml 4:6.3.5-0ubuntu2/debian/salsa-ci.yml
--- 4:6.3.5-1/debian/salsa-ci.yml	2025-04-05 07:00:15.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/salsa-ci.yml	2025-06-14 07:15:21.000000000 +0000
@@ -1,3 +1,6 @@
 include:
 - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
 - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
+variables:
+  EXTRA_REPOSITORY: debian/salsa/extra_repository.list
+  EXTRA_REPOSITORY_KEY: debian/salsa/qt-kde-team.debian.net.asc
diff -pruN 4:6.3.5-1/debian/upstream/signing-key.asc 4:6.3.5-0ubuntu2/debian/upstream/signing-key.asc
--- 4:6.3.5-1/debian/upstream/signing-key.asc	2025-04-05 07:37:50.000000000 +0000
+++ 4:6.3.5-0ubuntu2/debian/upstream/signing-key.asc	2025-06-14 07:15:21.000000000 +0000
@@ -1,148 +1,157 @@
 -----BEGIN PGP PUBLIC KEY BLOCK-----
 
-xsBNBFaTa+4BCACxyJ3oTNhz5oJOCu70mrxFqj/uqDfNm2K8Prr0CQ2I7yXijfTZ
+mQENBFG1+bQBCAC3p+fdi9+55LFuKPqW0XrQkQQ2CRfXcM5lqb6B4xQewLorsdX7
+SRDmLzpdDZ9bCpqxMsiFbB+9lxljHNTzx9BIEO9w6aYtVgPsG4L9ZxwBXUTlgtIA
+UoOy4lTQnUR0QDFlJQx8c4Cy82htOSCiWO4iaEvMbo+BGe8g4f2/N0tJOrnAc/xl
+sdA64GTWId4NB12F+QeRgWWNQs/W/j/kyy37+L0juD06RMKth0uRMN37wEa9KcLa
+lOBEUETrImZfx74wagt6WDnJknLf0ceqzfojk82po0C46BJAu49tLehYYKgo0HKZ
+fK7CDw53y9SjkI8cU8g48AyUw8Uk/FyJeW1bABEBAAG0N0RhdmlkIEVkbXVuZHNv
+biAoRGF2aWQgYXQgS0RFKSA8ZGF2aWRlZG11bmRzb25Aa2RlLm9yZz6JATgEEwEC
+ACIFAlG1+bQCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPVnVgXHTgLP
+KD0H/0Cnj1bM6MYV5nKXJhLpd8as2OHFlhdtaU7QG3QcMVqdtP3rdOp1RgjmkYsB
+xgwrxvDTLz0L/PH9UTCXjQeZgNR0hG8iy4IBC9ay0PDdkNpjnHoAiUMRstcDODUZ
+QdLEOXCbPbRG3q0OlSaOvETL7YkSY8c2N6yqmWaJvudpJ0VVPyIWa2xT53JTXgAD
+4m1w8MThAZBZpJi852nQCByCsRC+3cofA7bQd60XLiFWgmnq+rlqryMlWvUmMmat
+e7U1NC5UsfH6ToXf/ZNZG+fMGE+ntYiHWRFr2tZMyXfUOrgHsAVMAE8v/xVtwS5e
+VCAdM21GNG4d6XiF7T32GDzrEQm5AQ0EUbX5tAEIAL0uLkPxHbg9boIuVdahyy6F
+BOcUf8xj3qj8FUGpRkcSSsoyvFTHZRTR+wwTPTaZzzzTFSITRGVv7vdKyl/A+SMw
+/nlUVfB9xGvvCgzPGesUk9lmxX2DRVpoq9CyVIw0XXJQtNkC3O1yEws4zuDzHe99
+sfDvXpA1ikfN+Hgn3oLjCHHtWuTyXGKXUimzToDMqWentVkP1rzKPlin9XJ0KDT/
+axrrD9L5s4KCjHdWEQwG3miJDxQnlsAFDBj7Bs8DZZE+xdzx/l8qBKOxmXD9ohFp
+4q0wXVV4QJMHtjhvhId9EN965drlYmMfusMCwavklBOWdR1MdSSBIYPS5eISmj0A
+EQEAAYkBHwQYAQIACQUCUbX5tAIbDAAKCRD1Z1YFx04Cz4CzCACpN1l39Yzoniqx
+laabcOrEbFjhKXlFXPm5TC+nj2iO8BieJLoltTcQL1nbxBHcxMkxUUJAVKBSmlh3
+BPjYJhXBNRvW/gamjaO+LoStXI+0vO4aOhkR0tLqA9/zQFM9uVPu6InS0N98oMaL
+azyxnXuqEanCN7yWfKHKxmkKiVMB1RMaE+2TYQBKPfFukiX2vv3qByVez8qYGa98
+80x6fkrqFbPoJ2oDXEGGD0W7fkv1pZV/1XCuXV/qKz3htD3AQDuLijqt6sM9Oe7Y
+Lsv5lqTb5DK6g2N9xvhTz64Z+j9bf44fbMReg3ub3GXlf9rFT8eDYfyYLJgWJ/1h
+YZximth9
+=QnRI
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFaTa+4BCACxyJ3oTNhz5oJOCu70mrxFqj/uqDfNm2K8Prr0CQ2I7yXijfTZ
 GVIjURIzp+Zhmc1LhZYlNwwI9ivFFvLoS9kH2rkx9EaIuP3ljtxQskRFrX4BepR9
 /EvIoi7tUuOEqCy2pRy/y7Rc7s3Qbu/sPQ17wvRQqzTKsvoh9wxat6990l1MFjlF
 /xBOD4Qb9LJGzc6Y8SLEEs7l/vAesL0viOME1hVQk+fG0KFosI32aeNnnLHPZbLi
 Z2YETvI5nROMhleSDusqUpVxXzkIBcVLbCyeJooRsZAhJ6AB8qvhOXx2xTBBgMpw
-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
+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
-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
-Lg==
-=e7CK
+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
+=j9MJ
+-----END PGP PUBLIC KEY BLOCK-----
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+oS4=
+=yOFv
 -----END PGP PUBLIC KEY BLOCK-----
