6 #include "outputconfiguration.h"
7 #include "event_queue.h"
8 #include "outputmanagement.h"
9 #include "wayland_pointer_p.h"
11 #include "wayland-org_kde_kwin_outputdevice-client-protocol.h"
12 #include "wayland-output-management-client-protocol.h"
18 class Q_DECL_HIDDEN OutputConfiguration::Private
23 void setup(org_kde_kwin_outputconfiguration *outputconfiguration);
25 WaylandPointer<org_kde_kwin_outputconfiguration, org_kde_kwin_outputconfiguration_destroy> outputconfiguration;
26 static struct org_kde_kwin_outputconfiguration_listener s_outputconfigurationListener;
27 EventQueue *queue =
nullptr;
29 OutputConfiguration *q;
32 static void appliedCallback(
void *data, org_kde_kwin_outputconfiguration *config);
33 static void failedCallback(
void *data, org_kde_kwin_outputconfiguration *config);
36 OutputConfiguration::OutputConfiguration(
QObject *parent)
43 OutputConfiguration::~OutputConfiguration()
48 void OutputConfiguration::setup(org_kde_kwin_outputconfiguration *outputconfiguration)
50 Q_ASSERT(outputconfiguration);
51 Q_ASSERT(!d->outputconfiguration);
52 d->outputconfiguration.setup(outputconfiguration);
53 d->setup(outputconfiguration);
56 void OutputConfiguration::Private::setup(org_kde_kwin_outputconfiguration *outputconfiguration)
58 org_kde_kwin_outputconfiguration_add_listener(outputconfiguration, &s_outputconfigurationListener,
this);
63 d->outputconfiguration.release();
66 void OutputConfiguration::destroy()
68 d->outputconfiguration.destroy();
71 void OutputConfiguration::setEventQueue(
EventQueue *queue)
81 OutputConfiguration::operator org_kde_kwin_outputconfiguration *()
83 return d->outputconfiguration;
86 OutputConfiguration::operator org_kde_kwin_outputconfiguration *()
const
88 return d->outputconfiguration;
91 bool OutputConfiguration::isValid()
const
93 return d->outputconfiguration.
isValid();
98 void OutputConfiguration::setEnabled(
OutputDevice *outputdevice, OutputDevice::Enablement enable)
100 qint32 _enable = ORG_KDE_KWIN_OUTPUTDEVICE_ENABLEMENT_DISABLED;
101 if (enable == OutputDevice::Enablement::Enabled) {
102 _enable = ORG_KDE_KWIN_OUTPUTDEVICE_ENABLEMENT_ENABLED;
104 org_kde_kwin_outputdevice *od = outputdevice->output();
105 org_kde_kwin_outputconfiguration_enable(d->outputconfiguration, od, _enable);
108 void OutputConfiguration::setMode(
OutputDevice *outputdevice,
const int modeId)
110 org_kde_kwin_outputdevice *od = outputdevice->output();
111 org_kde_kwin_outputconfiguration_mode(d->outputconfiguration, od, modeId);
114 void OutputConfiguration::setTransform(
OutputDevice *outputdevice, KWayland::Client::OutputDevice::Transform transform)
116 auto toTransform = [transform]() {
119 case KWayland::Client::OutputDevice::Transform::Normal:
120 return WL_OUTPUT_TRANSFORM_NORMAL;
121 case KWayland::Client::OutputDevice::Transform::Rotated90:
122 return WL_OUTPUT_TRANSFORM_90;
123 case KWayland::Client::OutputDevice::Transform::Rotated180:
124 return WL_OUTPUT_TRANSFORM_180;
125 case KWayland::Client::OutputDevice::Transform::Rotated270:
126 return WL_OUTPUT_TRANSFORM_270;
127 case KWayland::Client::OutputDevice::Transform::Flipped:
128 return WL_OUTPUT_TRANSFORM_FLIPPED;
129 case KWayland::Client::OutputDevice::Transform::Flipped90:
130 return WL_OUTPUT_TRANSFORM_FLIPPED_90;
131 case KWayland::Client::OutputDevice::Transform::Flipped180:
132 return WL_OUTPUT_TRANSFORM_FLIPPED_180;
133 case KWayland::Client::OutputDevice::Transform::Flipped270:
134 return WL_OUTPUT_TRANSFORM_FLIPPED_270;
138 org_kde_kwin_outputdevice *od = outputdevice->output();
139 org_kde_kwin_outputconfiguration_transform(d->outputconfiguration, od, toTransform());
144 org_kde_kwin_outputdevice *od = outputdevice->output();
145 org_kde_kwin_outputconfiguration_position(d->outputconfiguration, od, pos.
x(), pos.
y());
148 #if KWAYLANDCLIENT_BUILD_DEPRECATED_SINCE(5, 50)
149 void OutputConfiguration::setScale(
OutputDevice *outputdevice, qint32 scale)
151 setScaleF(outputdevice, scale);
155 void OutputConfiguration::setScaleF(
OutputDevice *outputdevice, qreal scale)
157 org_kde_kwin_outputdevice *od = outputdevice->output();
158 if (wl_proxy_get_version(d->outputconfiguration) < ORG_KDE_KWIN_OUTPUTCONFIGURATION_SCALEF_SINCE_VERSION) {
159 org_kde_kwin_outputconfiguration_scale(d->outputconfiguration, od, qRound(scale));
161 org_kde_kwin_outputconfiguration_scalef(d->outputconfiguration, od, wl_fixed_from_double(scale));
167 org_kde_kwin_outputdevice *od = outputdevice->output();
175 const size_t memLength =
sizeof(uint16_t) * origin.
size();
176 void *s = wl_array_add(dest, memLength);
177 memcpy(s, origin.
data(), memLength);
179 fillArray(red, &wlRed);
180 fillArray(green, &wlGreen);
181 fillArray(blue, &wlBlue);
183 org_kde_kwin_outputconfiguration_colorcurves(d->outputconfiguration, od, &wlRed, &wlGreen, &wlBlue);
185 wl_array_release(&wlRed);
186 wl_array_release(&wlGreen);
187 wl_array_release(&wlBlue);
190 void OutputConfiguration::setOverscan(
OutputDevice *outputdevice, uint32_t overscan)
192 org_kde_kwin_outputdevice *od = outputdevice->output();
193 if (wl_proxy_get_version(d->outputconfiguration) >= ORG_KDE_KWIN_OUTPUTCONFIGURATION_OVERSCAN_SINCE_VERSION) {
194 org_kde_kwin_outputconfiguration_overscan(d->outputconfiguration, od, overscan);
198 void OutputConfiguration::setVrrPolicy(
OutputDevice *outputdevice, OutputDevice::VrrPolicy policy)
200 if (wl_proxy_get_version(d->outputconfiguration) >= ORG_KDE_KWIN_OUTPUTCONFIGURATION_SET_VRR_POLICY_SINCE_VERSION) {
201 org_kde_kwin_outputdevice *od = outputdevice->output();
202 org_kde_kwin_outputconfiguration_set_vrr_policy(d->outputconfiguration, od,
static_cast<uint32_t
>(policy));
206 void OutputConfiguration::apply()
208 org_kde_kwin_outputconfiguration_apply(d->outputconfiguration);
212 org_kde_kwin_outputconfiguration_listener OutputConfiguration::Private::s_outputconfigurationListener = {appliedCallback, failedCallback};
214 void OutputConfiguration::Private::appliedCallback(
void *data, org_kde_kwin_outputconfiguration *config)
217 auto o =
reinterpret_cast<OutputConfiguration::Private *
>(data);
218 Q_EMIT o->q->applied();
221 void OutputConfiguration::Private::failedCallback(
void *data, org_kde_kwin_outputconfiguration *config)
224 auto o =
reinterpret_cast<OutputConfiguration::Private *
>(data);
225 Q_EMIT o->q->failed();