20#include "qwayland-server-kde-output-device-v2.h"
25static const quint32 s_version = 6;
27static QtWaylandServer::kde_output_device_v2::transform kwinTransformToOutputDeviceTransform(OutputTransform transform)
29 return static_cast<QtWaylandServer::kde_output_device_v2::transform
>(transform.kind());
32static QtWaylandServer::kde_output_device_v2::subpixel kwinSubPixelToOutputDeviceSubPixel(
Output::SubPixel subPixel)
34 return static_cast<QtWaylandServer::kde_output_device_v2::subpixel
>(subPixel);
37static uint32_t kwinCapabilitiesToOutputDeviceCapabilities(Output::Capabilities caps)
41 ret |= QtWaylandServer::kde_output_device_v2::capability_overscan;
44 ret |= QtWaylandServer::kde_output_device_v2::capability_vrr;
47 ret |= QtWaylandServer::kde_output_device_v2::capability_rgb_range;
50 ret |= QtWaylandServer::kde_output_device_v2::capability_high_dynamic_range;
53 ret |= QtWaylandServer::kde_output_device_v2::capability_wide_color_gamut;
56 ret |= QtWaylandServer::kde_output_device_v2::capability_auto_rotate;
59 ret |= QtWaylandServer::kde_output_device_v2::capability_icc_profile;
64static QtWaylandServer::kde_output_device_v2::vrr_policy kwinVrrPolicyToOutputDeviceVrrPolicy(
VrrPolicy policy)
66 return static_cast<QtWaylandServer::kde_output_device_v2::vrr_policy
>(policy);
69static QtWaylandServer::kde_output_device_v2::rgb_range kwinRgbRangeToOutputDeviceRgbRange(
Output::RgbRange range)
71 return static_cast<QtWaylandServer::kde_output_device_v2::rgb_range
>(range);
74static QtWaylandServer::kde_output_device_v2::auto_rotate_policy kwinAutoRotationToOutputDeviceAutoRotation(
Output::AutoRotationPolicy policy)
76 return static_cast<QtWaylandServer::kde_output_device_v2::auto_rotate_policy
>(policy);
134 auto_rotate_policy
m_autoRotation = auto_rotate_policy::auto_rotate_policy_in_tablet_mode;
154 OutputDeviceV2InterfacePrivate::Resource *
output;
160 Resource *
createResource(OutputDeviceV2InterfacePrivate::Resource *output);
161 Resource *
findResource(OutputDeviceV2InterfacePrivate::Resource *output)
const;
167 return mode->d.get();
181 : QtWaylandServer::kde_output_device_v2(*display, s_version)
203 updateManufacturer();
207 updatePhysicalSize();
208 updateGlobalPosition();
212 updateSerialNumber();
215 updateCapabilities();
220 updateHighDynamicRange();
221 updateSdrBrightness();
222 updateWideColorGamut();
224 updateIccProfilePath();
225 updateBrightnessMetadata();
226 updateBrightnessOverrides();
227 updateSdrGamutWideness();
230 this, &OutputDeviceV2Interface::updateGlobalPosition);
232 this, &OutputDeviceV2Interface::updateScale);
234 this, &OutputDeviceV2Interface::updateEnabled);
236 this, &OutputDeviceV2Interface::updateTransform);
238 this, &OutputDeviceV2Interface::updateCurrentMode);
240 this, &OutputDeviceV2Interface::updateCapabilities);
242 this, &OutputDeviceV2Interface::updateOverscan);
244 this, &OutputDeviceV2Interface::updateVrrPolicy);
246 this, &OutputDeviceV2Interface::updateModes);
248 this, &OutputDeviceV2Interface::updateRgbRange);
266 if (d->isGlobalRemoved()) {
322 const auto modeResource = privateMode->createResource(resource);
324 send_mode(resource->handle, modeResource->handle);
326 privateMode->bindResource(modeResource->handle);
328 return modeResource->handle;
334 send_current_mode(outputResource->handle, modeResource->handle);
339 send_geometry(resource->handle,
352 send_scale(resource->handle, wl_fixed_from_double(
m_scale));
362 send_eisa_id(resource->handle,
m_eisaId);
367 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_NAME_SINCE_VERSION) {
368 send_name(resource->handle,
m_name);
374 send_done(resource->handle);
379 send_edid(resource->handle, QString::fromStdString(
m_edid.toBase64().toStdString()));
384 send_enabled(resource->handle,
m_enabled);
389 send_uuid(resource->handle,
m_uuid.toString(QUuid::WithoutBraces));
414 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_HIGH_DYNAMIC_RANGE_SINCE_VERSION) {
421 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_SDR_BRIGHTNESS_SINCE_VERSION) {
428 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_WIDE_COLOR_GAMUT_SINCE_VERSION) {
435 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_AUTO_ROTATE_POLICY_SINCE_VERSION) {
442 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_ICC_PROFILE_PATH_SINCE_VERSION) {
449 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_BRIGHTNESS_METADATA_SINCE_VERSION) {
456 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_BRIGHTNESS_OVERRIDES_SINCE_VERSION) {
463 if (resource->version() >= KDE_OUTPUT_DEVICE_V2_SDR_GAMUT_WIDENESS_SINCE_VERSION) {
464 send_sdr_gamut_wideness(resource->handle, std::clamp<uint32_t>(
m_sdrGamutWideness * 10'000, 0, 10'000));
468void OutputDeviceV2Interface::updateGeometry()
470 const auto clientResources = d->resourceMap();
471 for (
const auto &resource : clientResources) {
472 d->sendGeometry(resource);
473 d->sendDone(resource);
477void OutputDeviceV2Interface::updatePhysicalSize()
479 d->m_physicalSize = d->m_handle->physicalSize();
482void OutputDeviceV2Interface::updateGlobalPosition()
484 const QPoint arg = d->m_handle->geometry().topLeft();
485 if (d->m_globalPosition == arg) {
488 d->m_globalPosition = arg;
492void OutputDeviceV2Interface::updateManufacturer()
494 d->m_manufacturer = d->m_handle->manufacturer();
497void OutputDeviceV2Interface::updateModel()
499 d->m_model = d->m_handle->model();
502void OutputDeviceV2Interface::updateSerialNumber()
504 d->m_serialNumber = d->m_handle->serialNumber();
507void OutputDeviceV2Interface::updateEisaId()
509 d->m_eisaId = d->m_handle->eisaId();
512void OutputDeviceV2Interface::updateName()
514 d->m_name = d->m_handle->name();
517void OutputDeviceV2Interface::updateSubPixel()
519 const auto arg = kwinSubPixelToOutputDeviceSubPixel(d->m_handle->subPixel());
520 if (d->m_subPixel != arg) {
526void OutputDeviceV2Interface::updateTransform()
528 const auto arg = kwinTransformToOutputDeviceTransform(d->m_handle->transform());
529 if (d->m_transform != arg) {
530 d->m_transform = arg;
535void OutputDeviceV2Interface::updateScale()
537 const qreal scale = d->m_handle->scale();
538 if (qFuzzyCompare(d->m_scale, scale)) {
542 const auto clientResources = d->resourceMap();
543 for (
const auto &resource : clientResources) {
544 d->sendScale(resource);
545 d->sendDone(resource);
549void OutputDeviceV2Interface::updateModes()
551 const auto oldModes = d->m_modes;
553 d->m_currentMode =
nullptr;
555 const auto clientResources = d->resourceMap();
556 const auto nativeModes = d->m_handle->modes();
558 for (
const std::shared_ptr<OutputMode> &mode : nativeModes) {
559 OutputDeviceModeV2Interface *deviceMode =
new OutputDeviceModeV2Interface(mode,
this);
560 d->m_modes.append(deviceMode);
562 if (d->m_handle->currentMode() == mode) {
563 d->m_currentMode = deviceMode;
566 for (
auto resource : clientResources) {
567 d->sendNewMode(resource, deviceMode);
571 for (
auto resource : clientResources) {
572 d->sendCurrentMode(resource);
575 qDeleteAll(oldModes.crbegin(), oldModes.crend());
577 for (
auto resource : clientResources) {
578 d->sendDone(resource);
582void OutputDeviceV2Interface::updateCurrentMode()
584 for (OutputDeviceModeV2Interface *mode : std::as_const(d->m_modes)) {
585 if (mode->handle().lock() == d->m_handle->currentMode()) {
586 if (d->m_currentMode != mode) {
587 d->m_currentMode = mode;
588 const auto clientResources = d->resourceMap();
589 for (
auto resource : clientResources) {
590 d->sendCurrentMode(resource);
591 d->sendDone(resource);
600void OutputDeviceV2Interface::updateEdid()
602 d->m_edid = d->m_handle->edid().raw();
603 const auto clientResources = d->resourceMap();
604 for (
const auto &resource : clientResources) {
605 d->sendEdid(resource);
606 d->sendDone(resource);
610void OutputDeviceV2Interface::updateEnabled()
612 bool enabled = d->m_handle->isEnabled();
613 if (d->m_enabled != enabled) {
614 d->m_enabled = enabled;
615 const auto clientResources = d->resourceMap();
616 for (
const auto &resource : clientResources) {
617 d->sendEnabled(resource);
618 d->sendDone(resource);
623void OutputDeviceV2Interface::updateUuid()
625 const QUuid uuid = d->m_handle->uuid();
626 if (d->m_uuid != uuid) {
628 const auto clientResources = d->resourceMap();
629 for (
const auto &resource : clientResources) {
630 d->sendUuid(resource);
631 d->sendDone(resource);
636void OutputDeviceV2Interface::updateCapabilities()
638 const uint32_t cap = kwinCapabilitiesToOutputDeviceCapabilities(d->m_handle->capabilities());
639 if (d->m_capabilities != cap) {
640 d->m_capabilities = cap;
641 const auto clientResources = d->resourceMap();
642 for (
const auto &resource : clientResources) {
643 d->sendCapabilities(resource);
644 d->sendDone(resource);
649void OutputDeviceV2Interface::updateOverscan()
651 const uint32_t overscan = d->m_handle->overscan();
652 if (d->m_overscan != overscan) {
653 d->m_overscan = overscan;
654 const auto clientResources = d->resourceMap();
655 for (
const auto &resource : clientResources) {
656 d->sendOverscan(resource);
657 d->sendDone(resource);
662void OutputDeviceV2Interface::updateVrrPolicy()
664 const auto policy = kwinVrrPolicyToOutputDeviceVrrPolicy(d->m_handle->vrrPolicy());
665 if (d->m_vrrPolicy != policy) {
666 d->m_vrrPolicy = policy;
667 const auto clientResources = d->resourceMap();
668 for (
const auto &resource : clientResources) {
669 d->sendVrrPolicy(resource);
670 d->sendDone(resource);
675void OutputDeviceV2Interface::updateRgbRange()
677 const auto rgbRange = kwinRgbRangeToOutputDeviceRgbRange(d->m_handle->rgbRange());
678 if (d->m_rgbRange != rgbRange) {
679 d->m_rgbRange = rgbRange;
680 const auto clientResources = d->resourceMap();
681 for (
const auto &resource : clientResources) {
682 d->sendRgbRange(resource);
683 d->sendDone(resource);
688void OutputDeviceV2Interface::updateHighDynamicRange()
690 if (d->m_highDynamicRange != d->m_handle->highDynamicRange()) {
691 d->m_highDynamicRange = d->m_handle->highDynamicRange();
692 const auto clientResources = d->resourceMap();
693 for (
const auto &resource : clientResources) {
694 d->sendHighDynamicRange(resource);
695 d->sendDone(resource);
700void OutputDeviceV2Interface::updateSdrBrightness()
702 if (d->m_sdrBrightness != d->m_handle->sdrBrightness()) {
703 d->m_sdrBrightness = d->m_handle->sdrBrightness();
704 const auto clientResources = d->resourceMap();
705 for (
const auto &resource : clientResources) {
706 d->sendSdrBrightness(resource);
707 d->sendDone(resource);
712void OutputDeviceV2Interface::updateWideColorGamut()
714 if (d->m_wideColorGamut != d->m_handle->wideColorGamut()) {
715 d->m_wideColorGamut = d->m_handle->wideColorGamut();
716 const auto clientResources = d->resourceMap();
717 for (
const auto &resource : clientResources) {
718 d->sendWideColorGamut(resource);
719 d->sendDone(resource);
724void OutputDeviceV2Interface::updateAutoRotate()
726 const auto policy = kwinAutoRotationToOutputDeviceAutoRotation(d->m_handle->autoRotationPolicy());
727 if (d->m_autoRotation != policy) {
728 d->m_autoRotation = policy;
729 const auto clientResources = d->resourceMap();
730 for (
const auto &resource : clientResources) {
731 d->sendAutoRotationPolicy(resource);
732 d->sendDone(resource);
737void OutputDeviceV2Interface::updateIccProfilePath()
739 if (d->m_iccProfilePath != d->m_handle->iccProfilePath()) {
740 d->m_iccProfilePath = d->m_handle->iccProfilePath();
741 const auto clientResources = d->resourceMap();
742 for (
const auto &resource : clientResources) {
743 d->sendIccProfilePath(resource);
744 d->sendDone(resource);
749void OutputDeviceV2Interface::updateBrightnessMetadata()
751 if (d->m_maxPeakBrightness != d->m_handle->maxPeakBrightness() || d->m_maxAverageBrightness != d->m_handle->maxAverageBrightness() || d->m_minBrightness != d->m_handle->minBrightness()) {
752 d->m_maxPeakBrightness = d->m_handle->maxPeakBrightness();
753 d->m_maxAverageBrightness = d->m_handle->maxAverageBrightness();
754 d->m_minBrightness = d->m_handle->minBrightness();
755 const auto clientResources = d->resourceMap();
756 for (
const auto &resource : clientResources) {
757 d->sendBrightnessMetadata(resource);
758 d->sendDone(resource);
763void OutputDeviceV2Interface::updateBrightnessOverrides()
765 if (d->m_maxPeakBrightnessOverride != d->m_handle->maxPeakBrightnessOverride() || d->m_maxAverageBrightnessOverride != d->m_handle->maxAverageBrightnessOverride() || d->m_minBrightnessOverride != d->m_handle->minBrightnessOverride()) {
766 d->m_maxPeakBrightnessOverride = d->m_handle->maxPeakBrightnessOverride();
767 d->m_maxAverageBrightnessOverride = d->m_handle->maxAverageBrightnessOverride();
768 d->m_minBrightnessOverride = d->m_handle->minBrightnessOverride();
769 const auto clientResources = d->resourceMap();
770 for (
const auto &resource : clientResources) {
771 d->sendBrightnessOverrides(resource);
772 d->sendDone(resource);
777void OutputDeviceV2Interface::updateSdrGamutWideness()
779 if (d->m_sdrGamutWideness != d->m_handle->sdrGamutWideness()) {
780 d->m_sdrGamutWideness = d->m_handle->sdrGamutWideness();
781 const auto clientResources = d->resourceMap();
782 for (
const auto &resource : clientResources) {
783 d->sendSdrGamutWideness(resource);
784 d->sendDone(resource);
791 if (
auto devicePrivate = resource_cast<OutputDeviceV2InterfacePrivate *>(native); devicePrivate && !devicePrivate->isGlobalRemoved()) {
792 return devicePrivate->q;
798 : QtWaylandServer::kde_output_device_mode_v2()
801 , m_size(handle->size())
802 , m_refreshRate(handle->refreshRate())
803 , m_preferred(handle->flags() &
OutputMode::Flag::Preferred)
817 const auto map = resourceMap();
818 for (Resource *resource : map) {
819 send_removed(resource->handle);
825 const auto modeResource =
static_cast<ModeResource *
>(add(output->client(), output->version()));
826 modeResource->
output = output;
832 const auto resources = resourceMap();
833 for (
const auto &resource : resources) {
834 auto modeResource =
static_cast<ModeResource *
>(resource);
835 if (modeResource->output == output) {
858 send_preferred(resource);
864 if (
auto devicePrivate = resource_cast<OutputDeviceModeV2InterfacePrivate *>(native)) {
865 return devicePrivate->q;
872#include "moc_outputdevice_v2.cpp"
Class holding the Wayland server display loop.
static DisplayPrivate * get(Display *display)
QList< OutputDeviceV2Interface * > outputdevicesV2
OutputDeviceModeV2Interface(std::shared_ptr< OutputMode > handle, QObject *parent=nullptr)
std::weak_ptr< OutputMode > handle() const
~OutputDeviceModeV2Interface() override
static OutputDeviceModeV2Interface * get(wl_resource *native)
static OutputDeviceModeV2InterfacePrivate * get(OutputDeviceModeV2Interface *mode)
Resource * findResource(OutputDeviceV2InterfacePrivate::Resource *output) const
Resource * createResource(OutputDeviceV2InterfacePrivate::Resource *output)
std::weak_ptr< OutputMode > m_handle
~OutputDeviceModeV2InterfacePrivate() override
OutputDeviceModeV2Interface * q
Resource * kde_output_device_mode_v2_allocate() override
OutputDeviceModeV2InterfacePrivate(OutputDeviceModeV2Interface *q, std::shared_ptr< OutputMode > handle)
void bindResource(wl_resource *resource)
~OutputDeviceV2Interface() override
static OutputDeviceV2Interface * get(wl_resource *native)
OutputDeviceV2Interface(Display *display, Output *handle, QObject *parent=nullptr)
void sendEisaId(Resource *resource)
std::optional< double > m_minBrightnessOverride
void sendIccProfilePath(Resource *resource)
void sendScale(Resource *resource)
void sendHighDynamicRange(Resource *resource)
std::optional< double > m_maxPeakBrightness
void sendName(Resource *resource)
void kde_output_device_v2_destroy_global() override
void sendSerialNumber(Resource *resource)
void sendAutoRotationPolicy(Resource *resource)
void sendCurrentMode(Resource *resource)
void sendOverscan(Resource *resource)
void sendEnabled(Resource *resource)
QPointer< Display > m_display
OutputDeviceV2InterfacePrivate(OutputDeviceV2Interface *q, Display *display, Output *handle)
wl_resource * sendNewMode(Resource *resource, OutputDeviceModeV2Interface *mode)
std::optional< double > m_maxAverageBrightnessOverride
~OutputDeviceV2InterfacePrivate() override
void kde_output_device_v2_bind_resource(Resource *resource) override
void sendEdid(Resource *resource)
void sendDone(Resource *resource)
auto_rotate_policy m_autoRotation
void sendBrightnessOverrides(Resource *resource)
void sendBrightnessMetadata(Resource *resource)
OutputDeviceV2Interface * q
void sendRgbRange(Resource *resource)
std::optional< double > m_maxAverageBrightness
void sendWideColorGamut(Resource *resource)
void sendSdrBrightness(Resource *resource)
void sendUuid(Resource *resource)
std::optional< double > m_maxPeakBrightnessOverride
void sendCapabilities(Resource *resource)
void sendGeometry(Resource *resource)
OutputDeviceModeV2Interface * m_currentMode
void sendVrrPolicy(Resource *resource)
void sendSdrGamutWideness(Resource *resource)
QList< OutputDeviceModeV2Interface * > m_modes
double m_sdrGamutWideness
void currentModeChanged()
void highDynamicRangeChanged()
void autoRotationPolicyChanged()
void sdrBrightnessChanged()
void capabilitiesChanged()
void sdrGamutWidenessChanged()
void brightnessMetadataChanged()
void wideColorGamutChanged()
OutputDeviceV2InterfacePrivate::Resource * output