diff --git a/effects/CMakeLists.txt b/effects/CMakeLists.txt index e3beebf2ca..0e5ed97e44 100644 --- a/effects/CMakeLists.txt +++ b/effects/CMakeLists.txt @@ -129,6 +129,7 @@ add_subdirectory( fade ) add_subdirectory( fadedesktop ) add_subdirectory( login ) add_subdirectory( maximize ) +add_subdirectory( morphingpopups ) add_subdirectory( scalein ) add_subdirectory( translucency ) add_subdirectory( windowaperture ) diff --git a/effects/morphingpopups/CMakeLists.txt b/effects/morphingpopups/CMakeLists.txt new file mode 100644 index 0000000000..28f40b3371 --- /dev/null +++ b/effects/morphingpopups/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory( package ) diff --git a/effects/morphingpopups/package/CMakeLists.txt b/effects/morphingpopups/package/CMakeLists.txt new file mode 100644 index 0000000000..1a804f51d0 --- /dev/null +++ b/effects/morphingpopups/package/CMakeLists.txt @@ -0,0 +1,6 @@ +install(DIRECTORY contents DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/effects/kwin4_effect_morphingpopups) +install(FILES metadata.desktop DESTINATION ${DATA_INSTALL_DIR}/${KWIN_NAME}/effects/kwin4_effect_morphingpopups) + +install(FILES metadata.desktop + DESTINATION ${SERVICES_INSTALL_DIR}/${KWIN_NAME} + RENAME kwin4_effect_morphingpopups.desktop) diff --git a/effects/morphingpopups/package/contents/code/morphingpopups.js b/effects/morphingpopups/package/contents/code/morphingpopups.js new file mode 100644 index 0000000000..ce6ad862a3 --- /dev/null +++ b/effects/morphingpopups/package/contents/code/morphingpopups.js @@ -0,0 +1,134 @@ +/******************************************************************** + This file is part of the KDE project. + + Copyright (C) 2012 Martin Gräßlin + Copyright (C) 2016 Marco Martin + +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 +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +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 . +*********************************************************************/ +/*global effect, effects, animate, animationTime, Effect*/ +var morphingEffect = { + duration: animationTime(150), + loadConfig: function () { + "use strict"; + morphingEffect.duration = animationTime(150); + }, + cleanup: function(window) { + "use strict"; + + delete window.moveAnimation; + delete window.fadeAnimation; + }, + geometryChange: function (window, oldGeometry) { + "use strict"; + + //only tooltips and notifications + if (!window.tooltip && !window.notification) { + return; + } + + var newGeometry = window.geometry; + + //only do the transition for near enough tooltips, + //don't cross the whole screen: ugly + var distance = Math.abs(oldGeometry.x - newGeometry.x) + Math.abs(oldGeometry.y - newGeometry.y); + + if (distance > (newGeometry.width + newGeometry.height) * 2) { + return; + //Also don't animate very small steps + } else if (distance < 10) { + return; + } + + //don't resize it "too much", set as four times + if ((newGeometry.width / oldGeometry.width) > 4 || + (oldGeometry.width / newGeometry.width) > 4 || + (newGeometry.height / oldGeometry.height) > 4 || + (oldGeometry.height / newGeometry.height) > 4) { + return; + } + + //WindowForceBackgroundContrastRole + window.setData(7, true); + //WindowForceBlurRole + window.setData(5, true); + + + if (window.moveAnimation) { + if (window.moveAnimation[0]) { + retarget(window.moveAnimation[0], { + value1: newGeometry.width, + value2: newGeometry.height + }, morphingEffect.duration); + } + if (window.moveAnimation[1]) { + retarget(window.moveAnimation[1], { + value1: newGeometry.x + newGeometry.width/2, + value2: newGeometry.y + newGeometry.height / 2 + }, morphingEffect.duration); + } + + } else { + window.moveAnimation = animate({ + window: window, + duration: morphingEffect.duration, + animations: [{ + type: Effect.Size, + to: { + value1: newGeometry.width, + value2: newGeometry.height + }, + from: { + value1: oldGeometry.width, + value2: oldGeometry.height + } + }, { + type: Effect.Position, + to: { + value1: newGeometry.x + newGeometry.width / 2, + value2: newGeometry.y + newGeometry.height / 2 + }, + from: { + value1: oldGeometry.x + oldGeometry.width / 2, + value2: oldGeometry.y + oldGeometry.height / 2 + } + }] + }); + + } + + if (window.fadeAnimation) { + retarget(window.fadeAnimation[0], 1.0, morphingEffect.duration); + + } else { + window.fadeAnimation = animate({ + window: window, + duration: morphingEffect.duration, + animations: [{ + type: Effect.CrossFadePrevious, + to: 1.0, + from: 0.0 + }] + }); + } + }, + + init: function () { + "use strict"; + effect.configChanged.connect(morphingEffect.loadConfig); + effects.windowGeometryShapeChanged.connect(morphingEffect.geometryChange); + effect.animationEnded.connect(morphingEffect.cleanup); + } +}; +morphingEffect.init(); diff --git a/effects/morphingpopups/package/metadata.desktop b/effects/morphingpopups/package/metadata.desktop new file mode 100644 index 0000000000..40cdf5bf0d --- /dev/null +++ b/effects/morphingpopups/package/metadata.desktop @@ -0,0 +1,21 @@ +[Desktop Entry] +Comment=Cross fade animation when Tooltips or Notifications change their geometry +Encoding=UTF-8 +Icon=preferences-system-windows-effect-morphingpopups +Name=Morphing popups +Type=Service +X-KDE-ParentApp= +X-KDE-PluginInfo-Author=Marco Martin +X-KDE-PluginInfo-Category=Appearance +X-KDE-PluginInfo-Email=mart@kde.org +X-KDE-PluginInfo-License=GPL +X-KDE-PluginInfo-Name=kwin4_effect_morphingpopups +X-KDE-PluginInfo-Version=1 +X-KDE-PluginInfo-Website= +X-KDE-ServiceTypes=KWin/Effect +X-KDE-PluginInfo-EnabledByDefault=true +X-KDE-Ordering=60 +X-Plasma-API=javascript +X-Plasma-MainScript=code/morphingpopups.js +X-Plasma-RemoteLocation= +X-KWin-Video-Url=http://files.kde.org/plasma/kwin/effect-videos/morphingpopups.ogv