19#include <KConfigGroup>
20#include <KGlobalAccel>
36static const Qt::GlobalColor s_colors[] = {
48Qt::GlobalColor TouchPointsEffect::colorForId(quint32
id)
50 auto it = m_colors.constFind(
id);
51 if (it != m_colors.constEnd()) {
54 static int s_colorIndex = -1;
55 s_colorIndex = (s_colorIndex + 1) % 10;
56 m_colors.insert(
id, s_colors[s_colorIndex]);
57 return s_colors[s_colorIndex];
65 point.color = colorForId(
id);
67 m_latestPositions.insert(
id, pos);
77 point.color = colorForId(
id);
79 m_latestPositions.insert(
id, pos);
86 auto it = m_latestPositions.constFind(
id);
87 if (it != m_latestPositions.constEnd()) {
89 point.pos = it.value();
91 point.color = colorForId(
id);
100 if (m_lastPresentTime.count()) {
101 time = (presentTime - m_lastPresentTime).count();
104 auto it = m_points.begin();
105 while (it != m_points.end()) {
107 if (it->time > m_ringLife) {
108 it = m_points.erase(it);
114 if (m_points.isEmpty()) {
115 m_lastPresentTime = std::chrono::milliseconds::zero();
117 m_lastPresentTime = presentTime;
130 for (
auto it = m_points.constBegin(), end = m_points.constEnd(); it != end; ++it) {
131 for (
int i = 0; i < m_ringCount; ++i) {
132 float alpha = computeAlpha(it->time, i);
133 float size = computeRadius(it->time, it->press, i);
134 if (size > 0 && alpha > 0) {
135 QColor color = it->color;
136 color.setAlphaF(alpha);
137 drawCircle(viewport, color, it->pos.x(), it->pos.y(), size);
142 paintScreenFinishGl();
152float TouchPointsEffect::computeRadius(
int time,
bool press,
int ring)
154 float ringDistance = m_ringLife / (m_ringCount * 3);
156 return ((time - ringDistance * ring) / m_ringLife) * m_ringMaxSize;
158 return ((m_ringLife - time - ringDistance * ring) / m_ringLife) * m_ringMaxSize;
161float TouchPointsEffect::computeAlpha(
int time,
int ring)
163 float ringDistance = m_ringLife / (m_ringCount * 3);
164 return (m_ringLife - (
float)time - ringDistance * (ring)) / m_ringLife;
167void TouchPointsEffect::repaint()
169 if (!m_points.isEmpty()) {
171 const int radius = m_ringMaxSize + m_lineWidth;
172 for (
auto it = m_points.constBegin(), end = m_points.constEnd(); it != end; ++it) {
173 dirtyRegion += QRect(it->pos.x() - radius, it->pos.y() - radius, 2 * radius, 2 * radius);
181 return !m_points.isEmpty();
184void TouchPointsEffect::drawCircle(
const RenderViewport &viewport,
const QColor &color,
float cx,
float cy,
float r)
187 drawCircleGl(viewport, color, cx, cy, r);
189 drawCircleQPainter(color, cx, cy, r);
193void TouchPointsEffect::drawCircleGl(
const RenderViewport &viewport,
const QColor &color,
float cx,
float cy,
float r)
195 static const int num_segments = 80;
196 static const float theta = 2 * 3.1415926 / float(num_segments);
197 static const float c = cosf(theta);
198 static const float s = sinf(theta);
199 const auto scale = viewport.scale();
208 QList<QVector2D> verts;
209 verts.reserve(num_segments);
211 for (
int ii = 0; ii < num_segments; ++ii) {
212 verts.push_back(QVector2D((x + cx) * scale, (y + cy) * scale));
218 vbo->setVertices(verts);
219 vbo->render(GL_LINE_LOOP);
222void TouchPointsEffect::drawCircleQPainter(
const QColor &color,
float cx,
float cy,
float r)
226 painter->setPen(color);
227 painter->drawArc(cx - r, cy - r, r * 2, r * 2, 0, 5760);
231void TouchPointsEffect::paintScreenSetupGl(
const RenderTarget &renderTarget,
const QMatrix4x4 &projectionMatrix)
235 shader->setColorspaceUniformsFromSRGB(renderTarget.colorDescription());
237 glLineWidth(m_lineWidth);
239 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
242void TouchPointsEffect::paintScreenFinishGl()
251#include "moc_touchpoints.cpp"
Base class for all KWin effects.
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen)
Q_SCRIPTABLE void addRepaint(const QRectF &r)
CompositingType compositingType
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
bool isOpenGLCompositing() const
Whether the Compositor is OpenGL based (either GL 1 or 2).
QPainter * scenePainter()
Provides access to the QPainter which is rendering to the back buffer.
@ ModelViewProjectionMatrix
bool setUniform(const char *name, float value)
static GLVertexBuffer * streamingBuffer()
QMatrix4x4 projectionMatrix() const
GLShader * getBoundShader() const
static ShaderManager * instance()
GLShader * pushShader(ShaderTraits traits)
void postPaintScreen() override
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion ®ion, Output *screen) override
bool touchUp(qint32 id, std::chrono::microseconds time) override
~TouchPointsEffect() override
bool touchDown(qint32 id, const QPointF &pos, std::chrono::microseconds time) override
bool isActive() const override
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
bool touchMotion(qint32 id, const QPointF &pos, std::chrono::microseconds time) override