commit:     2bca6ba8b0bdacccb883071046b7a9b50ce32231
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Tue Feb 18 18:57:14 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Tue Feb 18 18:58:05 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=2bca6ba8

kde-plasma/kwin: pull in workaround for GCC 15

Pull in workaround from upstream PR at 
https://invent.kde.org/plasma/kwin/-/merge_requests/7191.

(There's changes requested before it gets merged but they're cosmetic.)

No revbump as 6.3.1 was just pushed.

Bug: https://bugs.kde.org/show_bug.cgi?id=500310
Bug: https://gcc.gnu.org/PR118923
Thanks-to: Kacper Słomiński <kacper.slominski72 <AT> gmail.com>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../kwin/files/kwin-6.3.1-gcc15-workaround.patch   | 92 ++++++++++++++++++++++
 kde-plasma/kwin/kwin-6.3.1.ebuild                  |  4 +
 2 files changed, 96 insertions(+)

diff --git a/kde-plasma/kwin/files/kwin-6.3.1-gcc15-workaround.patch 
b/kde-plasma/kwin/files/kwin-6.3.1-gcc15-workaround.patch
new file mode 100644
index 000000000000..3990682a5f9d
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-6.3.1-gcc15-workaround.patch
@@ -0,0 +1,92 @@
+https://invent.kde.org/plasma/kwin/-/merge_requests/7191
+https://bugs.kde.org/show_bug.cgi?id=500310
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118923
+
+From 4d9a024f1b2f502de9a33024a2a762aefa4007cd Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Kacper=20S=C5=82omi=C5=84ski?=
+ <[email protected]>
+Date: Tue, 18 Feb 2025 18:16:59 +0100
+Subject: [PATCH] Factor out {previousRestricted,restricted}MoveArea calls out
+ of loops
+
+This works around a GCC 15 bug that causes KWin to crash.
+
+BUG: 500310
+---
+ src/window.cpp | 24 ++++++++++++++++--------
+ 1 file changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/src/window.cpp b/src/window.cpp
+index a05771e90c..1a56560280 100644
+--- a/src/window.cpp
++++ b/src/window.cpp
+@@ -4026,25 +4026,29 @@ void Window::checkWorkspacePosition(QRectF 
oldGeometry, const VirtualDesktop *ol
+     auto moveAreaFunc = workspace()->inRearrange() ? 
&Workspace::previousRestrictedMoveArea : //... the restricted areas changed
+         &Workspace::restrictedMoveArea; //... when e.g. active desktop or 
screen changes
+ 
+-    for (const QRect &r : (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaTop)) {
++    const auto oldRectsTop = (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaTop);
++    for (const QRect &r : oldRectsTop) {
+         QRect rect = r & oldGeomTall;
+         if (!rect.isEmpty()) {
+             oldTopMax = std::max(oldTopMax, rect.y() + rect.height());
+         }
+     }
+-    for (const QRect &r : (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaRight)) {
++    const auto oldRectsRight = (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaRight);
++    for (const QRect &r : oldRectsRight) {
+         QRect rect = r & oldGeomWide;
+         if (!rect.isEmpty()) {
+             oldRightMax = std::min(oldRightMax, rect.x());
+         }
+     }
+-    for (const QRect &r : (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaBottom)) {
++    const auto oldRectsBottom = (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaBottom);
++    for (const QRect &r : oldRectsBottom) {
+         QRect rect = r & oldGeomTall;
+         if (!rect.isEmpty()) {
+             oldBottomMax = std::min(oldBottomMax, rect.y());
+         }
+     }
+-    for (const QRect &r : (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaLeft)) {
++    const auto oldRectsLeft = (workspace()->*moveAreaFunc)(oldDesktop, 
StrutAreaLeft);
++    for (const QRect &r : oldRectsLeft) {
+         QRect rect = r & oldGeomWide;
+         if (!rect.isEmpty()) {
+             oldLeftMax = std::max(oldLeftMax, rect.x() + rect.width());
+@@ -4052,25 +4056,29 @@ void Window::checkWorkspacePosition(QRectF 
oldGeometry, const VirtualDesktop *ol
+     }
+ 
+     // These 4 compute new bounds
+-    for (const QRect &r : workspace()->restrictedMoveArea(desktop, 
StrutAreaTop)) {
++    const auto newRectsTop = workspace()->restrictedMoveArea(desktop, 
StrutAreaTop);
++    for (const QRect &r : newRectsTop) {
+         QRect rect = r & newGeomTall;
+         if (!rect.isEmpty()) {
+             topMax = std::max(topMax, rect.y() + rect.height());
+         }
+     }
+-    for (const QRect &r : workspace()->restrictedMoveArea(desktop, 
StrutAreaRight)) {
++    const auto newRectsRight = workspace()->restrictedMoveArea(desktop, 
StrutAreaRight);
++    for (const QRect &r : newRectsRight) {
+         QRect rect = r & newGeomWide;
+         if (!rect.isEmpty()) {
+             rightMax = std::min(rightMax, rect.x());
+         }
+     }
+-    for (const QRect &r : workspace()->restrictedMoveArea(desktop, 
StrutAreaBottom)) {
++    const auto newRectsBottom = workspace()->restrictedMoveArea(desktop, 
StrutAreaBottom);
++    for (const QRect &r : newRectsBottom) {
+         QRect rect = r & newGeomTall;
+         if (!rect.isEmpty()) {
+             bottomMax = std::min(bottomMax, rect.y());
+         }
+     }
+-    for (const QRect &r : workspace()->restrictedMoveArea(desktop, 
StrutAreaLeft)) {
++    const auto newRectsLeft = workspace()->restrictedMoveArea(desktop, 
StrutAreaLeft);
++    for (const QRect &r : newRectsLeft) {
+         QRect rect = r & newGeomWide;
+         if (!rect.isEmpty()) {
+             leftMax = std::max(leftMax, rect.x() + rect.width());
+-- 
+GitLab

diff --git a/kde-plasma/kwin/kwin-6.3.1.ebuild 
b/kde-plasma/kwin/kwin-6.3.1.ebuild
index b500c5ad9597..26d567553ec5 100644
--- a/kde-plasma/kwin/kwin-6.3.1.ebuild
+++ b/kde-plasma/kwin/kwin-6.3.1.ebuild
@@ -114,6 +114,10 @@ BDEPEND="
 # -m 0755 to avoid suid with USE="-filecaps"
 FILECAPS=( -m 0755 cap_sys_nice=ep usr/bin/kwin_wayland )
 
+PATCHES=(
+       "${FILESDIR}"/${P}-gcc15-workaround.patch
+)
+
 src_prepare() {
        ecm_src_prepare
 

Reply via email to