diff --git a/autotests/integration/effects/CMakeLists.txt b/autotests/integration/effects/CMakeLists.txt --- a/autotests/integration/effects/CMakeLists.txt +++ b/autotests/integration/effects/CMakeLists.txt @@ -3,3 +3,4 @@ integrationTest(NAME testSlidingPopups SRCS slidingpopups_test.cpp LIBS XCB::ICCCM) endif() integrationTest(NAME testFade SRCS fade_test.cpp) +integrationTest(WAYLAND_ONLY NAME testEffectWindowGeometry SRCS windowgeometry_test.cpp) diff --git a/autotests/integration/effects/windowgeometry_test.cpp b/autotests/integration/effects/windowgeometry_test.cpp new file mode 100644 --- /dev/null +++ b/autotests/integration/effects/windowgeometry_test.cpp @@ -0,0 +1,99 @@ +/******************************************************************** +KWin - the KDE window manager +This file is part of the KDE project. + +Copyright (C) 2017 Martin Flöser + +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 . +*********************************************************************/ +#include "kwin_wayland_test.h" +#include "composite.h" +#include "effects.h" +#include "effectloader.h" +#include "cursor.h" +#include "platform.h" +#include "shell_client.h" +#include "wayland_server.h" +#include "workspace.h" +#include "effect_builtins.h" + +#include + +#include +#include +#include + +using namespace KWin; +using namespace KWayland::Client; +static const QString s_socketName = QStringLiteral("wayland_test_effects_windowgeometry-0"); + +class WindowGeometryTest : public QObject +{ +Q_OBJECT +private Q_SLOTS: + void initTestCase(); + void init(); + void cleanup(); + + void testStartup(); +}; + +void WindowGeometryTest::initTestCase() +{ + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + QSignalSpy workspaceCreatedSpy(kwinApp(), &Application::workspaceCreated); + QVERIFY(workspaceCreatedSpy.isValid()); + kwinApp()->platform()->setInitialWindowSize(QSize(1280, 1024)); + QVERIFY(waylandServer()->init(s_socketName.toLocal8Bit())); + + // disable all effects - we don't want to have it interact with the rendering + auto config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig); + KConfigGroup plugins(config, QStringLiteral("Plugins")); + ScriptedEffectLoader loader; + const auto builtinNames = BuiltInEffects::availableEffectNames() << loader.listOfKnownEffects(); + for (QString name : builtinNames) { + plugins.writeEntry(name + QStringLiteral("Enabled"), false); + } + plugins.writeEntry(BuiltInEffects::nameForEffect(BuiltInEffect::WindowGeometry) + QStringLiteral("Enabled"), true); + + config->sync(); + kwinApp()->setConfig(config); + + qputenv("KWIN_EFFECTS_FORCE_ANIMATIONS", "1"); + kwinApp()->start(); + QVERIFY(workspaceCreatedSpy.wait()); + QVERIFY(KWin::Compositor::self()); +} + +void WindowGeometryTest::init() +{ + QVERIFY(Test::setupWaylandConnection()); +} + +void WindowGeometryTest::cleanup() +{ + Test::destroyWaylandConnection(); +} + +void WindowGeometryTest::testStartup() +{ + // just a test to load the effect to verify it doesn't crash + EffectsHandlerImpl *e = static_cast(effects); + QVERIFY(e->isEffectLoaded(BuiltInEffects::nameForEffect(BuiltInEffect::WindowGeometry))); +} + +WAYLANDTEST_MAIN(WindowGeometryTest) +#include "windowgeometry_test.moc" diff --git a/effects/windowgeometry/windowgeometry.h b/effects/windowgeometry/windowgeometry.h --- a/effects/windowgeometry/windowgeometry.h +++ b/effects/windowgeometry/windowgeometry.h @@ -59,8 +59,9 @@ void slotWindowFinishUserMovedResized(KWin::EffectWindow *w); void slotWindowStepUserMovedResized(KWin::EffectWindow *w, const QRect &geometry); private: + void createFrames(); EffectWindow *myResizeWindow; - EffectFrame *myMeasure[3]; + EffectFrame *myMeasure[3] = {nullptr, nullptr, nullptr}; QRect myOriginalGeometry, myCurrentGeometry; QRect myExtraDirtyArea; bool iAmActive, iAmActivated, iHandleMoves, iHandleResizes; diff --git a/effects/windowgeometry/windowgeometry.cpp b/effects/windowgeometry/windowgeometry.cpp --- a/effects/windowgeometry/windowgeometry.cpp +++ b/effects/windowgeometry/windowgeometry.cpp @@ -48,15 +48,6 @@ " %3 and %4 are the resp. increments - avoid reformatting or suffixes like 'px'", \ "X: %1 (%3)\nY: %2 (%4)" reconfigure(ReconfigureAll); - QFont fnt; fnt.setBold(true); fnt.setPointSize(12); - for (int i = 0; i < 3; ++i) { - myMeasure[i] = effects->effectFrame(EffectFrameUnstyled, false); - myMeasure[i]->setFont(fnt); - } - myMeasure[0]->setAlignment(Qt::AlignLeft | Qt::AlignTop); - myMeasure[1]->setAlignment(Qt::AlignCenter); - myMeasure[2]->setAlignment(Qt::AlignRight | Qt::AlignBottom); - QAction* a = new QAction(this); a->setObjectName(QStringLiteral("WindowGeometry")); a->setText(i18n("Toggle window geometry display (effect only)")); @@ -78,6 +69,22 @@ delete myMeasure[i]; } +void WindowGeometry::createFrames() +{ + if (myMeasure[0]) { + return; + } + QFont fnt; fnt.setBold(true); fnt.setPointSize(12); + for (int i = 0; i < 3; ++i) { + myMeasure[i] = effects->effectFrame(EffectFrameUnstyled, false); + myMeasure[i]->setFont(fnt); + } + myMeasure[0]->setAlignment(Qt::AlignLeft | Qt::AlignTop); + myMeasure[1]->setAlignment(Qt::AlignCenter); + myMeasure[2]->setAlignment(Qt::AlignRight | Qt::AlignBottom); + +} + void WindowGeometry::reconfigure(ReconfigureFlags) { WindowGeometryConfiguration::self()->read(); @@ -97,6 +104,7 @@ void WindowGeometry::toggle() { iAmActivated = !iAmActivated; + createFrames(); } void WindowGeometry::slotWindowStartUserMovedResized(EffectWindow *w) @@ -108,6 +116,7 @@ if (w->isUserMove() && !iHandleMoves) return; + createFrames(); iAmActive = true; myResizeWindow = w; myOriginalGeometry = w->geometry();