15#include <KLocalizedString>
16#include <QDBusConnection>
17#include <QDBusMetaType>
21QDBusArgument &operator<<(QDBusArgument &argument, const QColor &color)
23 argument.beginStructure();
24 argument << color.rgba();
25 argument.endStructure();
29const QDBusArgument &
operator>>(
const QDBusArgument &argument, QColor &color)
31 argument.beginStructure();
34 argument.endStructure();
35 color = QColor::fromRgba(rgba);
48 : m_scheduledPosition(QPoint(-1, -1))
50 qDBusRegisterMetaType<QColor>();
51 QDBusConnection::sessionBus().registerObject(QStringLiteral(
"/ColorPicker"),
this, QDBusConnection::ExportScriptableContents);
61 if (m_scheduledPosition != QPoint(-1, -1) && exclusiveContains(geo, m_scheduledPosition)) {
62 std::array<float, 4> data;
63 constexpr GLsizei PIXEL_SIZE = 1;
64 const QPoint texturePosition = viewport.
mapToRenderTarget(m_scheduledPosition).toPoint();
66 glReadPixels(texturePosition.x(), renderTarget.
size().height() - texturePosition.y() - PIXEL_SIZE, PIXEL_SIZE, PIXEL_SIZE, GL_RGBA, GL_FLOAT, data.data());
68 QDBusConnection::sessionBus().send(m_replyMessage.createReply(QColor(
sRGB.x(),
sRGB.y(),
sRGB.z())));
70 m_scheduledPosition = QPoint(-1, -1);
76 if (!calledFromDBus()) {
80 sendErrorReply(QDBusError::Failed,
"Color picking is already in progress");
84 m_replyMessage = message();
85 setDelayedReply(
true);
88 [
this](
const QPointF &p) {
90 if (p == QPointF(-1, -1)) {
92 QDBusConnection::sessionBus().send(m_replyMessage.createErrorReply(QStringLiteral(
"org.kde.kwin.ColorPicker.Error.Cancelled"),
"Color picking got cancelled"));
95 m_scheduledPosition = p;
102void ColorPickerEffect::showInfoMessage()
104 effects->
showOnScreenMessage(i18n(
"Select a position for color picking with left click or enter.\nEscape or right click to cancel."), QStringLiteral(
"color-picker"));
107void ColorPickerEffect::hideInfoMessage()
119#include "moc_colorpicker.cpp"
static const ColorDescription sRGB
QVector3D mapTo(QVector3D rgb, const ColorDescription &other) const
Q_SCRIPTABLE QColor pick()
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen) override
~ColorPickerEffect() override
bool isActive() const override
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen)
void startInteractivePositionSelection(std::function< void(const QPointF &)> callback)
void showOnScreenMessage(const QString &message, const QString &iconName=QString())
bool isScreenLocked() const
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
void hideOnScreenMessage(OnScreenMessageHideFlags flags=OnScreenMessageHideFlags())
Q_SCRIPTABLE void addRepaintFull()
const ColorDescription & colorDescription() const
QRectF renderRect() const
QRectF mapToRenderTarget(const QRectF &logicalGeometry) const
const QDBusArgument & operator>>(const QDBusArgument &argument, QColor &color)