1/*
2 SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
3 SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6*/
7#ifndef KWAYLAND_CONTRAST_H
8#define KWAYLAND_CONTRAST_H
9
10#include <optional>
11
12#include <QObject>
13#include <QPoint>
14#include <QSize>
15#include <QColor>
16
17#include "KWayland/Client/kwaylandclient_export.h"
18
19struct org_kde_kwin_contrast;
20struct org_kde_kwin_contrast_manager;
21
22namespace KWayland
23{
24namespace Client
25{
26class EventQueue;
27class Contrast;
28class Surface;
29class Region;
30
31/**
32 * TODO
33 */
34class KWAYLANDCLIENT_EXPORT ContrastManager : public QObject
35{
36 Q_OBJECT
37public:
38 /**
39 * Creates a new ContrastManager.
40 * Note: after constructing the ContrastManager it is not yet valid and one needs
41 * to call setup. In order to get a ready to use ContrastManager prefer using
42 * Registry::createContrastManager.
43 **/
44 explicit ContrastManager(QObject *parent = nullptr);
45 ~ContrastManager() override;
46
47 /**
48 * @returns @c true if managing a org_kde_kwin_contrast_manager.
49 **/
50 bool isValid() const;
51 /**
52 * Setup this ContrastManager to manage the @p contrastManager.
53 * When using Registry::createContrastManager there is no need to call this
54 * method.
55 **/
56 void setup(org_kde_kwin_contrast_manager *contrastManager);
57 /**
58 * Releases the org_kde_kwin_contrast_manager interface.
59 * After the interface has been released the ContrastManager instance is no
60 * longer valid and can be setup with another org_kde_kwin_contrast_manager interface.
61 **/
62 void release();
63 /**
64 * Destroys the data held by this ContrastManager.
65 * This method is supposed to be used when the connection to the Wayland
66 * server goes away. If the connection is not valid anymore, it's not
67 * possible to call release anymore as that calls into the Wayland
68 * connection and the call would fail. This method cleans up the data, so
69 * that the instance can be deleted or set up to a new org_kde_kwin_contrast_manager interface
70 * once there is a new connection available.
71 *
72 * It is suggested to connect this method to ConnectionThread::connectionDied:
73 * @code
74 * connect(connection, &ConnectionThread::connectionDied, contrastManager, &ContrastManager::destroy);
75 * @endcode
76 *
77 * @see release
78 **/
79 void destroy();
80
81 /**
82 * Sets the @p queue to use for creating a Contrast.
83 **/
84 void setEventQueue(EventQueue *queue);
85 /**
86 * @returns The event queue to use for creating a Contrast.
87 **/
88 EventQueue *eventQueue();
89
90 /**
91 * Creates and setup a new Contrast with @p parent.
92 * @param parent The parent to pass to the Contrast.
93 * @returns The new created Contrast
94 **/
95 Contrast *createContrast(Surface *surface, QObject *parent = nullptr);
96 void removeContrast(Surface *surface);
97
98 operator org_kde_kwin_contrast_manager *();
99 operator org_kde_kwin_contrast_manager *() const;
100
101Q_SIGNALS:
102 /**
103 * The corresponding global for this interface on the Registry got removed.
104 *
105 * This signal gets only emitted if the ContrastManager got created by
106 * Registry::createContrastManager
107 *
108 * @since 5.5
109 **/
110 void removed();
111
112private:
113 class Private;
114 QScopedPointer<Private> d;
115};
116
117/**
118 * @short Wrapper for the org_kde_kwin_contrast interface.
119 *
120 * This class is a convenient wrapper for the org_kde_kwin_contrast interface.
121 * To create a Contrast call ContrastManager::createContrast.
122 *
123 * The main purpose of this class is to setup the next frame which
124 * should be rendered. Therefore it provides methods to add damage
125 * and to attach a new Buffer and to finalize the frame by calling
126 * commit.
127 *
128 * @see ContrastManager
129 **/
130class KWAYLANDCLIENT_EXPORT Contrast : public QObject
131{
132 Q_OBJECT
133public:
134 ~Contrast() override;
135
136 /**
137 * Setup this Contrast to manage the @p contrast.
138 * When using ContrastManager::createContrast there is no need to call this
139 * method.
140 **/
141 void setup(org_kde_kwin_contrast *contrast);
142 /**
143 * Releases the org_kde_kwin_contrast interface.
144 * After the interface has been released the Contrast instance is no
145 * longer valid and can be setup with another org_kde_kwin_contrast interface.
146 **/
147 void release();
148 /**
149 * Destroys the data held by this Contrast.
150 * This method is supposed to be used when the connection to the Wayland
151 * server goes away. If the connection is not valid anymore, it's not
152 * possible to call release anymore as that calls into the Wayland
153 * connection and the call would fail. This method cleans up the data, so
154 * that the instance can be deleted or set up to a new org_kde_kwin_contrast interface
155 * once there is a new connection available.
156 *
157 * This method is automatically invoked when the Registry which created this
158 * Contrast gets destroyed.
159 *
160 * @see release
161 **/
162 void destroy();
163 /**
164 * @returns @c true if managing a org_kde_kwin_contrast.
165 **/
166 bool isValid() const;
167
168 void commit();
169
170 /**
171 * Sets the area of the window that will have a contrasted
172 * background.
173 * The region will have to be created with
174 * Compositor::createRegion(QRegion)
175 */
176 void setRegion(Region *region);
177 void setContrast(qreal contrast);
178 void setIntensity(qreal intensity);
179 void setSaturation(qreal saturation);
180
181 void setFrost(QColor frost);
182
183 operator org_kde_kwin_contrast *();
184 operator org_kde_kwin_contrast *() const;
185
186private:
187 friend class ContrastManager;
188 explicit Contrast(QObject *parent = nullptr);
189 class Private;
190 QScopedPointer<Private> d;
191};
192
193}
194}
195
196#endif
197

source code of kwayland/src/client/contrast.h