7 #include "wayland_pointer_p.h" 13 #include <wayland-client-protocol.h> 25 class Q_DECL_HIDDEN Output::Private
30 void setup(wl_output *o);
32 WaylandPointer<wl_output, wl_output_release> output;
33 EventQueue *queue =
nullptr;
39 SubPixel subPixel = SubPixel::Unknown;
42 Modes::iterator currentMode = modes.
end();
44 static Output *
get(wl_output *o);
47 static void geometryCallback(
void *data, wl_output *output, int32_t x, int32_t y,
48 int32_t physicalWidth, int32_t physicalHeight, int32_t subPixel,
49 const char *make,
const char *model, int32_t transform);
50 static void modeCallback(
void *data, wl_output *output, uint32_t flags, int32_t width, int32_t height, int32_t refresh);
51 static void doneCallback(
void *data, wl_output *output);
52 static void scaleCallback(
void *data, wl_output *output, int32_t scale);
53 void setPhysicalSize(
const QSize &size);
54 void setGlobalPosition(
const QPoint &pos);
55 void setManufacturer(
const QString &manufacturer);
56 void setModel(
const QString &model);
57 void setScale(
int scale);
58 void setSubPixel(SubPixel subPixel);
59 void setTransform(Transform transform);
60 void addMode(uint32_t flags, int32_t width, int32_t height, int32_t refresh);
63 static struct wl_output_listener s_outputListener;
70 Output::Private::Private(Output *q)
76 Output::Private::~Private()
78 s_allOutputs.removeOne(
this);
81 Output *Output::Private::get(wl_output *o)
83 auto it = std::find_if(s_allOutputs.constBegin(), s_allOutputs.constEnd(),
85 const wl_output *reference = p->output;
86 return reference == o;
89 if (it != s_allOutputs.constEnd()) {
95 void Output::Private::setup(wl_output *o)
100 wl_output_add_listener(output, &s_outputListener,
this);
103 bool Output::Mode::operator==(
const Output::Mode &m)
const 105 return size == m.size
106 && refreshRate == m.refreshRate
108 && output == m.output;
113 , d(new Private(this))
122 wl_output_listener Output::Private::s_outputListener = {
129 void Output::Private::geometryCallback(
void *data, wl_output *output,
130 int32_t x, int32_t y,
131 int32_t physicalWidth, int32_t physicalHeight,
132 int32_t subPixel,
const char *make,
const char *model, int32_t transform)
135 auto o = reinterpret_cast<Output::Private*>(data);
136 Q_ASSERT(o->output == output);
137 o->setGlobalPosition(
QPoint(x, y));
138 o->setManufacturer(make);
140 o->setPhysicalSize(
QSize(physicalWidth, physicalHeight));
141 auto toSubPixel = [subPixel]() {
143 case WL_OUTPUT_SUBPIXEL_NONE:
144 return SubPixel::None;
145 case WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB:
146 return SubPixel::HorizontalRGB;
147 case WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR:
148 return SubPixel::HorizontalBGR;
149 case WL_OUTPUT_SUBPIXEL_VERTICAL_RGB:
150 return SubPixel::VerticalRGB;
151 case WL_OUTPUT_SUBPIXEL_VERTICAL_BGR:
152 return SubPixel::VerticalBGR;
153 case WL_OUTPUT_SUBPIXEL_UNKNOWN:
155 return SubPixel::Unknown;
158 o->setSubPixel(toSubPixel());
159 auto toTransform = [transform]() {
161 case WL_OUTPUT_TRANSFORM_90:
162 return Transform::Rotated90;
163 case WL_OUTPUT_TRANSFORM_180:
164 return Transform::Rotated180;
165 case WL_OUTPUT_TRANSFORM_270:
166 return Transform::Rotated270;
167 case WL_OUTPUT_TRANSFORM_FLIPPED:
168 return Transform::Flipped;
169 case WL_OUTPUT_TRANSFORM_FLIPPED_90:
170 return Transform::Flipped90;
171 case WL_OUTPUT_TRANSFORM_FLIPPED_180:
172 return Transform::Flipped180;
173 case WL_OUTPUT_TRANSFORM_FLIPPED_270:
174 return Transform::Flipped270;
175 case WL_OUTPUT_TRANSFORM_NORMAL:
177 return Transform::Normal;
180 o->setTransform(toTransform());
183 void Output::Private::modeCallback(
void *data, wl_output *output, uint32_t flags, int32_t width, int32_t height, int32_t refresh)
185 auto o =
reinterpret_cast<Output::Private*
>(data);
186 Q_ASSERT(o->output == output);
187 o->addMode(flags, width, height, refresh);
190 void Output::Private::addMode(uint32_t flags, int32_t width, int32_t height, int32_t refresh)
194 mode.refreshRate = refresh;
195 mode.size =
QSize(width, height);
196 if (flags & WL_OUTPUT_MODE_CURRENT) {
197 mode.flags |= Mode::Flag::Current;
199 if (flags & WL_OUTPUT_MODE_PREFERRED) {
200 mode.flags |= Mode::Flag::Preferred;
202 auto currentIt = modes.insert(modes.end(), mode);
203 bool existing =
false;
204 if (flags & WL_OUTPUT_MODE_CURRENT) {
205 auto it = modes.begin();
206 while (it != currentIt) {
208 if (m.flags.testFlag(Mode::Flag::Current)) {
209 m.flags &= ~
Mode::Flags(Mode::Flag::Current);
210 emit q->modeChanged(m);
212 if (m.refreshRate == mode.refreshRate && m.size == mode.size) {
213 it = modes.erase(it);
219 currentMode = currentIt;
222 emit q->modeChanged(mode);
224 emit q->modeAdded(mode);
228 void Output::Private::scaleCallback(
void *data, wl_output *output, int32_t scale)
230 auto o =
reinterpret_cast<Output::Private*
>(data);
231 Q_ASSERT(o->output == output);
235 void Output::Private::doneCallback(
void *data, wl_output *output)
237 auto o =
reinterpret_cast<Output::Private*
>(data);
238 Q_ASSERT(o->output == output);
239 emit o->q->changed();
242 void Output::setup(wl_output *output)
257 void Output::Private::setGlobalPosition(
const QPoint &pos)
259 globalPosition = pos;
262 void Output::Private::setManufacturer(
const QString &m)
267 void Output::Private::setModel(
const QString &m)
272 void Output::Private::setPhysicalSize(
const QSize &size)
277 void Output::Private::setScale(
int s)
284 if (d->currentMode == d->modes.end()) {
287 return QRect(d->globalPosition, pixelSize());
290 void Output::Private::setSubPixel(Output::SubPixel s)
295 void Output::Private::setTransform(Output::Transform t)
302 return d->globalPosition;
307 return d->manufacturer;
315 wl_output *Output::output()
322 return d->physicalSize;
327 if (d->currentMode == d->modes.end()) {
330 return (*d->currentMode).size;
333 int Output::refreshRate()
const 335 if (d->currentMode == d->modes.end()) {
338 return (*d->currentMode).refreshRate;
341 int Output::scale()
const 346 bool Output::isValid()
const 348 return d->output.isValid();
351 Output::SubPixel Output::subPixel()
const 356 Output::Transform Output::transform()
const 366 Output::operator wl_output*() {
370 Output::operator wl_output*()
const {
376 return Private::get(o);
379 void Output::destroy()
Wrapper class for wl_event_queue interface.
Wrapper for the wl_output interface.
QObject * parent() const const