18#include "qwayland-server-kde-output-management-v2.h"
26static const quint32 s_version = 7;
46 QList<std::pair<uint32_t, OutputDeviceV2Interface *>>
outputOrder;
72 : QtWaylandServer::kde_output_management_v2(*display, s_version)
78 wl_resource *config_resource = wl_resource_create(resource->client(), &kde_output_configuration_v2_interface, resource->version(),
id);
79 if (!config_resource) {
80 wl_client_post_no_memory(resource->client());
95 : QtWaylandServer::kde_output_configuration_v2(resource)
97 const auto reject = [
this](
Output *output) {
121 if (output && mode) {
133 auto toTransform = [transform]() {
135 case WL_OUTPUT_TRANSFORM_90:
137 case WL_OUTPUT_TRANSFORM_180:
139 case WL_OUTPUT_TRANSFORM_270:
141 case WL_OUTPUT_TRANSFORM_FLIPPED:
143 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
145 case WL_OUTPUT_TRANSFORM_FLIPPED_180:
147 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
149 case WL_OUTPUT_TRANSFORM_NORMAL:
154 auto _transform = toTransform();
157 changeset->transform = changeset->manualTransform = _transform;
176 qreal doubleScale = wl_fixed_to_double(scale);
181 doubleScale = std::round(doubleScale * 120) / 120;
183 if (doubleScale <= 0) {
184 qCWarning(KWIN_CORE) <<
"Requested to scale output device to" << doubleScale <<
", but I can't do that.";
198 if (overscan > 100) {
199 qCWarning(KWIN_CORE) <<
"Invalid overscan requested:" << overscan;
213 qCWarning(KWIN_CORE) <<
"Invalid Vrr Policy requested:" << policy;
227 qCWarning(KWIN_CORE) <<
"Invalid Rgb Range requested:" << rgbRange;
246 outputOrder.push_back(std::make_pair(priority, output));
256 config.
changeSet(output->handle())->highDynamicRange = enable_hdr == 1;
297 set->iccProfilePath = profile_path;
308 config.
changeSet(output->handle())->maxPeakBrightnessOverride = max_peak_brightness == -1 ? std::nullopt : std::optional<double>(max_peak_brightness);
309 config.
changeSet(output->handle())->maxAverageBrightnessOverride = max_average_brightness == -1 ? std::nullopt : std::optional<double>(max_average_brightness);
310 config.
changeSet(output->handle())->minBrightnessOverride = min_brightness == -1 ? std::nullopt : std::optional<double>(min_brightness / 10'000.0);
320 config.
changeSet(output->handle())->sdrGamutWideness = gamut_wideness / 10'000.0;
326 wl_resource_destroy(resource->handle);
337 wl_resource_post_error(resource->handle, error_already_applied,
"an output configuration can be applied only once");
343 qCWarning(KWIN_CORE) <<
"Rejecting configuration change because a request output is no longer available";
348 const auto allOutputs = kwinApp()->outputBackend()->outputs();
349 const bool allDisabled = !std::any_of(allOutputs.begin(), allOutputs.end(), [
this](
const auto &output) {
350 const auto changeset = config.constChangeSet(output);
351 if (changeset && changeset->enabled.has_value()) {
352 return *changeset->enabled;
354 return output->isEnabled();
358 qCWarning(KWIN_CORE) <<
"Disabling all outputs through configuration changes is not allowed";
363 QList<Output *> sortedOrder;
364 if (!outputOrder.empty()) {
365 const int desktopOutputs = std::count_if(allOutputs.begin(), allOutputs.end(), [](Output *output) {
366 return !output->isNonDesktop();
368 if (outputOrder.size() != desktopOutputs) {
369 qWarning(KWIN_CORE) <<
"Provided output order doesn't contain all outputs!";
373 outputOrder.erase(std::remove_if(outputOrder.begin(), outputOrder.end(), [
this](
const auto &pair) {
374 const auto changeset = config.constChangeSet(pair.second->handle());
375 if (changeset && changeset->enabled.has_value()) {
376 return !changeset->enabled.value();
378 return !pair.second->handle()->isEnabled();
382 std::sort(outputOrder.begin(), outputOrder.end(), [](
const auto &pair1,
const auto &pair2) {
383 return pair1.first < pair2.first;
386 for (
const auto &[index, name] : std::as_const(outputOrder)) {
388 qCWarning(KWIN_CORE) <<
"Provided output order is invalid!";
394 sortedOrder.reserve(outputOrder.size());
395 std::transform(outputOrder.begin(), outputOrder.end(), std::back_inserter(sortedOrder), [](
const auto &pair) {
396 return pair.second->handle();
399 if (
workspace()->applyOutputConfiguration(config, sortedOrder)) {
402 qCDebug(KWIN_CORE) <<
"Applying config failed";
408#include "outputmanagement_v2.moc"
410#include "moc_outputmanagement_v2.cpp"
Class holding the Wayland server display loop.
static std::unique_ptr< IccProfile > load(const QString &path)
std::shared_ptr< OutputChangeSet > changeSet(Output *output)
void kde_output_configuration_v2_mode(Resource *resource, struct ::wl_resource *outputdevice, struct ::wl_resource *mode) override
void kde_output_configuration_v2_set_wide_color_gamut(Resource *resource, wl_resource *outputdevice, uint32_t enable_wcg) override
void kde_output_configuration_v2_destroy_resource(Resource *resource) override
void kde_output_configuration_v2_position(Resource *resource, wl_resource *outputdevice, int32_t x, int32_t y) override
void kde_output_configuration_v2_destroy(Resource *resource) override
void kde_output_configuration_v2_overscan(Resource *resource, wl_resource *outputdevice, uint32_t overscan) override
void kde_output_configuration_v2_scale(Resource *resource, wl_resource *outputdevice, wl_fixed_t scale) override
void kde_output_configuration_v2_set_sdr_gamut_wideness(Resource *resource, wl_resource *outputdevice, uint32_t gamut_wideness) override
void kde_output_configuration_v2_set_sdr_brightness(Resource *resource, wl_resource *outputdevice, uint32_t sdr_brightness) override
void kde_output_configuration_v2_set_auto_rotate_policy(Resource *resource, wl_resource *outputdevice, uint32_t auto_rotation_policy) override
void kde_output_configuration_v2_set_priority(Resource *resource, wl_resource *output, uint32_t priority) override
void kde_output_configuration_v2_set_primary_output(Resource *resource, struct ::wl_resource *output) override
void kde_output_configuration_v2_transform(Resource *resource, wl_resource *outputdevice, int32_t transform) override
OutputConfigurationV2Interface(wl_resource *resource)
void kde_output_configuration_v2_set_brightness_overrides(Resource *resource, wl_resource *outputdevice, int32_t max_peak_brightness, int32_t max_average_brightness, int32_t min_brightness) override
void kde_output_configuration_v2_apply(Resource *resource) override
void kde_output_configuration_v2_set_vrr_policy(Resource *resource, struct ::wl_resource *outputdevice, uint32_t policy) override
void kde_output_configuration_v2_set_icc_profile_path(Resource *resource, wl_resource *outputdevice, const QString &profile_path) override
void kde_output_configuration_v2_set_high_dynamic_range(Resource *resource, wl_resource *outputdevice, uint32_t enable_hdr) override
void kde_output_configuration_v2_set_rgb_range(Resource *resource, wl_resource *outputdevice, uint32_t rgbRange) override
OutputConfiguration config
void kde_output_configuration_v2_enable(Resource *resource, wl_resource *outputdevice, int32_t enable) override
QList< std::pair< uint32_t, OutputDeviceV2Interface * > > outputOrder
std::weak_ptr< OutputMode > handle() const
static OutputDeviceModeV2Interface * get(wl_resource *native)
static OutputDeviceV2Interface * get(wl_resource *native)
OutputManagementV2Interface(Display *display, QObject *parent=nullptr)
~OutputManagementV2Interface() override
OutputManagementV2InterfacePrivate(Display *display)
void kde_output_management_v2_create_configuration(Resource *resource, uint32_t id) override
void outputAdded(KWin::Output *)
void outputRemoved(KWin::Output *)