diff options
author | 2022-05-25 21:30:12 +0200 | |
---|---|---|
committer | 2022-05-25 23:10:11 +0200 | |
commit | 854fdba3048965bfa65fdb9d0d827c3cf86283e7 (patch) | |
tree | 73172a79b82dc41efdf5630cbbb0082a5446c795 /kde-plasma/kwin | |
parent | kde-plasma/libksysguard: Drop 5.24.5 (r0) (diff) | |
download | gentoo-854fdba3048965bfa65fdb9d0d827c3cf86283e7.tar.gz gentoo-854fdba3048965bfa65fdb9d0d827c3cf86283e7.tar.bz2 gentoo-854fdba3048965bfa65fdb9d0d827c3cf86283e7.zip |
kde-plasma/kwin: Backport several 5.24.6 fixes
Package-Manager: Portage-3.0.30, Repoman-3.0.3
Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
Diffstat (limited to 'kde-plasma/kwin')
4 files changed, 516 insertions, 0 deletions
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch new file mode 100644 index 000000000000..46b6f0ad9c71 --- /dev/null +++ b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch @@ -0,0 +1,307 @@ +From 4c3195270d6c8e1da8c3e2e3abe5aae75d5bf3c2 Mon Sep 17 00:00:00 2001 +From: Vlad Zahorodnii <vlad.zahorodnii@kde.org> +Date: Fri, 26 Nov 2021 12:03:14 +0200 +Subject: [PATCH] Ensure that Toplevel::output() stays always in sync with + geometry + +Currently, if geometry updates are blocked, the Toplevel.output property +won't be updated. On the other hand, it's reasonable to use the output +property instead of manually looking up the output in window management +code, e.g. Workspace::clientArea(). + +In other words, using the Toplevel.output property is like walking on a +mine field, things can blow up. You can't use Toplevel.output even if it +makes perfect sense. + +This change ensures that Toplevel.output property is always kept in sync +with the frame geometry. Unfortunately, this means that the output +property no longer can be updated when the frameGeometryChanged() signal +is emitted. It has to be done in moveResizeInternal() method. + +BUG: 448064 + +(cherry picked from 510a41eeb89f51843405fa0258c852ab06d05bb8) + +Part-of: <https://invent.kde.org/plasma/kwin/-/merge_requests/2448> +--- + src/abstract_client.cpp | 3 --- + src/events.cpp | 1 + + src/internal_client.cpp | 6 ++++++ + src/toplevel.cpp | 17 ----------------- + src/toplevel.h | 10 ++-------- + src/unmanaged.cpp | 6 ++++++ + src/unmanaged.h | 1 + + src/waylandclient.cpp | 6 ++++++ + src/x11client.cpp | 7 +++++++ + src/x11client.h | 1 + + 10 files changed, 30 insertions(+), 28 deletions(-) + +diff --git a/src/abstract_client.cpp b/src/abstract_client.cpp +index 0714b9ac3f..ddff11e53c 100644 +--- a/src/abstract_client.cpp ++++ b/src/abstract_client.cpp +@@ -63,8 +63,6 @@ AbstractClient::AbstractClient() + { + connect(this, &AbstractClient::clientStartUserMovedResized, this, &AbstractClient::moveResizedChanged); + connect(this, &AbstractClient::clientFinishUserMovedResized, this, &AbstractClient::moveResizedChanged); +- connect(this, &AbstractClient::clientStartUserMovedResized, this, &AbstractClient::removeCheckOutputConnection); +- connect(this, &AbstractClient::clientFinishUserMovedResized, this, &AbstractClient::setupCheckOutputConnection); + + connect(this, &AbstractClient::windowShown, this, &AbstractClient::hiddenChanged); + connect(this, &AbstractClient::windowHidden, this, &AbstractClient::hiddenChanged); +@@ -1011,7 +1009,6 @@ void AbstractClient::finishInteractiveMoveResize(bool cancel) + if (cancel) { + moveResize(initialInteractiveMoveResizeGeometry()); + } +- checkOutput(); // needs to be done because clientFinishUserMovedResized has not yet re-activated online alignment + if (output() != interactiveMoveResizeStartOutput()) { + workspace()->sendClientToOutput(this, output()); // checks rule validity + if (isFullScreen() || maximizeMode() != MaximizeRestore) { +diff --git a/src/events.cpp b/src/events.cpp +index b9bb9bbd36..a22960f0d0 100644 +--- a/src/events.cpp ++++ b/src/events.cpp +@@ -1261,6 +1261,7 @@ void Unmanaged::configureNotifyEvent(xcb_configure_notify_event_t *e) + m_clientGeometry = newgeom; + m_frameGeometry = newgeom; + m_bufferGeometry = newgeom; ++ checkOutput(); + Q_EMIT bufferGeometryChanged(this, old); + Q_EMIT clientGeometryChanged(this, old); + Q_EMIT frameGeometryChanged(this, old); +diff --git a/src/internal_client.cpp b/src/internal_client.cpp +index 3be51ff27b..b4c9250fd3 100644 +--- a/src/internal_client.cpp ++++ b/src/internal_client.cpp +@@ -10,6 +10,7 @@ + #include "internal_client.h" + #include "decorations/decorationbridge.h" + #include "deleted.h" ++#include "platform.h" + #include "surfaceitem.h" + #include "workspace.h" + +@@ -477,6 +478,7 @@ void InternalClient::commitGeometry(const QRect &rect) + // The client geometry and the buffer geometry are the same. + const QRect oldClientGeometry = m_clientGeometry; + const QRect oldFrameGeometry = m_frameGeometry; ++ const AbstractOutput *oldOutput = m_output; + + m_clientGeometry = frameRectToClientRect(rect); + m_frameGeometry = rect; +@@ -486,6 +488,7 @@ void InternalClient::commitGeometry(const QRect &rect) + return; + } + ++ m_output = kwinApp()->platform()->outputAt(rect.center()); + syncGeometryToInternalWindow(); + + if (oldClientGeometry != m_clientGeometry) { +@@ -495,6 +498,9 @@ void InternalClient::commitGeometry(const QRect &rect) + if (oldFrameGeometry != m_frameGeometry) { + Q_EMIT frameGeometryChanged(this, oldFrameGeometry); + } ++ if (oldOutput != m_output) { ++ Q_EMIT screenChanged(); ++ } + Q_EMIT geometryShapeChanged(this, oldFrameGeometry); + } + +diff --git a/src/toplevel.cpp b/src/toplevel.cpp +index 698f6998e5..ff216835c4 100644 +--- a/src/toplevel.cpp ++++ b/src/toplevel.cpp +@@ -47,7 +47,6 @@ Toplevel::Toplevel() + , m_skipCloseAnimation(false) + { + connect(screens(), &Screens::changed, this, &Toplevel::screenChanged); +- setupCheckOutputConnection(); + connect(this, &Toplevel::bufferGeometryChanged, this, &Toplevel::inputTransformationChanged); + + // Only for compatibility reasons, drop in the next major release. +@@ -379,22 +378,6 @@ void Toplevel::deleteEffectWindow() + effect_window = nullptr; + } + +-void Toplevel::checkOutput() +-{ +- setOutput(kwinApp()->platform()->outputAt(frameGeometry().center())); +-} +- +-void Toplevel::setupCheckOutputConnection() +-{ +- connect(this, &Toplevel::frameGeometryChanged, this, &Toplevel::checkOutput); +- checkOutput(); +-} +- +-void Toplevel::removeCheckOutputConnection() +-{ +- disconnect(this, &Toplevel::frameGeometryChanged, this, &Toplevel::checkOutput); +-} +- + int Toplevel::screen() const + { + return kwinApp()->platform()->enabledOutputs().indexOf(m_output); +diff --git a/src/toplevel.h b/src/toplevel.h +index f6b5dd4e61..3309647eb4 100644 +--- a/src/toplevel.h ++++ b/src/toplevel.h +@@ -636,13 +636,6 @@ Q_SIGNALS: + void visibleGeometryChanged(); + + protected Q_SLOTS: +- /** +- * Checks whether the screen number for this Toplevel changed and updates if needed. +- * Any method changing the geometry of the Toplevel should call this method. +- */ +- void checkOutput(); +- void setupCheckOutputConnection(); +- void removeCheckOutputConnection(); + void setReadyForPainting(); + + protected: +@@ -673,6 +666,8 @@ protected: + void deleteShadow(); + void deleteEffectWindow(); + void setDepth(int depth); ++ ++ AbstractOutput *m_output = nullptr; + QRect m_frameGeometry; + QRect m_clientGeometry; + QRect m_bufferGeometry; +@@ -700,7 +695,6 @@ private: + QRegion opaque_region; + mutable QRegion m_shapeRegion; + mutable bool m_shapeRegionIsValid = false; +- AbstractOutput *m_output = nullptr; + bool m_skipCloseAnimation; + quint32 m_pendingSurfaceId = 0; + QPointer<KWaylandServer::SurfaceInterface> m_surface; +diff --git a/src/unmanaged.cpp b/src/unmanaged.cpp +index de3caa303d..3164813a75 100644 +--- a/src/unmanaged.cpp ++++ b/src/unmanaged.cpp +@@ -12,6 +12,7 @@ + #include "workspace.h" + #include "effects.h" + #include "deleted.h" ++#include "platform.h" + #include "surfaceitem_x11.h" + #include "utils/common.h" + +@@ -206,6 +207,11 @@ QWindow *Unmanaged::findInternalWindow() const + return nullptr; + } + ++void Unmanaged::checkOutput() ++{ ++ setOutput(kwinApp()->platform()->outputAt(frameGeometry().center())); ++} ++ + void Unmanaged::damageNotifyEvent() + { + Q_ASSERT(kwinApp()->operationMode() == Application::OperationModeX11); +diff --git a/src/unmanaged.h b/src/unmanaged.h +index e874fc1724..fa543eb0b8 100644 +--- a/src/unmanaged.h ++++ b/src/unmanaged.h +@@ -45,6 +45,7 @@ private: + void configureNotifyEvent(xcb_configure_notify_event_t *e); + void damageNotifyEvent(); + QWindow *findInternalWindow() const; ++ void checkOutput(); + void associate(); + void initialize(); + bool m_outline = false; +diff --git a/src/waylandclient.cpp b/src/waylandclient.cpp +index 39d6ea22bc..9d8070c7f8 100644 +--- a/src/waylandclient.cpp ++++ b/src/waylandclient.cpp +@@ -7,6 +7,7 @@ + */ + + #include "waylandclient.h" ++#include "platform.h" + #include "screens.h" + #include "wayland_server.h" + #include "workspace.h" +@@ -289,6 +290,7 @@ void WaylandClient::updateGeometry(const QRect &rect) + const QRect oldClientGeometry = m_clientGeometry; + const QRect oldFrameGeometry = m_frameGeometry; + const QRect oldBufferGeometry = m_bufferGeometry; ++ const AbstractOutput *oldOutput = m_output; + + m_clientGeometry = frameRectToClientRect(rect); + m_frameGeometry = rect; +@@ -310,6 +312,7 @@ void WaylandClient::updateGeometry(const QRect &rect) + return; + } + ++ m_output = kwinApp()->platform()->outputAt(rect.center()); + updateWindowRules(Rules::Position | Rules::Size); + + if (changedGeometries & WaylandGeometryBuffer) { +@@ -321,6 +324,9 @@ void WaylandClient::updateGeometry(const QRect &rect) + if (changedGeometries & WaylandGeometryFrame) { + Q_EMIT frameGeometryChanged(this, oldFrameGeometry); + } ++ if (oldOutput != m_output) { ++ Q_EMIT screenChanged(); ++ } + Q_EMIT geometryShapeChanged(this, oldFrameGeometry); + } + +diff --git a/src/x11client.cpp b/src/x11client.cpp +index ce275fff1b..d7ed823128 100644 +--- a/src/x11client.cpp ++++ b/src/x11client.cpp +@@ -4062,6 +4062,8 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode) + m_lastClientGeometry == m_clientGeometry) { + return; + } ++ ++ m_output = kwinApp()->platform()->outputAt(frameGeometry.center()); + if (areGeometryUpdatesBlocked()) { + setPendingMoveResizeMode(mode); + return; +@@ -4070,6 +4072,7 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode) + const QRect oldBufferGeometry = m_lastBufferGeometry; + const QRect oldFrameGeometry = m_lastFrameGeometry; + const QRect oldClientGeometry = m_lastClientGeometry; ++ const AbstractOutput *oldOutput = m_lastOutput; + + updateServerGeometry(); + updateWindowRules(Rules::Position|Rules::Size); +@@ -4077,6 +4080,7 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode) + m_lastBufferGeometry = m_bufferGeometry; + m_lastFrameGeometry = m_frameGeometry; + m_lastClientGeometry = m_clientGeometry; ++ m_lastOutput = m_output; + + if (isActive()) { + workspace()->setActiveOutput(output()); +@@ -4092,6 +4096,9 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode) + if (oldFrameGeometry != m_frameGeometry) { + Q_EMIT frameGeometryChanged(this, oldFrameGeometry); + } ++ if (oldOutput != m_output) { ++ Q_EMIT screenChanged(); ++ } + Q_EMIT geometryShapeChanged(this, oldFrameGeometry); + } + +diff --git a/src/x11client.h b/src/x11client.h +index b523044d3d..adb8b0e8df 100644 +--- a/src/x11client.h ++++ b/src/x11client.h +@@ -524,6 +524,7 @@ private: + QMetaObject::Connection m_edgeGeometryTrackingConnection; + + QMargins m_clientFrameExtents; ++ AbstractOutput *m_lastOutput = nullptr; + QRect m_lastBufferGeometry; + QRect m_lastFrameGeometry; + QRect m_lastClientGeometry; +-- +GitLab + diff --git a/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch new file mode 100644 index 000000000000..026efdf9465b --- /dev/null +++ b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch @@ -0,0 +1,35 @@ +From a8477c1cf7acbf3358c85e53b236150dd43b4640 Mon Sep 17 00:00:00 2001 +From: Xaver Hugl <xaver.hugl@gmail.com> +Date: Thu, 14 Apr 2022 18:48:56 +0200 +Subject: [PATCH] toplevel: set valid output in the constructor + +This makes it less easy to cause crashes and fixes some segfaults. + +BUG: 452433 +BUG: 448064 + +(cherry picked from commit e48a5c0535f01dc380449ba8481c869ff23e5558) + +Tested-by: Merge Service <https://invent.kde.org/plasma/kwin/-/merge_requests/2448> +Part-of: <https://invent.kde.org/plasma/kwin/-/merge_requests/2448> +--- + src/toplevel.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/toplevel.cpp b/src/toplevel.cpp +index ff216835c4..5d3d7a5dde 100644 +--- a/src/toplevel.cpp ++++ b/src/toplevel.cpp +@@ -34,7 +34,8 @@ namespace KWin + { + + Toplevel::Toplevel() +- : m_visual(XCB_NONE) ++ : m_output(workspace()->activeOutput()) ++ , m_visual(XCB_NONE) + , bit_depth(24) + , info(nullptr) + , ready_for_painting(false) +-- +GitLab + diff --git a/kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch b/kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch new file mode 100644 index 000000000000..d1dbb3fb9bb8 --- /dev/null +++ b/kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch @@ -0,0 +1,32 @@ +From 1b96d21507a3b6b0a9ac6eac424d4e4db5602839 Mon Sep 17 00:00:00 2001 +From: David Redondo <kde@david-redondo.de> +Date: Wed, 18 May 2022 13:34:45 +0200 +Subject: [PATCH] Update device outputName when setting output + +BUG:451279 +FIXED-IN:5.25.0 + + +(cherry picked from commit d3a37aa9aef58fbaedcef77d2797c22a015dc9c0) +--- + src/backends/libinput/device.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/backends/libinput/device.cpp b/src/backends/libinput/device.cpp +index f247b66d74..30f51aca3c 100644 +--- a/src/backends/libinput/device.cpp ++++ b/src/backends/libinput/device.cpp +@@ -668,8 +668,10 @@ void Device::setOutput(AbstractOutput *output) + { + m_output = output; + if (m_output) { ++ m_outputName = output->name(); + writeEntry(ConfigKey::OutputName, output->name()); + } else { ++ m_outputName = QString(); + writeEntry(ConfigKey::OutputName, QString()); + } + Q_EMIT outputNameChanged(); +-- +GitLab + diff --git a/kde-plasma/kwin/kwin-5.24.5-r2.ebuild b/kde-plasma/kwin/kwin-5.24.5-r2.ebuild new file mode 100644 index 000000000000..c4afd02c8fc6 --- /dev/null +++ b/kde-plasma/kwin/kwin-5.24.5-r2.ebuild @@ -0,0 +1,142 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +ECM_HANDBOOK="optional" +ECM_TEST="optional" +KFMIN=5.90.0 +PVCUT=$(ver_cut 1-3) +QTMIN=5.15.2 +VIRTUALX_REQUIRED="test" +inherit ecm kde.org optfeature + +DESCRIPTION="Flexible, composited Window Manager for windowing systems on Linux" + +LICENSE="GPL-2+" +SLOT="5" +KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~x86" +IUSE="accessibility caps gles2-only multimedia plasma screencast" + +RESTRICT="test" + +COMMON_DEPEND=" + >=dev-libs/libinput-1.19 + >=dev-libs/wayland-1.2 + >=dev-qt/qtdbus-${QTMIN}:5 + >=dev-qt/qtdeclarative-${QTMIN}:5 + >=dev-qt/qtgui-${QTMIN}:5=[gles2-only=,libinput] + >=dev-qt/qtwidgets-${QTMIN}:5 + >=dev-qt/qtx11extras-${QTMIN}:5 + >=kde-frameworks/kactivities-${KFMIN}:5 + >=kde-frameworks/kauth-${KFMIN}:5 + >=kde-frameworks/kcmutils-${KFMIN}:5 + >=kde-frameworks/kcompletion-${KFMIN}:5 + >=kde-frameworks/kconfig-${KFMIN}:5 + >=kde-frameworks/kconfigwidgets-${KFMIN}:5 + >=kde-frameworks/kcoreaddons-${KFMIN}:5 + >=kde-frameworks/kcrash-${KFMIN}:5 + >=kde-frameworks/kdbusaddons-${KFMIN}:5 + >=kde-frameworks/kdeclarative-${KFMIN}:5 + >=kde-frameworks/kglobalaccel-${KFMIN}:5= + >=kde-frameworks/ki18n-${KFMIN}:5 + >=kde-frameworks/kiconthemes-${KFMIN}:5 + >=kde-frameworks/kidletime-${KFMIN}:5= + >=kde-frameworks/knewstuff-${KFMIN}:5 + >=kde-frameworks/knotifications-${KFMIN}:5 + >=kde-frameworks/kpackage-${KFMIN}:5 + >=kde-frameworks/kservice-${KFMIN}:5 + >=kde-frameworks/ktextwidgets-${KFMIN}:5 + >=kde-frameworks/kwayland-${KFMIN}:5 + >=kde-frameworks/kwidgetsaddons-${KFMIN}:5 + >=kde-frameworks/kwindowsystem-${KFMIN}:5=[X] + >=kde-frameworks/kxmlgui-${KFMIN}:5 + >=kde-frameworks/plasma-${KFMIN}:5 + >=kde-plasma/breeze-${PVCUT}:5 + >=kde-plasma/kdecoration-${PVCUT}:5 + >=kde-plasma/kscreenlocker-${PVCUT}:5 + >=kde-plasma/kwayland-server-${PVCUT}:5 + media-libs/fontconfig + media-libs/freetype + media-libs/lcms:2 + media-libs/libepoxy + >=media-libs/mesa-21.1[egl(+),gbm(+),wayland,X] + virtual/libudev:= + x11-libs/libX11 + x11-libs/libXi + x11-libs/libdrm + >=x11-libs/libxcb-1.10 + >=x11-libs/libxkbcommon-0.7.0 + x11-libs/xcb-util-cursor + x11-libs/xcb-util-image + x11-libs/xcb-util-keysyms + x11-libs/xcb-util-wm + accessibility? ( media-libs/libqaccessibilityclient:5 ) + caps? ( sys-libs/libcap ) + gles2-only? ( media-libs/mesa[gles2] ) + plasma? ( >=kde-frameworks/krunner-${KFMIN}:5 ) + screencast? ( >=media-video/pipewire-0.3:= ) +" +RDEPEND="${COMMON_DEPEND} + >=dev-qt/qtquickcontrols-${QTMIN}:5 + >=dev-qt/qtquickcontrols2-${QTMIN}:5 + >=dev-qt/qtvirtualkeyboard-${QTMIN}:5 + >=kde-frameworks/kirigami-${KFMIN}:5 + >=kde-frameworks/kitemmodels-${KFMIN}:5[qml] + sys-apps/hwdata + x11-base/xwayland + multimedia? ( >=dev-qt/qtmultimedia-${QTMIN}:5[gstreamer,qml] ) +" +DEPEND="${COMMON_DEPEND} + >=dev-qt/designer-${QTMIN}:5 + >=dev-qt/qtconcurrent-${QTMIN}:5 + x11-base/xorg-proto + test? ( + dev-libs/plasma-wayland-protocols + >=dev-libs/wayland-protocols-1.19 + ) +" +BDEPEND="test? ( >=dev-qt/qtwaylandscanner-${QTMIN}:5 )" +PDEPEND=">=kde-plasma/kde-cli-tools-${PVCUT}:5" + +PATCHES=( + "${FILESDIR}"/${P}-fix-multi-gpu-double-copy.patch # KDE-bug 453386 + "${FILESDIR}"/${P}-tabbox-dont-dismiss-popups.patch # KDE-bug 446318 + "${FILESDIR}"/${P}-effects-overview-hide-panels.patch # KDE-bug 444274 + "${FILESDIR}"/${P}-fix-nvidia-render-glitches.patch + "${FILESDIR}"/${P}-update-device-outputName.patch # KDE-bug 451279 + "${FILESDIR}"/${P}-fix-plasmashell-crash-{1,2}.patch # KDE-bugs 448064, 452433 +) + +src_prepare() { + ecm_src_prepare + use multimedia || eapply "${FILESDIR}/${PN}-5.21.80-gstreamer-optional.patch" + + # TODO: try to get a build switch upstreamed + if ! use screencast; then + sed -e "s/^pkg_check_modules.*PipeWire/#&/" -i CMakeLists.txt || die + fi +} + +src_configure() { + local mycmakeargs=( + $(cmake_use_find_package accessibility QAccessibilityClient) + $(cmake_use_find_package caps Libcap) + $(cmake_use_find_package plasma KF5Runner) + ) + + ecm_src_configure +} + +pkg_postinst() { + ecm_pkg_postinst + optfeature "color management support" x11-misc/colord + elog + elog "In Plasma 5.20, default behavior of the Task Switcher to move minimised" + elog "windows to the end of the list was changed so that it remains in the" + elog "original order. To revert to the well established behavior:" + elog + elog " - Edit ~/.config/kwinrc" + elog " - Find [TabBox] section" + elog " - Add \"MoveMinimizedWindowsToEndOfTabBoxFocusChain=true\"" +} |