aboutsummaryrefslogtreecommitdiffstats
path: root/community
diff options
context:
space:
mode:
Diffstat (limited to 'community')
-rw-r--r--community/plasma-workspace/0001-shell-Add-support-to-wayland-primary-outputs.patch562
-rw-r--r--community/plasma-workspace/APKBUILD7
2 files changed, 567 insertions, 2 deletions
diff --git a/community/plasma-workspace/0001-shell-Add-support-to-wayland-primary-outputs.patch b/community/plasma-workspace/0001-shell-Add-support-to-wayland-primary-outputs.patch
new file mode 100644
index 0000000000..92a5dba900
--- /dev/null
+++ b/community/plasma-workspace/0001-shell-Add-support-to-wayland-primary-outputs.patch
@@ -0,0 +1,562 @@
+From 0f2be58f1408bff6d3cf3153d555f86b29e27ba2 Mon Sep 17 00:00:00 2001
+From: Aleix Pol <aleixpol@kde.org>
+Date: Thu, 28 Oct 2021 02:33:17 +0200
+Subject: [PATCH] shell: Add support to wayland primary outputs
+
+Refactors XRandr support together with the new Wayland code into a
+PrimaryOutputWatcher class.
+For X11 it listens to xcb events.
+For Wayland it uses the kde_output_management_v2 protocols.
+---
+ CMakeLists.txt | 2 +-
+ shell/CMakeLists.txt | 7 ++
+ shell/autotests/screenpooltest.cpp | 2 +-
+ shell/primaryoutputwatcher.cpp | 147 +++++++++++++++++++++++++++++
+ shell/primaryoutputwatcher.h | 54 +++++++++++
+ shell/screenpool.cpp | 49 +---------
+ shell/screenpool.h | 10 +-
+ shell/shellcorona.cpp | 23 ++---
+ shell/shellcorona.h | 4 +-
+ 9 files changed, 230 insertions(+), 68 deletions(-)
+ create mode 100644 shell/primaryoutputwatcher.cpp
+ create mode 100644 shell/primaryoutputwatcher.h
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 7c792f13f..e3488815a 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -124,7 +124,7 @@ endif()
+ find_package(QtWaylandScanner REQUIRED)
+ find_package(Qt5WaylandClient)
+ find_package(Qt5XkbCommonSupport)
+-find_package(PlasmaWaylandProtocols REQUIRED)
++find_package(PlasmaWaylandProtocols 1.5 REQUIRED)
+ find_package(Wayland REQUIRED COMPONENTS Client)
+
+ if(FONTCONFIG_FOUND)
+diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt
+index 31bfab573..94eec8706 100644
+--- a/shell/CMakeLists.txt
++++ b/shell/CMakeLists.txt
+@@ -32,6 +32,7 @@ set (plasma_shell_SRCS
+ panelview.cpp
+ panelconfigview.cpp
+ panelshadows.cpp
++ primaryoutputwatcher.cpp
+ shellcorona.cpp
+ standaloneappcorona.cpp
+ osd.cpp
+@@ -50,6 +51,11 @@ if (TARGET KUserFeedbackCore)
+ )
+ endif()
+
++ecm_add_qtwayland_client_protocol(plasma_shell_SRCS
++ PROTOCOL ${PLASMA_WAYLAND_PROTOCOLS_DIR}/kde-primary-output-v1.xml
++ BASENAME kde-primary-output-v1
++)
++
+ set(krunner_xml ${plasma-workspace_SOURCE_DIR}/krunner/dbus/org.kde.krunner.App.xml)
+ qt_add_dbus_interface(plasma_shell_SRCS ${krunner_xml} krunner_interface)
+
+@@ -79,6 +85,7 @@ target_link_libraries(plasmashell
+ KF5::WaylandClient
+ KF5::Notifications
+ PW::KWorkspace
++ Wayland::Client
+ )
+ if (TARGET KUserFeedbackCore)
+ target_link_libraries(plasmashell KUserFeedbackCore)
+diff --git a/shell/autotests/screenpooltest.cpp b/shell/autotests/screenpooltest.cpp
+index 39eeece24..a1d342452 100644
+--- a/shell/autotests/screenpooltest.cpp
++++ b/shell/autotests/screenpooltest.cpp
+@@ -37,7 +37,7 @@ void ScreenPoolTest::initTestCase()
+ cg.deleteGroup();
+ cg.sync();
+ m_screenPool = new ScreenPool(KSharedConfig::openConfig(), this);
+- m_screenPool->load();
++ m_screenPool->load(qGuiApp->primaryScreen());
+ }
+
+ void ScreenPoolTest::cleanupTestCase()
+diff --git a/shell/primaryoutputwatcher.cpp b/shell/primaryoutputwatcher.cpp
+new file mode 100644
+index 000000000..3539b5d90
+--- /dev/null
++++ b/shell/primaryoutputwatcher.cpp
+@@ -0,0 +1,147 @@
++/*
++ SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
++ SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
++
++ SPDX-License-Identifier: LGPL-2.0-or-later
++*/
++
++#include "primaryoutputwatcher.h"
++
++#include "debug.h"
++#include <KWindowSystem>
++#include <QGuiApplication>
++#include <QScreen>
++
++#include "qwayland-kde-primary-output-v1.h"
++#include <KWayland/Client/connection_thread.h>
++#include <KWayland/Client/registry.h>
++
++#include <config-plasma.h>
++#if HAVE_X11
++#include <QX11Info>
++#include <xcb/randr.h>
++#include <xcb/xcb.h>
++#include <xcb/xcb_event.h>
++#endif
++
++class WaylandPrimaryOutput : public QObject, public QtWayland::kde_primary_output_v1
++{
++ Q_OBJECT
++public:
++ WaylandPrimaryOutput(struct ::wl_registry *registry, int id, int version, QObject *parent)
++ : QObject(parent)
++ , QtWayland::kde_primary_output_v1(registry, id, version)
++ {
++ }
++
++ void kde_primary_output_v1_primary_output(const QString &outputName) override
++ {
++ Q_EMIT primaryOutputChanged(outputName);
++ }
++
++Q_SIGNALS:
++ void primaryOutputChanged(const QString &outputName);
++};
++
++PrimaryOutputWatcher::PrimaryOutputWatcher(QObject *parent)
++ : QObject(parent)
++{
++#if HAVE_X11
++ if (KWindowSystem::isPlatformX11()) {
++ m_primaryOutputName = qGuiApp->primaryScreen()->name();
++ qGuiApp->installNativeEventFilter(this);
++ const xcb_query_extension_reply_t *reply = xcb_get_extension_data(QX11Info::connection(), &xcb_randr_id);
++ m_xrandrExtensionOffset = reply->first_event;
++ }
++#endif
++ if (KWindowSystem::isPlatformWayland()) {
++ setupRegistry();
++ }
++}
++
++void PrimaryOutputWatcher::setPrimaryOutputName(const QString &newOutputName)
++{
++ if (newOutputName != m_primaryOutputName) {
++ m_primaryOutputName = newOutputName;
++ Q_EMIT primaryOutputNameChanged(newOutputName);
++ }
++}
++
++void PrimaryOutputWatcher::setupRegistry()
++{
++ auto m_connection = KWayland::Client::ConnectionThread::fromApplication(this);
++ if (!m_connection) {
++ return;
++ }
++
++ m_registry = new KWayland::Client::Registry(this);
++ connect(m_registry, &KWayland::Client::Registry::interfaceAnnounced, this, [this](const QByteArray &interface, quint32 name, quint32 version) {
++ if (interface == WaylandPrimaryOutput::interface()->name) {
++ auto m_outputManagement = new WaylandPrimaryOutput(m_registry->registry(), name, version, this);
++ connect(m_outputManagement, &WaylandPrimaryOutput::primaryOutputChanged, this, [this](const QString &outputName) {
++ m_primaryOutputWayland = outputName;
++
++ // Only set the outputName when there's a QScreen attached to it
++ if (screenForName(outputName)) {
++ setPrimaryOutputName(outputName);
++ }
++ });
++ }
++ });
++
++ // In case the outputName was received before Qt reported the screen
++ connect(qGuiApp, &QGuiApplication::screenAdded, this, [this](QScreen *screen) {
++ if (screen->name() == m_primaryOutputWayland) {
++ setPrimaryOutputName(m_primaryOutputWayland);
++ }
++ });
++
++ m_registry->create(m_connection);
++ m_registry->setup();
++}
++
++bool PrimaryOutputWatcher::nativeEventFilter(const QByteArray &eventType, void *message, long int *result)
++{
++ Q_UNUSED(result);
++#if HAVE_X11
++ // a particular edge case: when we switch the only enabled screen
++ // we don't have any signal about it, the primary screen changes but we have the same old QScreen* getting recycled
++ // see https://bugs.kde.org/show_bug.cgi?id=373880
++ // if this slot will be invoked many times, their//second time on will do nothing as name and primaryOutputName will be the same by then
++ if (eventType[0] != 'x') {
++ return false;
++ }
++
++ xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
++
++ const auto responseType = XCB_EVENT_RESPONSE_TYPE(ev);
++
++ if (responseType == m_xrandrExtensionOffset + XCB_RANDR_SCREEN_CHANGE_NOTIFY) {
++ setPrimaryOutputName(qGuiApp->primaryScreen()->name());
++ }
++#endif
++ return false;
++}
++
++QScreen *PrimaryOutputWatcher::screenForName(const QString &outputName) const
++{
++ const auto screens = qGuiApp->screens();
++ for (auto screen : screens) {
++ if (screen->name() == outputName) {
++ return screen;
++ }
++ }
++ return nullptr;
++}
++
++QScreen *PrimaryOutputWatcher::primaryScreen() const
++{
++ auto screen = screenForName(m_primaryOutputName);
++ if (!screen) {
++ qCWarning(PLASMASHELL) << "could not find primary screen" << m_primaryOutputName;
++ return qGuiApp->primaryScreen();
++ }
++ return screen;
++}
++
++#include "primaryoutputwatcher.moc"
+diff --git a/shell/primaryoutputwatcher.h b/shell/primaryoutputwatcher.h
+new file mode 100644
+index 000000000..f9b266d64
+--- /dev/null
++++ b/shell/primaryoutputwatcher.h
+@@ -0,0 +1,54 @@
++/*
++ SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
++
++ SPDX-License-Identifier: LGPL-2.0-or-later
++*/
++
++#ifndef PRIMARYOUTPUTWATCHER_H
++#define PRIMARYOUTPUTWATCHER_H
++
++#include <QAbstractNativeEventFilter>
++#include <QObject>
++
++namespace KWayland
++{
++namespace Client
++{
++class Registry;
++class ConnectionThread;
++}
++}
++
++class QScreen;
++
++class PrimaryOutputWatcher : public QObject, public QAbstractNativeEventFilter
++{
++ Q_OBJECT
++public:
++ PrimaryOutputWatcher(QObject *parent);
++ QScreen *primaryScreen() const;
++
++Q_SIGNALS:
++ void primaryOutputNameChanged(const QString &outputName);
++
++protected:
++ friend class WaylandOutputDevice;
++ void setPrimaryOutputName(const QString &outputName);
++
++private:
++ void setupRegistry();
++ bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
++ QScreen *screenForName(const QString &outputName) const;
++
++ // All
++ QString m_primaryOutputName;
++
++ // Wayland
++ KWayland::Client::Registry *m_registry = nullptr;
++ QString m_primaryOutputWayland;
++
++ // Xrandr
++ int m_xrandrExtensionOffset;
++};
++
++#endif // PRIMARYOUTPUTWATCHER_H
+diff --git a/shell/screenpool.cpp b/shell/screenpool.cpp
+index b41a2fd7f..cc3763a38 100644
+--- a/shell/screenpool.cpp
++++ b/shell/screenpool.cpp
+@@ -5,19 +5,11 @@
+ */
+
+ #include "screenpool.h"
+-#include <config-plasma.h>
+
+ #include <KWindowSystem>
+ #include <QGuiApplication>
+ #include <QScreen>
+
+-#if HAVE_X11
+-#include <QX11Info>
+-#include <xcb/randr.h>
+-#include <xcb/xcb.h>
+-#include <xcb/xcb_event.h>
+-#endif
+-
+ ScreenPool::ScreenPool(const KSharedConfig::Ptr &config, QObject *parent)
+ : QObject(parent)
+ , m_configGroup(KConfigGroup(config, QStringLiteral("ScreenConnectors")))
+@@ -26,23 +18,14 @@ ScreenPool::ScreenPool(const KSharedConfig::Ptr &config, QObject *parent)
+ connect(&m_configSaveTimer, &QTimer::timeout, this, [this]() {
+ m_configGroup.sync();
+ });
+-
+-#if HAVE_X11
+- if (KWindowSystem::isPlatformX11()) {
+- qApp->installNativeEventFilter(this);
+- const xcb_query_extension_reply_t *reply = xcb_get_extension_data(QX11Info::connection(), &xcb_randr_id);
+- m_xrandrExtensionOffset = reply->first_event;
+- }
+-#endif
+ }
+
+-void ScreenPool::load()
++void ScreenPool::load(QScreen *primary)
+ {
+ m_primaryConnector = QString();
+ m_connectorForId.clear();
+ m_idForConnector.clear();
+
+- QScreen *primary = qGuiApp->primaryScreen();
+ if (primary) {
+ m_primaryConnector = primary->name();
+ if (!m_primaryConnector.isEmpty()) {
+@@ -163,34 +146,4 @@ QList<int> ScreenPool::knownIds() const
+ return m_connectorForId.keys();
+ }
+
+-bool ScreenPool::nativeEventFilter(const QByteArray &eventType, void *message, long int *result)
+-{
+- Q_UNUSED(result);
+-#if HAVE_X11
+- // a particular edge case: when we switch the only enabled screen
+- // we don't have any signal about it, the primary screen changes but we have the same old QScreen* getting recycled
+- // see https://bugs.kde.org/show_bug.cgi?id=373880
+- // if this slot will be invoked many times, their//second time on will do nothing as name and primaryconnector will be the same by then
+- if (eventType[0] != 'x') {
+- return false;
+- }
+-
+- xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
+-
+- const auto responseType = XCB_EVENT_RESPONSE_TYPE(ev);
+-
+- if (responseType == m_xrandrExtensionOffset + XCB_RANDR_SCREEN_CHANGE_NOTIFY) {
+- if (qGuiApp->primaryScreen()->name() != primaryConnector()) {
+- // new screen?
+- if (id(qGuiApp->primaryScreen()->name()) < 0) {
+- insertScreenMapping(firstAvailableId(), qGuiApp->primaryScreen()->name());
+- }
+- // switch the primary screen in the pool
+- setPrimaryConnector(qGuiApp->primaryScreen()->name());
+- }
+- }
+-#endif
+- return false;
+-}
+-
+ #include "moc_screenpool.cpp"
+diff --git a/shell/screenpool.h b/shell/screenpool.h
+index 278821cc4..7a13e0bbd 100644
+--- a/shell/screenpool.h
++++ b/shell/screenpool.h
+@@ -15,13 +15,15 @@
+ #include <KConfigGroup>
+ #include <KSharedConfig>
+
+-class ScreenPool : public QObject, public QAbstractNativeEventFilter
++class QScreen;
++
++class ScreenPool : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ explicit ScreenPool(const KSharedConfig::Ptr &config, QObject *parent = nullptr);
+- void load();
++ void load(QScreen *primary);
+ ~ScreenPool() override;
+
+ QString primaryConnector() const;
+@@ -38,9 +40,6 @@ public:
+ // all ids that are known, included screens not enabled at the moment
+ QList<int> knownIds() const;
+
+-protected:
+- bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
+-
+ private:
+ void save();
+
+@@ -51,5 +50,4 @@ private:
+ QHash<QString, int> m_idForConnector;
+
+ QTimer m_configSaveTimer;
+- int m_xrandrExtensionOffset;
+ };
+diff --git a/shell/shellcorona.cpp b/shell/shellcorona.cpp
+index f31121137..1bb5583e8 100644
+--- a/shell/shellcorona.cpp
++++ b/shell/shellcorona.cpp
+@@ -58,6 +58,7 @@
+ #include "debug.h"
+ #include "futureutil.h"
+ #include "plasmashelladaptor.h"
++#include "primaryoutputwatcher.h"
+
+ #ifndef NDEBUG
+ #define CHECK_SCREEN_INVARIANTS screenInvariants();
+@@ -83,6 +84,7 @@ ShellCorona::ShellCorona(QObject *parent)
+ , m_waylandPlasmaShell(nullptr)
+ , m_closingDown(false)
+ , m_strutManager(new StrutManager(this))
++ , m_primaryWatcher(new PrimaryOutputWatcher(this))
+ {
+ setupWaylandIntegration();
+ qmlRegisterUncreatableType<DesktopView>("org.kde.plasma.shell", 2, 0, "Desktop", QStringLiteral("It is not possible to create objects of type Desktop"));
+@@ -631,7 +633,7 @@ void ShellCorona::load()
+
+ disconnect(m_activityController, &KActivities::Controller::serviceStatusChanged, this, &ShellCorona::load);
+
+- m_screenPool->load();
++ m_screenPool->load(m_primaryWatcher->primaryScreen());
+
+ // TODO: a kconf_update script is needed
+ QString configFileName(QStringLiteral("plasma-") + m_shell + QStringLiteral("-appletsrc"));
+@@ -685,8 +687,8 @@ void ShellCorona::load()
+ }
+ }
+ connect(qGuiApp, &QGuiApplication::screenAdded, this, &ShellCorona::addOutput, Qt::UniqueConnection);
+- connect(qGuiApp, &QGuiApplication::primaryScreenChanged, this, &ShellCorona::primaryOutputChanged, Qt::UniqueConnection);
+ connect(qGuiApp, &QGuiApplication::screenRemoved, this, &ShellCorona::handleScreenRemoved, Qt::UniqueConnection);
++ connect(m_primaryWatcher, &PrimaryOutputWatcher::primaryOutputNameChanged, this, &ShellCorona::primaryOutputNameChanged, Qt::UniqueConnection);
+
+ if (!m_waitingPanels.isEmpty()) {
+ m_waitingPanelsTimer.start();
+@@ -700,7 +702,7 @@ void ShellCorona::load()
+ }
+ }
+
+-void ShellCorona::primaryOutputChanged()
++void ShellCorona::primaryOutputNameChanged()
+ {
+ if (!m_desktopViewforId.contains(0)) {
+ return;
+@@ -712,12 +714,11 @@ void ShellCorona::primaryOutputChanged()
+ m_reconsiderOutputsTimer.start();
+
+ QScreen *oldPrimary = m_desktopViewforId.value(0)->screen();
+- QScreen *newPrimary = qGuiApp->primaryScreen();
++ QScreen *newPrimary = m_primaryWatcher->primaryScreen();
+ if (!newPrimary || newPrimary == oldPrimary || newPrimary->geometry().isNull()) {
+ return;
+ }
+
+- qWarning() << "Old primary output:" << oldPrimary << "New primary output:" << newPrimary;
+ const int oldIdOfPrimary = m_screenPool->id(newPrimary->name());
+ m_screenPool->setPrimaryConnector(newPrimary->name());
+ // swap order in m_desktopViewforId
+@@ -971,7 +972,7 @@ QRect ShellCorona::screenGeometry(int id) const
+ DesktopView *view = m_desktopViewforId.value(id);
+ if (!view) {
+ qWarning() << "requesting unexisting screen" << id;
+- QScreen *s = qGuiApp->primaryScreen();
++ QScreen *s = m_primaryWatcher->primaryScreen();
+ return s ? s->geometry() : QRect();
+ }
+ return view->geometry();
+@@ -988,7 +989,7 @@ QRegion ShellCorona::_availableScreenRegion(int id) const
+ if (!view) {
+ // each screen should have a view
+ qWarning() << "requesting unexisting screen" << id;
+- QScreen *s = qGuiApp->primaryScreen();
++ QScreen *s = m_primaryWatcher->primaryScreen();
+ return s ? s->availableGeometry() : QRegion();
+ }
+
+@@ -1013,7 +1014,7 @@ QRect ShellCorona::_availableScreenRect(int id) const
+ if (!view) {
+ // each screen should have a view
+ qWarning() << "requesting unexisting screen" << id;
+- QScreen *s = qGuiApp->primaryScreen();
++ QScreen *s = m_primaryWatcher->primaryScreen();
+ return s ? s->availableGeometry() : QRect();
+ }
+
+@@ -1161,7 +1162,7 @@ void ShellCorona::reconsiderOutputs()
+ addOutput(screen);
+ }
+ } else if (isOutputRedundant(screen)) {
+- qDebug() << "new redundant screen" << screen << "with primary screen" << qGuiApp->primaryScreen();
++ qDebug() << "new redundant screen" << screen << "with primary screen" << m_primaryWatcher->primaryScreen();
+
+ if (DesktopView *v = desktopForScreen(screen))
+ removeDesktop(v);
+@@ -1778,7 +1779,7 @@ Plasma::Containment *ShellCorona::addPanel(const QString &plugin)
+ }
+
+ // find out what screen this panel should go on
+- QScreen *wantedScreen = qGuiApp->focusWindow() ? qGuiApp->focusWindow()->screen() : qGuiApp->primaryScreen();
++ QScreen *wantedScreen = qGuiApp->focusWindow() ? qGuiApp->focusWindow()->screen() : m_primaryWatcher->primaryScreen();
+
+ QList<Plasma::Types::Location> availableLocations;
+ availableLocations << Plasma::Types::LeftEdge << Plasma::Types::TopEdge << Plasma::Types::RightEdge << Plasma::Types::BottomEdge;
+@@ -2131,7 +2132,7 @@ void ShellCorona::activateTaskManagerEntry(int index)
+ // which is activating a task on the task manager on a panel on the primary screen.
+
+ for (auto it = m_panelViews.constBegin(), end = m_panelViews.constEnd(); it != end; ++it) {
+- if (it.value()->screen() != qGuiApp->primaryScreen()) {
++ if (it.value()->screen() != m_primaryWatcher->primaryScreen()) {
+ continue;
+ }
+ if (activateTaskManagerEntryOnContainment(it.key(), index)) {
+diff --git a/shell/shellcorona.h b/shell/shellcorona.h
+index 18c0b5b3e..c3a2fe8de 100644
+--- a/shell/shellcorona.h
++++ b/shell/shellcorona.h
+@@ -25,6 +25,7 @@ class QMenu;
+ class QScreen;
+ class ScreenPool;
+ class StrutManager;
++class PrimaryOutputWatcher;
+
+ namespace KActivities
+ {
+@@ -201,7 +202,7 @@ private Q_SLOTS:
+ void populateAddPanelsMenu();
+
+ void addOutput(QScreen *screen);
+- void primaryOutputChanged();
++ void primaryOutputNameChanged();
+
+ void panelContainmentDestroyed(QObject *cont);
+ void handleScreenRemoved(QScreen *screen);
+@@ -252,4 +253,5 @@ private:
+ QString m_testModeLayout;
+
+ StrutManager *m_strutManager;
++ PrimaryOutputWatcher *const m_primaryWatcher;
+ };
+--
+GitLab
+
diff --git a/community/plasma-workspace/APKBUILD b/community/plasma-workspace/APKBUILD
index cd1ea15f3b..073e1cff6f 100644
--- a/community/plasma-workspace/APKBUILD
+++ b/community/plasma-workspace/APKBUILD
@@ -2,7 +2,7 @@
# Maintainer: Bart Ribbers <bribbers@disroot.org>
pkgname=plasma-workspace
pkgver=5.23.3
-pkgrel=0
+pkgrel=1
pkgdesc="KDE Plasma Workspace"
# armhf blocked by kirigami2
# s390x, mips64 and riscv64 blocked by polkit -> kio-extras
@@ -77,7 +77,9 @@ case "$pkgver" in
*.90*) _rel=unstable;;
*) _rel=stable;;
esac
-source="https://download.kde.org/$_rel/plasma/$pkgver/plasma-workspace-$pkgver.tar.xz"
+source="https://download.kde.org/$_rel/plasma/$pkgver/plasma-workspace-$pkgver.tar.xz
+ 0001-shell-Add-support-to-wayland-primary-outputs.patch
+ "
subpackages="$pkgname-dev $pkgname-libs $pkgname-doc $pkgname-lang"
replaces="plasma-desktop<5.22 breeze<5.22.90"
@@ -107,4 +109,5 @@ package() {
}
sha512sums="
34f8835d35063b582b12b343475474b2c7b338ecef148871f28348fe73f2b1ea36d938553c8e97fd108ce441cbb7c97b450590b186c788608c9cf29c82d8c786 plasma-workspace-5.23.3.tar.xz
+e0b86c1b64dfb3a228f6b42c163f3080365efd7ce10d1c3eb8e10f1ca5a93ba2239fb5ccf227f388846b3694fa862148056ac00407538df76237cb7478f4b615 0001-shell-Add-support-to-wayland-primary-outputs.patch
"