File indexing completed on 2024-11-10 04:56:38

0001 /*
0002     SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "colormanager.h"
0008 #include "colordevice.h"
0009 #include "core/output.h"
0010 #include "core/session.h"
0011 #include "main.h"
0012 #include "utils/common.h"
0013 #include "workspace.h"
0014 
0015 namespace KWin
0016 {
0017 
0018 class ColorManagerPrivate
0019 {
0020 public:
0021     QList<ColorDevice *> devices;
0022 };
0023 
0024 ColorManager::ColorManager()
0025     : d(std::make_unique<ColorManagerPrivate>())
0026 {
0027     const QList<Output *> outputs = workspace()->outputs();
0028     for (Output *output : outputs) {
0029         handleOutputAdded(output);
0030     }
0031 
0032     connect(workspace(), &Workspace::outputAdded, this, &ColorManager::handleOutputAdded);
0033     connect(workspace(), &Workspace::outputRemoved, this, &ColorManager::handleOutputRemoved);
0034     connect(kwinApp()->session(), &Session::activeChanged, this, &ColorManager::handleSessionActiveChanged);
0035 }
0036 
0037 ColorManager::~ColorManager() = default;
0038 
0039 QList<ColorDevice *> ColorManager::devices() const
0040 {
0041     return d->devices;
0042 }
0043 
0044 ColorDevice *ColorManager::findDevice(Output *output) const
0045 {
0046     auto it = std::find_if(d->devices.begin(), d->devices.end(), [&output](ColorDevice *device) {
0047         return device->output() == output;
0048     });
0049     if (it != d->devices.end()) {
0050         return *it;
0051     }
0052     return nullptr;
0053 }
0054 
0055 void ColorManager::handleOutputAdded(Output *output)
0056 {
0057     ColorDevice *device = new ColorDevice(output, this);
0058     d->devices.append(device);
0059     Q_EMIT deviceAdded(device);
0060 }
0061 
0062 void ColorManager::handleOutputRemoved(Output *output)
0063 {
0064     auto it = std::find_if(d->devices.begin(), d->devices.end(), [&output](ColorDevice *device) {
0065         return device->output() == output;
0066     });
0067     if (it == d->devices.end()) {
0068         qCWarning(KWIN_CORE) << "Could not find any color device for output" << output;
0069         return;
0070     }
0071     ColorDevice *device = *it;
0072     d->devices.erase(it);
0073     Q_EMIT deviceRemoved(device);
0074     delete device;
0075 }
0076 
0077 void ColorManager::handleSessionActiveChanged(bool active)
0078 {
0079     if (!active) {
0080         return;
0081     }
0082     for (ColorDevice *device : std::as_const(d->devices)) {
0083         device->scheduleUpdate();
0084     }
0085 }
0086 
0087 } // namespace KWin
0088 
0089 #include "moc_colormanager.cpp"