This way, KWin can set the brightness on internal panels or external monitors with DDC/CI support, without being exposed to the mess that is actually directly setting the brightness. This also adds a capability flag for brightness control to the output management protocol. Powerdevil will expose a brightness slider for each output and change the brightness setting of the output accordingly. KWin in turn changes the brightness levels of the actual brightness device, or of a multiplier in compositing accordingly.wilder/Plasma/6.2
parent
7ad1303795
commit
faba2b6286
15 changed files with 365 additions and 1 deletions
@ -0,0 +1,36 @@ |
||||
/*
|
||||
KWin - the KDE window manager |
||||
This file is part of the KDE project. |
||||
|
||||
SPDX-FileCopyrightText: 2024 Xaver Hugl <xaver.hugl@gmail.com> |
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later |
||||
*/ |
||||
#include "brightnessdevice.h" |
||||
#include "output.h" |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
BrightnessDevice::BrightnessDevice() |
||||
{ |
||||
} |
||||
|
||||
BrightnessDevice::~BrightnessDevice() |
||||
{ |
||||
if (m_output) { |
||||
m_output->setBrightnessDevice(nullptr); |
||||
} |
||||
} |
||||
|
||||
void BrightnessDevice::setOutput(Output *output) |
||||
{ |
||||
m_output = output; |
||||
} |
||||
|
||||
Output *BrightnessDevice::output() const |
||||
{ |
||||
return m_output; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,35 @@ |
||||
/*
|
||||
KWin - the KDE window manager |
||||
This file is part of the KDE project. |
||||
|
||||
SPDX-FileCopyrightText: 2024 Xaver Hugl <xaver.hugl@gmail.com> |
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later |
||||
*/ |
||||
#pragma once |
||||
|
||||
#include <QByteArray> |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
class Output; |
||||
|
||||
class BrightnessDevice |
||||
{ |
||||
public: |
||||
explicit BrightnessDevice(); |
||||
virtual ~BrightnessDevice(); |
||||
|
||||
void setOutput(Output *output); |
||||
virtual void setBrightness(double brightness) = 0; |
||||
|
||||
Output *output() const; |
||||
virtual bool isInternal() const = 0; |
||||
virtual QByteArray edidBeginning() const = 0; |
||||
|
||||
private: |
||||
Output *m_output = nullptr; |
||||
}; |
||||
|
||||
} |
||||
@ -0,0 +1,111 @@ |
||||
/*
|
||||
SPDX-FileCopyrightText: 2024 Xaver Hugl <xaver.hugl@gmail.com> |
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL |
||||
*/ |
||||
#include "externalbrightness_v1.h" |
||||
#include "core/output.h" |
||||
#include "display.h" |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
static constexpr uint32_t s_version = 1; |
||||
|
||||
ExternalBrightnessV1::ExternalBrightnessV1(Display *display, QObject *parent) |
||||
: QObject(parent) |
||||
, QtWaylandServer::kde_external_brightness_v1(*display, s_version) |
||||
{ |
||||
} |
||||
|
||||
void ExternalBrightnessV1::kde_external_brightness_v1_destroy(Resource *resource) |
||||
{ |
||||
wl_resource_destroy(resource->handle); |
||||
} |
||||
|
||||
void ExternalBrightnessV1::kde_external_brightness_v1_create_brightness_control(Resource *resource, uint32_t id) |
||||
{ |
||||
new ExternalBrightnessDeviceV1(this, resource->client(), id, resource->version()); |
||||
} |
||||
|
||||
void ExternalBrightnessV1::addDevice(ExternalBrightnessDeviceV1 *device) |
||||
{ |
||||
m_devices.push_back(device); |
||||
Q_EMIT devicesChanged(); |
||||
} |
||||
|
||||
void ExternalBrightnessV1::removeDevice(ExternalBrightnessDeviceV1 *device) |
||||
{ |
||||
m_devices.removeOne(device); |
||||
Q_EMIT devicesChanged(); |
||||
} |
||||
|
||||
QList<BrightnessDevice *> ExternalBrightnessV1::devices() const |
||||
{ |
||||
return m_devices; |
||||
} |
||||
|
||||
ExternalBrightnessDeviceV1::ExternalBrightnessDeviceV1(ExternalBrightnessV1 *global, wl_client *client, uint32_t version, uint32_t id) |
||||
: QtWaylandServer::kde_external_brightness_device_v1(client, version, id) |
||||
, m_global(global) |
||||
{ |
||||
} |
||||
|
||||
ExternalBrightnessDeviceV1::~ExternalBrightnessDeviceV1() |
||||
{ |
||||
if (m_global) { |
||||
m_global->removeDevice(this); |
||||
} |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::setBrightness(double brightness) |
||||
{ |
||||
const uint32_t val = std::clamp<int64_t>(std::round(brightness * m_maxBrightness), 0, m_maxBrightness); |
||||
send_requested_brightness(val); |
||||
} |
||||
|
||||
bool ExternalBrightnessDeviceV1::isInternal() const |
||||
{ |
||||
return m_internal; |
||||
} |
||||
|
||||
QByteArray ExternalBrightnessDeviceV1::edidBeginning() const |
||||
{ |
||||
return m_edidBeginning; |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::kde_external_brightness_device_v1_destroy_resource(Resource *resource) |
||||
{ |
||||
delete this; |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::kde_external_brightness_device_v1_destroy(Resource *resource) |
||||
{ |
||||
wl_resource_destroy(resource->handle); |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::kde_external_brightness_device_v1_set_internal(Resource *resource, uint32_t internal) |
||||
{ |
||||
m_internal = internal == 1; |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::kde_external_brightness_device_v1_set_edid(Resource *resource, const QString &edid) |
||||
{ |
||||
m_edidBeginning = QByteArray::fromBase64(edid.toUtf8()); |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::kde_external_brightness_device_v1_set_max_brightness(Resource *resource, uint32_t value) |
||||
{ |
||||
m_maxBrightness = value; |
||||
} |
||||
|
||||
void ExternalBrightnessDeviceV1::kde_external_brightness_device_v1_commit(Resource *resource) |
||||
{ |
||||
if (!m_done) { |
||||
m_done = true; |
||||
if (m_global) { |
||||
m_global->addDevice(this); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,70 @@ |
||||
/*
|
||||
SPDX-FileCopyrightText: 2024 Xaver Hugl <xaver.hugl@gmail.com> |
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL |
||||
*/ |
||||
#pragma once |
||||
|
||||
#include "core/brightnessdevice.h" |
||||
|
||||
#include <QByteArray> |
||||
#include <QObject> |
||||
#include <QPointer> |
||||
#include <qwayland-server-kde-external-brightness-v1.h> |
||||
|
||||
namespace KWin |
||||
{ |
||||
|
||||
class Display; |
||||
class ExternalBrightnessDeviceV1; |
||||
class Output; |
||||
|
||||
class ExternalBrightnessV1 : public QObject, private QtWaylandServer::kde_external_brightness_v1 |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
explicit ExternalBrightnessV1(Display *display, QObject *parent); |
||||
|
||||
QList<BrightnessDevice *> devices() const; |
||||
|
||||
Q_SIGNALS: |
||||
void devicesChanged(); |
||||
|
||||
private: |
||||
void kde_external_brightness_v1_destroy(Resource *resource) override; |
||||
void kde_external_brightness_v1_create_brightness_control(Resource *resource, uint32_t id) override; |
||||
|
||||
void addDevice(ExternalBrightnessDeviceV1 *device); |
||||
void removeDevice(ExternalBrightnessDeviceV1 *device); |
||||
|
||||
friend class ExternalBrightnessDeviceV1; |
||||
QList<BrightnessDevice *> m_devices; |
||||
}; |
||||
|
||||
class ExternalBrightnessDeviceV1 : private QtWaylandServer::kde_external_brightness_device_v1, public BrightnessDevice |
||||
{ |
||||
public: |
||||
explicit ExternalBrightnessDeviceV1(ExternalBrightnessV1 *global, wl_client *client, uint32_t version, uint32_t id); |
||||
~ExternalBrightnessDeviceV1() override; |
||||
|
||||
void setBrightness(double brightness) override; |
||||
|
||||
bool isInternal() const override; |
||||
QByteArray edidBeginning() const override; |
||||
|
||||
private: |
||||
void kde_external_brightness_device_v1_destroy_resource(Resource *resource) override; |
||||
void kde_external_brightness_device_v1_destroy(Resource *resource) override; |
||||
void kde_external_brightness_device_v1_set_internal(Resource *resource, uint32_t internal) override; |
||||
void kde_external_brightness_device_v1_set_edid(Resource *resource, const QString &string) override; |
||||
void kde_external_brightness_device_v1_set_max_brightness(Resource *resource, uint32_t value) override; |
||||
void kde_external_brightness_device_v1_commit(Resource *resource) override; |
||||
|
||||
QPointer<ExternalBrightnessV1> m_global; |
||||
uint32_t m_maxBrightness = 1; |
||||
bool m_internal = false; |
||||
QByteArray m_edidBeginning; |
||||
bool m_done = false; |
||||
}; |
||||
|
||||
} |
||||
Loading…
Reference in new issue