Changeset View
Changeset View
Standalone View
Standalone View
src/client/outputdevice.cpp
Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Line(s) | 43 | public: | |||
---|---|---|---|---|---|
58 | Modes modes; | 58 | Modes modes; | ||
59 | Modes::iterator currentMode = modes.end(); | 59 | Modes::iterator currentMode = modes.end(); | ||
60 | 60 | | |||
61 | QByteArray edid; | 61 | QByteArray edid; | ||
62 | OutputDevice::Enablement enabled = OutputDevice::Enablement::Enabled; | 62 | OutputDevice::Enablement enabled = OutputDevice::Enablement::Enabled; | ||
63 | QByteArray uuid; | 63 | QByteArray uuid; | ||
64 | 64 | | |||
65 | ColorCurves colorCurves; | 65 | ColorCurves colorCurves; | ||
66 | quint32 cloneGroupId = 0; | ||||
67 | QByteArray replicationSource; | ||||
66 | 68 | | |||
67 | bool done = false; | 69 | bool done = false; | ||
68 | 70 | | |||
69 | private: | 71 | private: | ||
70 | static void geometryCallback(void *data, org_kde_kwin_outputdevice *output, int32_t x, int32_t y, | 72 | static void geometryCallback(void *data, org_kde_kwin_outputdevice *output, int32_t x, int32_t y, | ||
71 | int32_t physicalWidth, int32_t physicalHeight, int32_t subPixel, | 73 | int32_t physicalWidth, int32_t physicalHeight, int32_t subPixel, | ||
72 | const char *make, const char *model, int32_t transform); | 74 | const char *make, const char *model, int32_t transform); | ||
73 | static void modeCallback(void *data, org_kde_kwin_outputdevice *output, uint32_t flags, int32_t width, int32_t height, int32_t refresh, int32_t mode_id); | 75 | static void modeCallback(void *data, org_kde_kwin_outputdevice *output, uint32_t flags, int32_t width, int32_t height, int32_t refresh, int32_t mode_id); | ||
74 | static void doneCallback(void *data, org_kde_kwin_outputdevice *output); | 76 | static void doneCallback(void *data, org_kde_kwin_outputdevice *output); | ||
75 | static void scaleCallback(void *data, org_kde_kwin_outputdevice *output, int32_t scale); | 77 | static void scaleCallback(void *data, org_kde_kwin_outputdevice *output, int32_t scale); | ||
76 | static void scaleFCallback(void *data, org_kde_kwin_outputdevice *output, wl_fixed_t scale); | 78 | static void scaleFCallback(void *data, org_kde_kwin_outputdevice *output, wl_fixed_t scale); | ||
77 | 79 | | |||
78 | static void edidCallback(void *data, org_kde_kwin_outputdevice *output, const char *raw); | 80 | static void edidCallback(void *data, org_kde_kwin_outputdevice *output, const char *raw); | ||
79 | static void enabledCallback(void *data, org_kde_kwin_outputdevice *output, int32_t enabled); | 81 | static void enabledCallback(void *data, org_kde_kwin_outputdevice *output, int32_t enabled); | ||
80 | static void uuidCallback(void *data, org_kde_kwin_outputdevice *output, const char *uuid); | 82 | static void uuidCallback(void *data, org_kde_kwin_outputdevice *output, const char *uuid); | ||
81 | 83 | | |||
82 | static void colorcurvesCallback(void *data, org_kde_kwin_outputdevice *output, | 84 | static void colorcurvesCallback(void *data, org_kde_kwin_outputdevice *output, | ||
83 | wl_array *red, wl_array *green, wl_array *blue); | 85 | wl_array *red, wl_array *green, wl_array *blue); | ||
84 | 86 | | |||
85 | static void serialNumberCallback(void *data, org_kde_kwin_outputdevice *output, const char *serialNumber); | 87 | static void serialNumberCallback(void *data, org_kde_kwin_outputdevice *output, const char *serialNumber); | ||
86 | static void eisaIdCallback(void *data, org_kde_kwin_outputdevice *output, const char *eisa); | 88 | static void eisaIdCallback(void *data, org_kde_kwin_outputdevice *output, const char *eisa); | ||
89 | static void cloneCallback(void *data, org_kde_kwin_outputdevice *output, uint32_t group); | ||||
90 | static void replicateCallback(void *data, org_kde_kwin_outputdevice *output, | ||||
91 | const char *source_uuid, uint32_t trigger, uint32_t direction); | ||||
87 | 92 | | |||
88 | void setPhysicalSize(const QSize &size); | 93 | void setPhysicalSize(const QSize &size); | ||
89 | void setGlobalPosition(const QPoint &pos); | 94 | void setGlobalPosition(const QPoint &pos); | ||
90 | void setManufacturer(const QString &manufacturer); | 95 | void setManufacturer(const QString &manufacturer); | ||
91 | void setModel(const QString &model); | 96 | void setModel(const QString &model); | ||
92 | void setScale(qreal scale); | 97 | void setScale(qreal scale); | ||
93 | void setSerialNumber(const QString &serialNumber); | 98 | void setSerialNumber(const QString &serialNumber); | ||
94 | void setEisaId(const QString &eisaId); | 99 | void setEisaId(const QString &eisaId); | ||
100 | void setCloneGroupId(uint32_t group); | ||||
95 | void setSubPixel(SubPixel subPixel); | 101 | void setSubPixel(SubPixel subPixel); | ||
96 | void setTransform(Transform transform); | 102 | void setTransform(Transform transform); | ||
97 | void addMode(uint32_t flags, int32_t width, int32_t height, int32_t refresh, int32_t mode_id); | 103 | void addMode(uint32_t flags, int32_t width, int32_t height, int32_t refresh, int32_t mode_id); | ||
98 | 104 | | |||
99 | OutputDevice *q; | 105 | OutputDevice *q; | ||
100 | static struct org_kde_kwin_outputdevice_listener s_outputListener; | 106 | static struct org_kde_kwin_outputdevice_listener s_outputListener; | ||
101 | }; | 107 | }; | ||
102 | 108 | | |||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Line(s) | 149 | org_kde_kwin_outputdevice_listener OutputDevice::Private::s_outputListener = { | |||
146 | doneCallback, | 152 | doneCallback, | ||
147 | scaleCallback, | 153 | scaleCallback, | ||
148 | edidCallback, | 154 | edidCallback, | ||
149 | enabledCallback, | 155 | enabledCallback, | ||
150 | uuidCallback, | 156 | uuidCallback, | ||
151 | scaleFCallback, | 157 | scaleFCallback, | ||
152 | colorcurvesCallback, | 158 | colorcurvesCallback, | ||
153 | serialNumberCallback, | 159 | serialNumberCallback, | ||
154 | eisaIdCallback | 160 | eisaIdCallback, | ||
161 | cloneCallback, | ||||
162 | replicateCallback | ||||
155 | }; | 163 | }; | ||
156 | 164 | | |||
157 | void OutputDevice::Private::geometryCallback(void *data, org_kde_kwin_outputdevice *output, | 165 | void OutputDevice::Private::geometryCallback(void *data, org_kde_kwin_outputdevice *output, | ||
158 | int32_t x, int32_t y, | 166 | int32_t x, int32_t y, | ||
159 | int32_t physicalWidth, int32_t physicalHeight, | 167 | int32_t physicalWidth, int32_t physicalHeight, | ||
160 | int32_t subPixel, const char *make, const char *model, int32_t transform) | 168 | int32_t subPixel, const char *make, const char *model, int32_t transform) | ||
161 | { | 169 | { | ||
162 | Q_UNUSED(transform) | 170 | Q_UNUSED(transform) | ||
▲ Show 20 Lines • Show All 199 Lines • ▼ Show 20 Line(s) | |||||
362 | 370 | | |||
363 | void OutputDevice::Private::eisaIdCallback(void *data, org_kde_kwin_outputdevice *output, const char *raw) | 371 | void OutputDevice::Private::eisaIdCallback(void *data, org_kde_kwin_outputdevice *output, const char *raw) | ||
364 | { | 372 | { | ||
365 | auto o = reinterpret_cast<OutputDevice::Private*>(data); | 373 | auto o = reinterpret_cast<OutputDevice::Private*>(data); | ||
366 | Q_UNUSED(output); | 374 | Q_UNUSED(output); | ||
367 | o->setEisaId(raw); | 375 | o->setEisaId(raw); | ||
368 | } | 376 | } | ||
369 | 377 | | |||
378 | void OutputDevice::Private::cloneCallback(void *data, org_kde_kwin_outputdevice *output, uint32_t group) | ||||
379 | { | ||||
380 | auto o = reinterpret_cast<OutputDevice::Private*>(data); | ||||
381 | Q_UNUSED(output); | ||||
382 | o->setCloneGroupId(group); | ||||
383 | } | ||||
384 | | ||||
385 | OutputDevice::TriggerReason toTrigger(uint32_t trigger) | ||||
386 | { | ||||
387 | using Reason = OutputDevice::TriggerReason; | ||||
388 | | ||||
389 | Reason reason = Reason::None; | ||||
390 | switch (trigger) { | ||||
391 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_REASON_EXPLICIT: | ||||
zzag: That's not safe if the raw string is dynamically allocated, use qstrlen instead. | |||||
Correction: that's not reliable way to check whether a C string is empty. You assume that all empty strings have the same address, which in some cases cannot be true, e.g. if the string is dynamically allocated. zzag: Correction: that's not reliable way to check whether a C string is empty. You assume that all… | |||||
Will change in next revision. It currently also does not yet check if the provided source uuid is not the one of the output-device itself. romangg: Will change in next revision. It currently also does not yet check if the provided source uuid… | |||||
392 | reason = Reason::Explicit; | ||||
393 | break; | ||||
394 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_REASON_HOTPLUG: | ||||
395 | reason = Reason::Hotplug; | ||||
396 | break; | ||||
397 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_REASON_DPMS: | ||||
398 | reason = Reason::Dpms; | ||||
399 | break; | ||||
400 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_REASON_ENABLEMENT: | ||||
401 | reason = Reason::Enablement; | ||||
402 | break; | ||||
403 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_REASON_NONE: | ||||
404 | break; | ||||
405 | default: | ||||
406 | Q_UNREACHABLE(); | ||||
407 | break; | ||||
408 | } | ||||
409 | return reason; | ||||
410 | } | ||||
411 | | ||||
412 | OutputDevice::TriggerDirection toDirection(uint32_t direction) | ||||
413 | { | ||||
414 | using Direction = OutputDevice::TriggerDirection; | ||||
415 | | ||||
416 | Direction dir = Direction::None; | ||||
417 | switch (direction) { | ||||
418 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_DIRECTION_UP: | ||||
419 | dir = Direction::Up; | ||||
420 | break; | ||||
421 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_DIRECTION_DOWN: | ||||
422 | dir = Direction::Down; | ||||
423 | break; | ||||
424 | case ORG_KDE_KWIN_OUTPUTDEVICE_TRIGGER_REASON_NONE: | ||||
425 | break; | ||||
426 | default: | ||||
427 | Q_UNREACHABLE(); | ||||
428 | break; | ||||
429 | } | ||||
430 | return dir; | ||||
431 | } | ||||
432 | | ||||
433 | void OutputDevice::Private::replicateCallback(void *data, | ||||
434 | org_kde_kwin_outputdevice *output, | ||||
435 | const char *source_uuid, | ||||
436 | uint32_t trigger, uint32_t direction) | ||||
437 | { | ||||
438 | auto o = reinterpret_cast<OutputDevice::Private*>(data); | ||||
439 | Q_UNUSED(output); | ||||
440 | if (qstrlen(source_uuid) == 0) { | ||||
441 | if (o->replicationSource.isNull()) { | ||||
442 | // No change. | ||||
443 | return; | ||||
444 | } | ||||
445 | o->replicationSource.clear(); | ||||
446 | } else { | ||||
447 | const size_t len = strlen(source_uuid); | ||||
448 | if (uint(o->replicationSource.size()) == len && | ||||
449 | qstrncmp(o->replicationSource, source_uuid, len) == 0) { | ||||
450 | // No change. | ||||
451 | return; | ||||
452 | } | ||||
453 | o->replicationSource = source_uuid; | ||||
454 | } | ||||
455 | emit o->q->replicationSourceChanged(o->replicationSource, toTrigger(trigger), | ||||
456 | toDirection(direction)); | ||||
457 | } | ||||
458 | | ||||
370 | void OutputDevice::setup(org_kde_kwin_outputdevice *output) | 459 | void OutputDevice::setup(org_kde_kwin_outputdevice *output) | ||
371 | { | 460 | { | ||
372 | d->setup(output); | 461 | d->setup(output); | ||
373 | } | 462 | } | ||
374 | 463 | | |||
375 | EventQueue *OutputDevice::eventQueue() const | 464 | EventQueue *OutputDevice::eventQueue() const | ||
376 | { | 465 | { | ||
377 | return d->queue; | 466 | return d->queue; | ||
Show All 24 Lines | 490 | { | |||
402 | serialNumber = sn; | 491 | serialNumber = sn; | ||
403 | } | 492 | } | ||
404 | 493 | | |||
405 | void OutputDevice::Private::setEisaId(const QString &e) | 494 | void OutputDevice::Private::setEisaId(const QString &e) | ||
406 | { | 495 | { | ||
407 | eisaId = e; | 496 | eisaId = e; | ||
408 | } | 497 | } | ||
409 | 498 | | |||
499 | void OutputDevice::Private::setCloneGroupId(uint32_t group) | ||||
500 | { | ||||
501 | cloneGroupId = group; | ||||
502 | } | ||||
503 | | ||||
410 | void OutputDevice::Private::setPhysicalSize(const QSize &size) | 504 | void OutputDevice::Private::setPhysicalSize(const QSize &size) | ||
411 | { | 505 | { | ||
412 | physicalSize = size; | 506 | physicalSize = size; | ||
413 | } | 507 | } | ||
414 | 508 | | |||
415 | void OutputDevice::Private::setScale(qreal s) | 509 | void OutputDevice::Private::setScale(qreal s) | ||
416 | { | 510 | { | ||
417 | scale = s; | 511 | scale = s; | ||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Line(s) | 633 | { | |||
540 | return d->uuid; | 634 | return d->uuid; | ||
541 | } | 635 | } | ||
542 | 636 | | |||
543 | OutputDevice::ColorCurves OutputDevice::colorCurves() const | 637 | OutputDevice::ColorCurves OutputDevice::colorCurves() const | ||
544 | { | 638 | { | ||
545 | return d->colorCurves; | 639 | return d->colorCurves; | ||
546 | } | 640 | } | ||
547 | 641 | | |||
642 | quint32 OutputDevice::cloneGroupId() const | ||||
643 | { | ||||
644 | return d->cloneGroupId; | ||||
645 | } | ||||
646 | | ||||
647 | QByteArray OutputDevice::replicationSource() const | ||||
648 | { | ||||
649 | return d->replicationSource; | ||||
650 | } | ||||
651 | | ||||
548 | void OutputDevice::destroy() | 652 | void OutputDevice::destroy() | ||
549 | { | 653 | { | ||
550 | d->output.destroy(); | 654 | d->output.destroy(); | ||
551 | 655 | | |||
552 | } | 656 | } | ||
553 | 657 | | |||
554 | } | 658 | } | ||
555 | } | 659 | } |
That's not safe if the raw string is dynamically allocated, use qstrlen instead.