KWin
Loading...
Searching...
No Matches
mouseclick.h
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2012 Filip Wieladek <wattos@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#pragma once
11
12#include "effect/effect.h"
13#include "effect/effectframe.h"
14#include "opengl/glutils.h"
15#include <KLocalizedString>
16#include <QFont>
17#include <QHash>
18#include <deque>
19
20namespace KWin
21{
22
23#define BUTTON_COUNT 3
24
25class EffectFrame;
26
27class MouseEvent
28{
29public:
30 MouseEvent(int button, QPoint point, int time, std::unique_ptr<EffectFrame> &&frame, bool press)
31 : m_button(button)
32 , m_pos(point)
33 , m_time(time)
34 , m_frame(std::move(frame))
35 , m_press(press){};
36
38 QPoint m_pos;
39 int m_time;
40 std::unique_ptr<EffectFrame> m_frame;
41 bool m_press;
42};
43
45{
46public:
48 bool m_pressed = false;
49 qreal m_pressure = 0;
50 QColor m_color;
51};
52
54{
55public:
56 MouseButton(QString label, Qt::MouseButtons button)
57 : m_labelUp(label)
58 , m_labelDown(label)
59 , m_button(button)
60 , m_isPressed(false)
61 , m_time(0)
62 {
63 m_labelDown.append(i18n("↓"));
64 m_labelUp.append(i18n("↑"));
65 };
66
67 inline void setPressed(bool pressed)
68 {
69 if (m_isPressed != pressed) {
70 m_isPressed = pressed;
71 if (pressed) {
72 m_time = 0;
73 }
74 }
75 }
76
77 QString m_labelUp;
78 QString m_labelDown;
79 Qt::MouseButtons m_button;
81 int m_time;
82};
83
85 : public Effect
86{
87 Q_OBJECT
88 Q_PROPERTY(QColor color1 READ color1)
89 Q_PROPERTY(QColor color2 READ color2)
90 Q_PROPERTY(QColor color3 READ color3)
91 Q_PROPERTY(qreal lineWidth READ lineWidth)
92 Q_PROPERTY(int ringLife READ ringLife)
93 Q_PROPERTY(int ringSize READ ringSize)
94 Q_PROPERTY(int ringCount READ ringCount)
95 Q_PROPERTY(bool showText READ isShowText)
96 Q_PROPERTY(QFont font READ font)
97 Q_PROPERTY(bool enabled READ isEnabled)
98public:
100 ~MouseClickEffect() override;
101 void reconfigure(ReconfigureFlags) override;
102 void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override;
103 void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen) override;
104 void postPaintScreen() override;
105 bool isActive() const override;
106
107 // for properties
108 QColor color1() const;
109 QColor color2() const;
110 QColor color3() const;
111 qreal lineWidth() const;
112 int ringLife() const;
113 int ringSize() const;
114 int ringCount() const;
115 bool isShowText() const;
116 QFont font() const;
117 bool isEnabled() const;
118
119 bool tabletToolEvent(QTabletEvent *event) override;
120
121private Q_SLOTS:
122 void toggleEnabled();
123 void slotMouseChanged(const QPointF &pos, const QPointF &old,
124 Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons,
125 Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers);
126
127private:
128 std::unique_ptr<EffectFrame> createEffectFrame(const QPoint &pos, const QString &text);
129 inline void drawCircle(const RenderViewport &viewport, const QColor &color, float cx, float cy, float r);
130
131 inline bool isReleased(Qt::MouseButtons button, Qt::MouseButtons buttons, Qt::MouseButtons oldButtons);
132 inline bool isPressed(Qt::MouseButtons button, Qt::MouseButtons buttons, Qt::MouseButtons oldButtons);
133
134 inline float computeRadius(const MouseEvent *click, int ring);
135 inline float computeAlpha(const MouseEvent *click, int ring);
136
137 void repaint();
138
139 void drawCircleGl(const RenderViewport &viewport, const QColor &color, float cx, float cy, float r);
140 void drawCircleQPainter(const QColor &color, float cx, float cy, float r);
141 void paintScreenSetupGl(const RenderTarget &renderTarget, const QMatrix4x4 &projectionMatrix);
142 void paintScreenFinishGl();
143
144 QColor m_colors[BUTTON_COUNT];
145 int m_ringCount;
146 float m_lineWidth;
147 float m_ringLife;
148 float m_ringMaxSize;
149 bool m_showText;
150 QFont m_font;
151 std::chrono::milliseconds m_lastPresentTime = std::chrono::milliseconds::zero();
152
153 std::deque<std::unique_ptr<MouseEvent>> m_clicks;
154 std::unique_ptr<MouseButton> m_buttons[BUTTON_COUNT];
155 QHash<quint64, TabletToolEvent> m_tabletTools;
156
157 bool m_enabled;
158};
159
160} // namespace
Helper class for displaying text and icons in frames.
Base class for all KWin effects.
Definition effect.h:535
QString m_labelDown
Definition mouseclick.h:78
void setPressed(bool pressed)
Definition mouseclick.h:67
Qt::MouseButtons m_button
Definition mouseclick.h:79
MouseButton(QString label, Qt::MouseButtons button)
Definition mouseclick.h:56
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen) override
void postPaintScreen() override
void reconfigure(ReconfigureFlags) override
bool tabletToolEvent(QTabletEvent *event) override
bool isActive() const override
std::unique_ptr< EffectFrame > m_frame
Definition mouseclick.h:40
MouseEvent(int button, QPoint point, int time, std::unique_ptr< EffectFrame > &&frame, bool press)
Definition mouseclick.h:30
#define BUTTON_COUNT
Definition mouseclick.h:23
#define private