Test Plan:
dbus-run-session ctest -R testMinimizeAnimation
Reviewers: #kwin
Subscribers: kwin
Tags: #kwin
Differential Revision: https://phabricator.kde.org/D18162
remotes/offline-stg/wilder
parent
872831fb15
commit
621370d729
2 changed files with 199 additions and 0 deletions
@ -0,0 +1,198 @@ |
||||
/********************************************************************
|
||||
KWin - the KDE window manager |
||||
This file is part of the KDE project. |
||||
|
||||
Copyright (C) 2019 Vlad Zagorodniy <vladzzag@gmail.com> |
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*********************************************************************/ |
||||
|
||||
#include "kwin_wayland_test.h" |
||||
|
||||
#include "abstract_client.h" |
||||
#include "composite.h" |
||||
#include "effectloader.h" |
||||
#include "effects.h" |
||||
#include "platform.h" |
||||
#include "scene.h" |
||||
#include "shell_client.h" |
||||
#include "wayland_server.h" |
||||
#include "workspace.h" |
||||
|
||||
#include "effect_builtins.h" |
||||
|
||||
#include <KWayland/Client/plasmashell.h> |
||||
#include <KWayland/Client/plasmawindowmanagement.h> |
||||
#include <KWayland/Client/surface.h> |
||||
#include <KWayland/Client/xdgshell.h> |
||||
|
||||
using namespace KWin; |
||||
|
||||
static const QString s_socketName = QStringLiteral("wayland_test_effects_minimize_animation-0"); |
||||
|
||||
class MinimizeAnimationTest : public QObject |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
private Q_SLOTS: |
||||
void initTestCase(); |
||||
void init(); |
||||
void cleanup(); |
||||
|
||||
void testMinimizeUnminimize_data(); |
||||
void testMinimizeUnminimize(); |
||||
}; |
||||
|
||||
void MinimizeAnimationTest::initTestCase() |
||||
{ |
||||
qputenv("XDG_DATA_DIRS", QCoreApplication::applicationDirPath().toUtf8()); |
||||
|
||||
qRegisterMetaType<KWin::AbstractClient *>(); |
||||
qRegisterMetaType<KWin::ShellClient *>(); |
||||
QSignalSpy workspaceCreatedSpy(kwinApp(), &Application::workspaceCreated); |
||||
QVERIFY(workspaceCreatedSpy.isValid()); |
||||
kwinApp()->platform()->setInitialWindowSize(QSize(1280, 1024)); |
||||
QVERIFY(waylandServer()->init(s_socketName.toLocal8Bit())); |
||||
|
||||
auto config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig); |
||||
KConfigGroup plugins(config, QStringLiteral("Plugins")); |
||||
ScriptedEffectLoader loader; |
||||
const auto builtinNames = BuiltInEffects::availableEffectNames() << loader.listOfKnownEffects(); |
||||
for (const QString &name : builtinNames) { |
||||
plugins.writeEntry(name + QStringLiteral("Enabled"), false); |
||||
} |
||||
config->sync(); |
||||
kwinApp()->setConfig(config); |
||||
|
||||
qputenv("KWIN_COMPOSE", QByteArrayLiteral("O2")); |
||||
qputenv("KWIN_EFFECTS_FORCE_ANIMATIONS", QByteArrayLiteral("1")); |
||||
|
||||
kwinApp()->start(); |
||||
QVERIFY(workspaceCreatedSpy.wait()); |
||||
waylandServer()->initWorkspace(); |
||||
|
||||
auto scene = Compositor::self()->scene(); |
||||
QVERIFY(scene); |
||||
QCOMPARE(scene->compositingType(), OpenGL2Compositing); |
||||
} |
||||
|
||||
void MinimizeAnimationTest::init() |
||||
{ |
||||
QVERIFY(Test::setupWaylandConnection( |
||||
Test::AdditionalWaylandInterface::PlasmaShell | |
||||
Test::AdditionalWaylandInterface::WindowManagement |
||||
)); |
||||
} |
||||
|
||||
void MinimizeAnimationTest::cleanup() |
||||
{ |
||||
auto effectsImpl = qobject_cast<EffectsHandlerImpl *>(effects); |
||||
QVERIFY(effectsImpl); |
||||
effectsImpl->unloadAllEffects(); |
||||
QVERIFY(effectsImpl->loadedEffects().isEmpty()); |
||||
|
||||
Test::destroyWaylandConnection(); |
||||
} |
||||
|
||||
void MinimizeAnimationTest::testMinimizeUnminimize_data() |
||||
{ |
||||
QTest::addColumn<QString>("effectName"); |
||||
|
||||
QTest::newRow("Magic Lamp") << QStringLiteral("magiclamp"); |
||||
QTest::newRow("Squash") << QStringLiteral("kwin4_effect_squash"); |
||||
} |
||||
|
||||
void MinimizeAnimationTest::testMinimizeUnminimize() |
||||
{ |
||||
// This test verifies that a minimize effect tries to animate a client
|
||||
// when it's minimized or unminimized.
|
||||
|
||||
using namespace KWayland::Client; |
||||
|
||||
QSignalSpy plasmaWindowCreatedSpy(Test::waylandWindowManagement(), &PlasmaWindowManagement::windowCreated); |
||||
QVERIFY(plasmaWindowCreatedSpy.isValid()); |
||||
|
||||
// Create a panel at the top of the screen.
|
||||
const QRect panelRect = QRect(0, 0, 1280, 36); |
||||
QScopedPointer<Surface> panelSurface(Test::createSurface()); |
||||
QVERIFY(!panelSurface.isNull()); |
||||
QScopedPointer<XdgShellSurface> panelShellSurface(Test::createXdgShellStableSurface(panelSurface.data())); |
||||
QVERIFY(!panelShellSurface.isNull()); |
||||
QScopedPointer<PlasmaShellSurface> plasmaPanelShellSurface(Test::waylandPlasmaShell()->createSurface(panelSurface.data())); |
||||
QVERIFY(!plasmaPanelShellSurface.isNull()); |
||||
plasmaPanelShellSurface->setRole(PlasmaShellSurface::Role::Panel); |
||||
plasmaPanelShellSurface->setPosition(panelRect.topLeft()); |
||||
plasmaPanelShellSurface->setPanelBehavior(PlasmaShellSurface::PanelBehavior::AlwaysVisible); |
||||
ShellClient *panel = Test::renderAndWaitForShown(panelSurface.data(), panelRect.size(), Qt::blue); |
||||
QVERIFY(panel); |
||||
QVERIFY(panel->isDock()); |
||||
QCOMPARE(panel->geometry(), panelRect); |
||||
QVERIFY(plasmaWindowCreatedSpy.wait()); |
||||
QCOMPARE(plasmaWindowCreatedSpy.count(), 1); |
||||
|
||||
// Create the test client.
|
||||
QScopedPointer<Surface> surface(Test::createSurface()); |
||||
QVERIFY(!surface.isNull()); |
||||
QScopedPointer<XdgShellSurface> shellSurface(Test::createXdgShellStableSurface(surface.data())); |
||||
QVERIFY(!shellSurface.isNull()); |
||||
ShellClient *client = Test::renderAndWaitForShown(surface.data(), QSize(100, 50), Qt::red); |
||||
QVERIFY(client); |
||||
QVERIFY(plasmaWindowCreatedSpy.wait()); |
||||
QCOMPARE(plasmaWindowCreatedSpy.count(), 2); |
||||
|
||||
// We have to set the minimized geometry because the squash effect needs it,
|
||||
// otherwise it won't start animation.
|
||||
auto window = plasmaWindowCreatedSpy.last().first().value<PlasmaWindow *>(); |
||||
QVERIFY(window); |
||||
const QRect iconRect = QRect(0, 0, 42, 36); |
||||
window->setMinimizedGeometry(panelSurface.data(), iconRect); |
||||
Test::flushWaylandConnection(); |
||||
QTRY_COMPARE(client->iconGeometry(), iconRect.translated(panel->geometry().topLeft())); |
||||
|
||||
// Load effect that will be tested.
|
||||
QFETCH(QString, effectName); |
||||
auto effectsImpl = qobject_cast<EffectsHandlerImpl *>(effects); |
||||
QVERIFY(effectsImpl); |
||||
QVERIFY(effectsImpl->loadEffect(effectName)); |
||||
QCOMPARE(effectsImpl->loadedEffects().count(), 1); |
||||
QCOMPARE(effectsImpl->loadedEffects().first(), effectName); |
||||
Effect *effect = effectsImpl->findEffect(effectName); |
||||
QVERIFY(effect); |
||||
QVERIFY(!effect->isActive()); |
||||
|
||||
// Start the minimize animation.
|
||||
client->minimize(); |
||||
QVERIFY(effect->isActive()); |
||||
|
||||
// Eventually, the animation will be complete.
|
||||
QTRY_VERIFY(!effect->isActive()); |
||||
|
||||
// Start the unminimize animation.
|
||||
client->unminimize(); |
||||
QVERIFY(effect->isActive()); |
||||
|
||||
// Eventually, the animation will be complete.
|
||||
QTRY_VERIFY(!effect->isActive()); |
||||
|
||||
// Destroy the panel.
|
||||
panelSurface.reset(); |
||||
QVERIFY(Test::waitForWindowDestroyed(panel)); |
||||
|
||||
// Destroy the test client.
|
||||
surface.reset(); |
||||
QVERIFY(Test::waitForWindowDestroyed(client)); |
||||
} |
||||
|
||||
WAYLANDTEST_MAIN(MinimizeAnimationTest) |
||||
#include "minimize_animation_test.moc" |
||||
Loading…
Reference in new issue