diff options
author | Bart Ribbers <bribbers@disroot.org> | 2021-11-16 13:00:58 +0100 |
---|---|---|
committer | Bart Ribbers <bribbers@disroot.org> | 2021-11-16 14:33:36 +0000 |
commit | 825b6b97fb672dc89732fc6d200bf5fe6c89ab0d (patch) | |
tree | 93701571ba40a35df2a5aebdf29d9b35fb10a230 | |
parent | 750ec588786b9a0398d43e68e46c680262c1dfe4 (diff) | |
download | aports-825b6b97fb672dc89732fc6d200bf5fe6c89ab0d.tar.gz aports-825b6b97fb672dc89732fc6d200bf5fe6c89ab0d.tar.bz2 aports-825b6b97fb672dc89732fc6d200bf5fe6c89ab0d.tar.xz |
community/plasma-workspace: add support for primary outputs
-rw-r--r-- | community/plasma-workspace/0001-shell-Add-support-to-wayland-primary-outputs.patch | 562 | ||||
-rw-r--r-- | community/plasma-workspace/APKBUILD | 7 |
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 00000000000..92a5dba900b --- /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 cd1ea15f3b9..073e1cff6fd 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 " |