17#include "diminactiveconfig.h"
32static inline bool belongToSameGroup(
const EffectWindow *w1,
const EffectWindow *w2)
34 return w1 && w2 && w1->group() && w1->group() == w2->group();
43 this, &DimInactiveEffect::windowActivated);
45 this, &DimInactiveEffect::windowAdded);
47 this, &DimInactiveEffect::windowClosed);
49 this, &DimInactiveEffect::windowDeleted);
51 this, &DimInactiveEffect::activeFullScreenEffectChanged);
65 DimInactiveConfig::self()->read();
68 m_dimStrength = DimInactiveConfig::strength() / 100.0;
69 m_dimPanels = DimInactiveConfig::dimPanels();
70 m_dimDesktop = DimInactiveConfig::dimDesktop();
71 m_dimKeepAbove = DimInactiveConfig::dimKeepAbove();
72 m_dimByGroup = DimInactiveConfig::dimByGroup();
73 m_dimFullScreen = DimInactiveConfig::dimFullScreen();
77 m_activeWindowGroup = (m_dimByGroup && m_activeWindow)
78 ? m_activeWindow->
group()
81 m_fullScreenTransition.timeLine.setDuration(
82 std::chrono::milliseconds(
static_cast<int>(
animationTime(250))));
89 if (m_fullScreenTransition.active) {
90 m_fullScreenTransition.timeLine.advance(presentTime);
93 auto transitionIt = m_transitions.begin();
94 while (transitionIt != m_transitions.end()) {
95 (*transitionIt).advance(presentTime);
104 auto transitionIt = m_transitions.constFind(w);
105 if (transitionIt != m_transitions.constEnd()) {
106 const qreal transitionProgress = (*transitionIt).value();
107 dimWindow(data, m_dimStrength * transitionProgress);
112 auto forceIt = m_forceDim.constFind(w);
113 if (forceIt != m_forceDim.constEnd()) {
114 const qreal forcedStrength = *forceIt;
115 dimWindow(data, forcedStrength);
120 if (canDimWindow(w)) {
121 dimWindow(data, m_dimStrength);
129 if (m_fullScreenTransition.active) {
130 if (m_fullScreenTransition.timeLine.done()) {
131 m_fullScreenTransition.active =
false;
136 auto transitionIt = m_transitions.begin();
137 while (transitionIt != m_transitions.end()) {
139 if ((*transitionIt).done()) {
140 transitionIt = m_transitions.erase(transitionIt);
150void DimInactiveEffect::dimWindow(
WindowPaintData &data, qreal strength)
153 if (m_fullScreenTransition.active) {
154 dimFactor = 1.0 - m_fullScreenTransition.timeLine.value();
165bool DimInactiveEffect::canDimWindow(
const EffectWindow *w)
const
167 if (m_activeWindow == w) {
171 if (m_dimByGroup && belongToSameGroup(m_activeWindow, w)) {
175 if (w->isDock() && !m_dimPanels) {
179 if (w->isDesktop() && !m_dimDesktop) {
183 if (w->keepAbove() && !m_dimKeepAbove) {
187 if (w->isFullScreen() && !m_dimFullScreen) {
191 if (w->isPopupWindow() || w->isInputMethod()) {
195 if (w->isX11Client() && !w->isManaged()) {
199 return w->isNormalWindow()
206void DimInactiveEffect::scheduleInTransition(EffectWindow *w)
208 TimeLine &
timeLine = m_transitions[w];
210 std::chrono::milliseconds(
static_cast<int>(
animationTime(160))));
223void DimInactiveEffect::scheduleGroupInTransition(EffectWindow *w)
226 scheduleInTransition(w);
231 scheduleInTransition(w);
235 const auto members = w->group()->members();
236 for (EffectWindow *member : members) {
237 scheduleInTransition(member);
241void DimInactiveEffect::scheduleOutTransition(EffectWindow *w)
243 TimeLine &
timeLine = m_transitions[w];
245 std::chrono::milliseconds(
static_cast<int>(
animationTime(250))));
253void DimInactiveEffect::scheduleGroupOutTransition(EffectWindow *w)
256 scheduleOutTransition(w);
261 scheduleOutTransition(w);
265 const auto members = w->group()->members();
266 for (EffectWindow *member : members) {
267 scheduleOutTransition(member);
271void DimInactiveEffect::scheduleRepaint(EffectWindow *w)
283 const auto members = w->group()->members();
284 for (EffectWindow *member : members) {
285 member->addRepaintFull();
289void DimInactiveEffect::windowActivated(EffectWindow *w)
295 if (m_activeWindow == w) {
299 if (m_dimByGroup && belongToSameGroup(m_activeWindow, w)) {
310 if (m_dimByGroup && w->group() && w->group() == m_activeWindowGroup) {
315 EffectWindow *previousActiveWindow = m_activeWindow;
316 m_activeWindow = canDimWindow(w) ? w :
nullptr;
318 m_activeWindowGroup = (m_dimByGroup && m_activeWindow)
319 ? m_activeWindow->
group()
322 if (previousActiveWindow) {
323 scheduleGroupOutTransition(previousActiveWindow);
324 scheduleRepaint(previousActiveWindow);
327 if (m_activeWindow) {
328 scheduleGroupInTransition(m_activeWindow);
329 scheduleRepaint(m_activeWindow);
333void DimInactiveEffect::windowAdded(EffectWindow *w)
336 this, &DimInactiveEffect::updateActiveWindow);
338 this, &DimInactiveEffect::updateActiveWindow);
341void DimInactiveEffect::windowClosed(EffectWindow *w)
347 qreal forcedStrength = 0.0;
348 bool shouldForceDim =
false;
350 auto transitionIt = m_transitions.find(w);
351 if (transitionIt != m_transitions.end()) {
352 forcedStrength = m_dimStrength * (*transitionIt).value();
353 shouldForceDim =
true;
354 m_transitions.erase(transitionIt);
355 }
else if (m_activeWindow == w) {
356 forcedStrength = 0.0;
357 shouldForceDim =
true;
358 }
else if (m_dimByGroup && belongToSameGroup(m_activeWindow, w)) {
359 forcedStrength = 0.0;
360 shouldForceDim =
true;
361 }
else if (canDimWindow(w)) {
362 forcedStrength = m_dimStrength;
363 shouldForceDim =
true;
366 if (shouldForceDim) {
367 m_forceDim.insert(w, forcedStrength);
370 if (m_activeWindow == w) {
371 m_activeWindow =
nullptr;
375void DimInactiveEffect::windowDeleted(EffectWindow *w)
377 m_forceDim.remove(w);
383 m_transitions.remove(w);
384 if (m_activeWindow == w) {
385 m_activeWindow =
nullptr;
389void DimInactiveEffect::activeFullScreenEffectChanged()
391 if (m_fullScreenTransition.timeLine.done()) {
392 m_fullScreenTransition.timeLine.reset();
394 m_fullScreenTransition.timeLine.setDirection(
397 : TimeLine::Backward);
398 m_fullScreenTransition.active =
true;
403void DimInactiveEffect::updateActiveWindow(EffectWindow *w)
414 m_activeWindow =
nullptr;
416 m_activeWindow = canDimWindow(w) ? w :
nullptr;
421#include "moc_diminactive.cpp"
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime) override
void reconfigure(ReconfigureFlags flags) override
~DimInactiveEffect() override
void postPaintScreen() override
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data) override
Representation of a window used by/for Effect classes.
const EffectWindowGroup * group() const
void windowKeepAboveChanged(KWin::EffectWindow *w)
Q_SCRIPTABLE void addRepaintFull()
void windowFullScreenChanged(KWin::EffectWindow *w)
void windowDeleted(KWin::EffectWindow *w)
void windowClosed(KWin::EffectWindow *w)
void windowActivated(KWin::EffectWindow *w)
QList< EffectWindow * > stackingOrder
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion ®ion, WindowPaintData &data)
KWin::EffectWindow * activeWindow
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
KSharedConfigPtr config() const
void windowAdded(KWin::EffectWindow *w)
Q_SCRIPTABLE void addRepaintFull()
Effect * activeFullScreenEffect() const
void activeFullScreenEffectChanged()
void setDuration(std::chrono::milliseconds duration)
void setDirection(Direction direction)
void setEasingCurve(const QEasingCurve &easingCurve)
qreal multiplySaturation(qreal factor)
qreal multiplyBrightness(qreal factor)
static double animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime)