summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-crash-on-screen-setup-change.patch')
-rw-r--r--kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-crash-on-screen-setup-change.patch109
1 files changed, 109 insertions, 0 deletions
diff --git a/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-crash-on-screen-setup-change.patch b/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-crash-on-screen-setup-change.patch
new file mode 100644
index 000000000000..4ddd9737e759
--- /dev/null
+++ b/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-crash-on-screen-setup-change.patch
@@ -0,0 +1,109 @@
+From 40364d2ee670a5a74318ef96c643762293ca95f0 Mon Sep 17 00:00:00 2001
+From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
+Date: Fri, 8 Apr 2022 12:44:33 +0300
+Subject: [PATCH] Simplify code that announces available modes and current mode
+
+If no mode has the current flag set, the first mode object will be
+announced twice.
+
+There's also no benefit from sending the current mode as last. If the
+current mode changes, the compositor will send the current_mode event,
+not the mode event.
+
+BUG: 452318
+
+
+(cherry picked from commit b40c4e3f4108b9a0be9b4f5d437e72f7c2aa3fea)
+---
+ src/server/outputdevice_v2_interface.cpp | 35 ++++++++----------------
+ 1 file changed, 11 insertions(+), 24 deletions(-)
+
+diff --git a/src/server/outputdevice_v2_interface.cpp b/src/server/outputdevice_v2_interface.cpp
+index 31ab16ca..9093bd2f 100644
+--- a/src/server/outputdevice_v2_interface.cpp
++++ b/src/server/outputdevice_v2_interface.cpp
+@@ -31,7 +31,7 @@ public:
+
+ void sendGeometry(Resource *resource);
+ wl_resource *sendNewMode(Resource *resource, OutputDeviceModeV2Interface *mode);
+- void sendCurrentMode(Resource *resource, OutputDeviceModeV2Interface *mode);
++ void sendCurrentMode(Resource *resource);
+ void sendDone(Resource *resource);
+ void sendUuid(Resource *resource);
+ void sendEdid(Resource *resource);
+@@ -180,7 +180,7 @@ void OutputDeviceV2Interface::setCurrentMode(OutputDeviceModeV2Interface *mode)
+ const auto clientResources = d->resourceMap();
+ for (auto it = clientResources.begin(); it != clientResources.end(); ++it) {
+ auto resource = *it;
+- d->sendCurrentMode(resource, d->currentMode);
++ d->sendCurrentMode(resource);
+ d->sendDone(resource);
+ }
+ d->updateGeometry();
+@@ -257,22 +257,10 @@ void OutputDeviceV2InterfacePrivate::kde_output_device_v2_bind_resource(Resource
+ sendName(resource);
+ sendSerialNumber(resource);
+
+- auto currentModeIt = modes.end();
+- for (auto it = modes.begin(); it != modes.end(); ++it) {
+- auto &mode = *it;
+- if (mode->flags().testFlag(OutputDeviceModeV2Interface::ModeFlag::Current)) {
+- // needs to be sent as last mode
+- currentModeIt = it;
+- continue;
+- }
++ for (OutputDeviceModeV2Interface *mode : std::as_const(modes)) {
+ sendNewMode(resource, mode);
+ }
+-
+- if (currentModeIt != modes.end()) {
+- auto modeResource = sendNewMode(resource, *currentModeIt);
+- send_current_mode(resource->handle, modeResource);
+- }
+-
++ sendCurrentMode(resource);
+ sendUuid(resource);
+ sendEdid(resource);
+ sendEnabled(resource);
+@@ -296,9 +284,9 @@ wl_resource *OutputDeviceV2InterfacePrivate::sendNewMode(Resource *resource, Out
+ return modeResource->handle;
+ }
+
+-void OutputDeviceV2InterfacePrivate::sendCurrentMode(Resource *outputResource, OutputDeviceModeV2Interface *mode)
++void OutputDeviceV2InterfacePrivate::sendCurrentMode(Resource *outputResource)
+ {
+- const auto modeResource = OutputDeviceModeV2InterfacePrivate::get(mode)->findResource(outputResource);
++ const auto modeResource = OutputDeviceModeV2InterfacePrivate::get(currentMode)->findResource(outputResource);
+ send_current_mode(outputResource->handle, modeResource->handle);
+ }
+
+@@ -506,12 +494,12 @@ void OutputDeviceV2Interface::setModes(const QList<OutputDeviceModeV2Interface *
+ d->modes << outputDeviceMode;
+ outputDeviceMode->setParent(this);
+
++ for (auto resource : clientResources) {
++ d->sendNewMode(resource, outputDeviceMode);
++ }
++
+ if (outputDeviceMode->flags().testFlag(OutputDeviceModeV2Interface::ModeFlag::Current)) {
+ d->currentMode = outputDeviceMode;
+- } else {
+- for (auto resource : clientResources) {
+- d->sendNewMode(resource, outputDeviceMode);
+- }
+ }
+ }
+
+@@ -520,8 +508,7 @@ void OutputDeviceV2Interface::setModes(const QList<OutputDeviceModeV2Interface *
+ }
+
+ for (auto resource : clientResources) {
+- d->sendNewMode(resource, d->currentMode);
+- d->sendCurrentMode(resource, d->currentMode);
++ d->sendCurrentMode(resource);
+ }
+
+ qDeleteAll(oldModes.crbegin(), oldModes.crend());
+--
+GitLab
+