KWin
Loading...
Searching...
No Matches
effecttogglablestate.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez <aleixpol@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
9
10namespace KWin
11{
12
14 : QObject(effect)
15 , m_deactivateAction(std::make_unique<QAction>())
16 , m_activateAction(std::make_unique<QAction>())
17 , m_toggleAction(std::make_unique<QAction>())
18{
19 connect(m_activateAction.get(), &QAction::triggered, this, [this]() {
20 if (m_status == Status::Activating) {
21 if (m_partialActivationFactor > 0.5) {
22 activate();
23 Q_EMIT activated();
24 } else {
25 deactivate();
26 Q_EMIT deactivated();
27 }
28 }
29 });
30 connect(m_deactivateAction.get(), &QAction::triggered, this, [this]() {
31 if (m_status == Status::Deactivating) {
32 if (m_partialActivationFactor < 0.5) {
33 deactivate();
34 Q_EMIT deactivated();
35 } else {
36 activate();
37 Q_EMIT activated();
38 }
39 }
40 });
41 connect(m_toggleAction.get(), &QAction::triggered, this, &EffectTogglableState::toggle);
42}
43
44void EffectTogglableState::activate()
45{
46 setInProgress(false);
47 setPartialActivationFactor(1.0);
48 setStatus(Status::Active);
49}
50
51void EffectTogglableState::setPartialActivationFactor(qreal factor)
52{
53 if (m_partialActivationFactor != factor) {
54 m_partialActivationFactor = factor;
55 Q_EMIT partialActivationFactorChanged();
56 }
57}
58
59void EffectTogglableState::deactivate()
60{
61 setInProgress(false);
62 setPartialActivationFactor(0.0);
63 setStatus(Status::Inactive);
64}
65
66void EffectTogglableState::stop()
67{
68 setInProgress(false);
69 setPartialActivationFactor(0.0);
70 setStatus(Status::Stopped);
71}
72
73bool EffectTogglableState::inProgress() const
74{
75 return m_inProgress;
76}
77
78void EffectTogglableState::setInProgress(bool gesture)
79{
80 if (m_inProgress != gesture) {
81 m_inProgress = gesture;
82 Q_EMIT inProgressChanged();
83 }
84}
85
86void EffectTogglableState::setStatus(Status status)
87{
88 if (m_status != status) {
89 m_status = status;
90 Q_EMIT statusChanged(status);
91 }
92}
93
94void EffectTogglableState::partialActivate(qreal factor)
95{
96 if (effects->isScreenLocked()) {
97 return;
98 }
99
100 setStatus(Status::Activating);
101 setInProgress(true);
102 setPartialActivationFactor(factor);
103}
104
105void EffectTogglableState::partialDeactivate(qreal factor)
106{
107 setStatus(Status::Deactivating);
108 setInProgress(true);
109 setPartialActivationFactor(1.0 - factor);
110}
111
112void EffectTogglableState::toggle()
113{
114 if (m_status != Status::Active) {
115 activate();
116 Q_EMIT activated();
117 } else {
118 deactivate();
119 Q_EMIT deactivated();
120 }
121}
122
123void EffectTogglableState::setProgress(qreal progress)
124{
125 if (m_status == Status::Stopped) {
126 return;
127 }
129 switch (m_status) {
130 case Status::Inactive:
131 case Status::Activating:
132 partialActivate(progress);
133 break;
134 default:
135 break;
136 }
137 }
138}
139
140void EffectTogglableState::setRegress(qreal regress)
141{
142 if (m_status == Status::Stopped) {
143 return;
144 }
146 switch (m_status) {
147 case Status::Active:
148 case Status::Deactivating:
149 partialDeactivate(regress);
150 break;
151 default:
152 break;
153 }
154 }
155}
156
157EffectTogglableGesture::EffectTogglableGesture(EffectTogglableState *state)
158 : QObject(state)
159 , m_state(state)
160{
161}
162
163static PinchDirection opposite(PinchDirection direction)
164{
165 switch (direction) {
170 }
172}
173
174static SwipeDirection opposite(SwipeDirection direction)
175{
176 switch (direction) {
180 return SwipeDirection::Up;
187 }
189}
190
191std::function<void(qreal progress)> EffectTogglableState::progressCallback()
192{
193 return [this](qreal progress) {
194 setProgress(progress);
195 };
196}
197
198std::function<void(qreal progress)> EffectTogglableState::regressCallback()
199{
200 return [this](qreal progress) {
201 setRegress(progress);
202 };
203}
204
206{
207 effects->registerTouchpadPinchShortcut(direction, fingerCount, m_state->activateAction(), m_state->progressCallback());
208 effects->registerTouchpadPinchShortcut(opposite(direction), fingerCount, m_state->deactivateAction(), m_state->regressCallback());
209}
210
212{
213 effects->registerTouchpadSwipeShortcut(direction, fingerCount, m_state->activateAction(), m_state->progressCallback());
214 effects->registerTouchpadSwipeShortcut(opposite(direction), fingerCount, m_state->deactivateAction(), m_state->regressCallback());
215}
216
218{
219 effects->registerTouchscreenSwipeShortcut(direction, fingerCount, m_state->activateAction(), m_state->progressCallback());
220 effects->registerTouchscreenSwipeShortcut(opposite(direction), fingerCount, m_state->deactivateAction(), m_state->regressCallback());
221}
222
224 : QObject(state)
225 , m_state(state)
226{
227}
228
230{
231 for (const ElectricBorder &border : std::as_const(m_touchBorderActivate)) {
232 effects->unregisterTouchBorder(border, m_state->activateAction());
233 }
234}
235
236void EffectTogglableTouchBorder::setBorders(const QList<int> &touchActivateBorders)
237{
238 for (const ElectricBorder &border : std::as_const(m_touchBorderActivate)) {
239 effects->unregisterTouchBorder(border, m_state->activateAction());
240 }
241 m_touchBorderActivate.clear();
242
243 for (const int &border : touchActivateBorders) {
244 m_touchBorderActivate.append(ElectricBorder(border));
245 effects->registerRealtimeTouchBorder(ElectricBorder(border), m_state->activateAction(), [this](ElectricBorder border, const QPointF &deltaProgress, const Output *screen) {
247 return;
248 }
249 const int maxDelta = 500; // Arbitrary logical pixels value seems to behave better than scaledScreenSize
250 qreal progress = 0;
251 if (border == ElectricTop || border == ElectricBottom) {
252 progress = std::min(1.0, std::abs(deltaProgress.y()) / maxDelta);
253 } else {
254 progress = std::min(1.0, std::abs(deltaProgress.x()) / maxDelta);
255 }
256 m_state->setProgress(progress);
257 });
258 }
259}
260
261}
262
263#include "moc_effecttogglablestate.cpp"
Base class for all KWin effects.
Definition effect.h:535
void addTouchpadSwipeGesture(SwipeDirection dir, uint fingerCount)
void addTouchpadPinchGesture(PinchDirection dir, uint fingerCount)
void addTouchscreenSwipeGesture(SwipeDirection direction, uint fingerCount)
void setRegress(qreal regress)
regress being the progress when on an active state
std::function< void(qreal progress)> regressCallback()
std::function< void(qreal progress)> progressCallback()
void setBorders(const QList< int > &borders)
EffectTogglableTouchBorder(EffectTogglableState *state)
void unregisterTouchBorder(ElectricBorder border, QAction *action)
void registerTouchpadPinchShortcut(PinchDirection dir, uint fingerCount, QAction *onUp, std::function< void(qreal)> progressCallback={})
void registerTouchpadSwipeShortcut(SwipeDirection dir, uint fingerCount, QAction *onUp, std::function< void(qreal)> progressCallback={})
Registers a global touchpad swipe gesture shortcut with the provided action.
void registerTouchscreenSwipeShortcut(SwipeDirection direction, uint fingerCount, QAction *action, std::function< void(qreal)> progressCallback)
Registers a global touchscreen swipe gesture shortcut with the provided action.
void registerRealtimeTouchBorder(ElectricBorder border, QAction *action, TouchBorderCallback progressCallback)
Effect * activeFullScreenEffect() const
ElectricBorder
Definition globals.h:60
@ ElectricBottom
Definition globals.h:65
@ ElectricTop
Definition globals.h:61
PinchDirection
Definition globals.h:123
SwipeDirection
Directions for swipe gestures.
Definition globals.h:115
EffectsHandler * effects