2c6dacea38
- Initially set state (and type, and flags) in response to PlatformSurfaceCreated. We know reliably this will run before the window is mapped. - Drop the comment about removing setState() form showEvent handler, as we need it to avoid state loss in this scenario: <mgraesslin> the window gets mapped first time: everything is fine <mgraesslin> window gets unmapped: kwin removes the state as per spec <mgraesslin> qt gets change event and removes the states it doesn't care about <mgraesslin> qt maps window again and sets states <mgraesslin> we lost the state <mgraesslin> which means we need to set the state again from our side before(!) Qt sets it <mgraesslin> and before Qt maps the window
99 lines
3.3 KiB
C++
99 lines
3.3 KiB
C++
/********************************************************************************
|
|
* Copyright 2016 Eike Hein <hein@kde.org> *
|
|
* *
|
|
* This library is free software; you can redistribute it and/or *
|
|
* modify it under the terms of the GNU Library General Public *
|
|
* License as published by the Free Software Foundation; either *
|
|
* version 2 of the License, or (at your option) any later version. *
|
|
* *
|
|
* This library 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 *
|
|
* Library General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Library General Public License *
|
|
* along with this library; see the file COPYING.LIB. If not, write to *
|
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
|
|
* Boston, MA 02110-1301, USA. *
|
|
*********************************************************************************/
|
|
|
|
#include "dialogstatetest.h"
|
|
|
|
#include <KWindowSystem>
|
|
|
|
void DialogStateTest::initTestCase()
|
|
{
|
|
m_dialog = new PlasmaQuick::Dialog;
|
|
m_dialog->setLocation(Plasma::Types::TopEdge);
|
|
m_dialog->setGeometry(0, 0, 50, 50);
|
|
|
|
qRegisterMetaType<WId>("WId");
|
|
}
|
|
|
|
void DialogStateTest::cleanupTestCase()
|
|
{
|
|
delete m_dialog;
|
|
}
|
|
|
|
void DialogStateTest::windowState()
|
|
{
|
|
for (int i = 0; i <= 100; ++i) {
|
|
m_dialog->show();
|
|
|
|
QSignalSpy windowAddedSpy(KWindowSystem::self(), &KWindowSystem::windowAdded);
|
|
QVERIFY(windowAddedSpy.isValid());
|
|
QVERIFY(windowAddedSpy.wait());
|
|
|
|
bool windowAdded = false;
|
|
|
|
while (windowAddedSpy.count()) {
|
|
const QVariantList &arguments = windowAddedSpy.takeFirst();
|
|
|
|
if (arguments.at(0).value<WId>() == m_dialog->winId()) {
|
|
windowAdded = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
QVERIFY(windowAdded);
|
|
|
|
QVERIFY(verifyState(m_dialog));
|
|
|
|
m_dialog->hide();
|
|
|
|
QSignalSpy windowRemovedSpy(KWindowSystem::self(), &KWindowSystem::windowRemoved);
|
|
QVERIFY(windowRemovedSpy.isValid());
|
|
QVERIFY(windowRemovedSpy.wait());
|
|
|
|
bool windowRemoved = false;
|
|
|
|
while (windowRemovedSpy.count()) {
|
|
const QVariantList &arguments = windowRemovedSpy.takeFirst();
|
|
|
|
if (arguments.at(0).value<WId>() == m_dialog->winId()) {
|
|
windowRemoved = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
QVERIFY(windowRemoved);
|
|
}
|
|
}
|
|
|
|
bool DialogStateTest::verifyState(PlasmaQuick::Dialog *dialog) const
|
|
{
|
|
KWindowInfo info(dialog->winId(), NET::WMState);
|
|
|
|
if (!(info.state() & NET::SkipTaskbar)) {
|
|
return false;
|
|
}
|
|
|
|
if (!info.hasState(NET::SkipPager)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
QTEST_MAIN(DialogStateTest)
|