From b325555e184021eb6e273971b614b586f865deab Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Sat, 10 Aug 2024 15:42:43 +0200 Subject: [PATCH] workspace: unset brightness devices on outputs that didn't get one assigned Otherwise, two outputs might end up having the same brightness device --- src/core/output.cpp | 9 --------- src/workspace.cpp | 25 +++++++++++++++++++------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/core/output.cpp b/src/core/output.cpp index 3dd630c962..55435c75f9 100644 --- a/src/core/output.cpp +++ b/src/core/output.cpp @@ -792,16 +792,7 @@ BrightnessDevice *Output::brightnessDevice() const void Output::setBrightnessDevice(BrightnessDevice *device) { - if (m_brightnessDevice == device) { - return; - } - if (m_brightnessDevice) { - m_brightnessDevice->setOutput(nullptr); - } m_brightnessDevice = device; - if (device) { - device->setOutput(this); - } } } // namespace KWin diff --git a/src/workspace.cpp b/src/workspace.cpp index 02d6b48194..55cab4044e 100644 --- a/src/workspace.cpp +++ b/src/workspace.cpp @@ -1368,17 +1368,30 @@ void Workspace::assignBrightnessDevices() const auto devices = waylandServer()->externalBrightness()->devices(); for (BrightnessDevice *device : devices) { // assign the device to the most fitting output - for (auto it = candidates.begin(); it != candidates.end(); it++) { - Output *output = *it; + const auto it = std::ranges::find_if(candidates, [device](Output *output) { if (output->isInternal() != device->isInternal()) { - continue; + return false; } - if (!output->isInternal() && (!output->edid().isValid() || device->edidBeginning().isEmpty() || !output->edid().raw().startsWith(device->edidBeginning()))) { - continue; + if (output->isInternal()) { + return true; + } else { + return output->edid().isValid() && !device->edidBeginning().isEmpty() && output->edid().raw().startsWith(device->edidBeginning()); + } + }); + Output *const oldOutput = device->output(); + if (it != candidates.end()) { + Output *const output = *it; + if (oldOutput && oldOutput != output) { + oldOutput->setBrightnessDevice(nullptr); } output->setBrightnessDevice(device); + device->setOutput(output); candidates.erase(it); - break; + } else if (oldOutput) { + device->setOutput(nullptr); + if (oldOutput->brightnessDevice() == device) { + oldOutput->setBrightnessDevice(nullptr); + } } } }