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