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@gmail.com>
Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James
2025-02-18 18:57:14 +00:00
parent 94679e87b2
commit 2bca6ba8b0
2 changed files with 96 additions and 0 deletions

View File

@@ -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?=
<kacper.slominski72@gmail.com>
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

View File

@@ -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