diff --git a/effects/fadedesktop/package/contents/code/main.js b/effects/fadedesktop/package/contents/code/main.js --- 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 @@ 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; - } - 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; - } +"use strict"; - // 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; +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 (w.minimized) { - continue; + if (window.fadeInAnimation) { + if (redirect(window.fadeInAnimation, Effect.Forward)) { + return; + } + cancel(window.fadeInAnimation); } - - if (!w.isOnActivity(effects.currentActivity)){ - continue; + 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]; - 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 - }] - }); + // 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); } -}); +}; -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();