From 01b75b39bb62431211ae872da0fab35385b28295 Mon Sep 17 00:00:00 2001 From: Vlad Zagorodniy Date: Fri, 26 Oct 2018 23:09:22 +0300 Subject: [PATCH] [effects/fadedesktop] Rewrite it Summary: The primary reason for rewriting this effect was to clean up code and fix spawning of multiple animations for a single window when user cycles through virtual desktops very quickly. Visually, the rewritten version doesn't deviate from the old version. Reviewers: #kwin Subscribers: kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D16454 --- .../fadedesktop/package/contents/code/main.js | 184 +++++++++++------- 1 file changed, 114 insertions(+), 70 deletions(-) diff --git a/effects/fadedesktop/package/contents/code/main.js b/effects/fadedesktop/package/contents/code/main.js index 91c84b5f91..a2567ff960 100644 --- a/effects/fadedesktop/package/contents/code/main.js +++ b/effects/fadedesktop/package/contents/code/main.js @@ -4,6 +4,7 @@ Copyright (C) 2009 Lucas Murray Copyright (C) 2012 Martin Gräßlin + Copyright (C) 2018 Vlad Zagorodniy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,75 +19,118 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ -var duration; -function loadConfig() { - duration = animationTime(250); -} -loadConfig(); -effect.configChanged.connect(function() { - loadConfig(); -}); -effects['desktopChanged(int,int,KWin::EffectWindow*)'].connect(function(oldDesktop, newDesktop, movingWindow) { - if (effects.hasActiveFullScreenEffect && !effect.isActiveFullScreenEffect) { - return; + +"use strict"; + +var fadeDesktopEffect = { + duration: animationTime(250), + loadConfig: function () { + fadeDesktopEffect.duration = animationTime(250); + }, + fadeInWindow: function (window) { + if (window.fadeOutAnimation) { + if (redirect(window.fadeOutAnimation, Effect.Backward)) { + return; + } + cancel(window.fadeOutAnimation); + delete window.fadeOutAnimation; + } + if (window.fadeInAnimation) { + if (redirect(window.fadeInAnimation, Effect.Forward)) { + return; + } + cancel(window.fadeInAnimation); + } + window.fadeInAnimation = animate({ + window: window, + curve: QEasingCurve.Linear, + duration: fadeDesktopEffect.duration, + fullScreen: true, + keepAlive: false, + type: Effect.Opacity, + from: 0.0, + to: 1.0 + }); + }, + fadeOutWindow: function (window) { + if (window.fadeInAnimation) { + if (redirect(window.fadeInAnimation, Effect.Backward)) { + return; + } + cancel(window.fadeInAnimation); + delete window.fadeInAnimation; + } + if (window.fadeOutAnimation) { + if (redirect(window.fadeOutAnimation, Effect.Forward)) { + return; + } + cancel(window.fadeOutAnimation); + } + window.fadeOutAnimation = animate({ + window: window, + curve: QEasingCurve.Linear, + duration: fadeDesktopEffect.duration, + fullScreen: true, + keepAlive: false, + type: Effect.Opacity, + from: 1.0, + to: 0.0 + }); + }, + slotDesktopChanged: function (oldDesktop, newDesktop, movingWindow) { + if (effects.hasActiveFullScreenEffect && !effect.isActiveFullScreenEffect) { + return; + } + + var stackingOrder = effects.stackingOrder; + for (var i = 0; i < stackingOrder.length; ++i) { + var w = stackingOrder[i]; + + // Don't animate windows that have been moved to the current + // desktop, i.e. newDesktop. + if (w == movingWindow) { + continue; + } + + // If the window is not on the old and the new desktop or it's + // on both of them, then don't animate it. + var onOldDesktop = w.isOnDesktop(oldDesktop); + var onNewDesktop = w.isOnDesktop(newDesktop); + if (onOldDesktop == onNewDesktop) { + continue; + } + + if (w.minimized) { + continue; + } + + if (!w.isOnActivity(effects.currentActivity)){ + continue; + } + + if (onOldDesktop) { + fadeDesktopEffect.fadeOutWindow(w); + } else { + fadeDesktopEffect.fadeInWindow(w); + } + } + }, + slotIsActiveFullScreenEffectChanged: function () { + var isActiveFullScreen = effect.isActiveFullScreenEffect; + var stackingOrder = effects.stackingOrder; + for (var i = 0; i < stackingOrder.length; ++i) { + var w = stackingOrder[i]; + w.setData(Effect.WindowForceBlurRole, isActiveFullScreen); + w.setData(Effect.WindowForceBackgroundContrastRole, isActiveFullScreen); + } + }, + init: function () { + effect.configChanged.connect(fadeDesktopEffect.loadConfig); + effect.isActiveFullScreenEffectChanged.connect( + fadeDesktopEffect.slotIsActiveFullScreenEffectChanged); + effects['desktopChanged(int,int,KWin::EffectWindow*)'].connect( + fadeDesktopEffect.slotDesktopChanged); } - var stackingOrder = effects.stackingOrder; - for (var i = 0; i < stackingOrder.length; i++) { - var w = stackingOrder[i]; +}; - // Don't animate windows that have been moved to the current - // desktop, i.e. newDesktop. - if (w == movingWindow) { - continue; - } - - // If the window is not on the old and the new desktop or it's - // on both of them, then don't animate it. - var onOldDesktop = w.isOnDesktop(oldDesktop); - var onNewDesktop = w.isOnDesktop(newDesktop); - if (onOldDesktop == onNewDesktop) { - continue; - } - - if (w.minimized) { - continue; - } - - if (!w.isOnActivity(effects.currentActivity)){ - continue; - } - - if (onOldDesktop) { - animate({ - window: w, - duration: duration, - animations: [{ - type: Effect.Opacity, - to: 0.0, - fullScreen: true - }] - }); - } else { - animate({ - window: w, - duration: duration, - animations: [{ - type: Effect.Opacity, - to: 1.0, - from: 0.0, - fullScreen: true - }] - }); - } - } -}); - -effect.isActiveFullScreenEffectChanged.connect(function() { - var isActiveFullScreen = effect.isActiveFullScreenEffect; - var stackingOrder = effects.stackingOrder; - for (var i = 0; i < stackingOrder.length; i++) { - var w = stackingOrder[i]; - w.setData(Effect.WindowForceBlurRole, isActiveFullScreen); - w.setData(Effect.WindowForceBackgroundContrastRole, isActiveFullScreen); - } -}); +fadeDesktopEffect.init();