Fix events being processed on application start
Commit ef2efafcc6
introduced a call to
QWindowSystemInterface::sendWindowSystemEvents() in
QGuiApplicationPrivate::init(), which in its implementation ends up calling
sendPostedEvents() before flushing and processing any pending (internal) window
system events.
This patch changes the call in init() to use
QWindowSystemInterface::flushWindowSystemEvents() instead, which is more gentle
in that regard.
The provided unit test verifies that no posted events are processed during the
execution of the QGuiApplication constructor while at the same time verifying
what the original changed tried to do: Allow a generic plugin to provide window
system specific defaults that are implemented using the event queue of
QWindowSystemInterface.
Task-number: QTBUG-26886
Change-Id: I129a907c00d947df60fe1a02efc67857580fce24
Reviewed-by: David Faure <faure@kde.org>
This commit is contained in:
parent
aad58ac87e
commit
c4e736cf9d
@ -905,7 +905,7 @@ void QGuiApplicationPrivate::init()
|
||||
|
||||
is_app_running = true;
|
||||
init_plugins(pluginList);
|
||||
QWindowSystemInterface::sendWindowSystemEvents(QEventLoop::AllEvents);
|
||||
QWindowSystemInterface::flushWindowSystemEvents();
|
||||
}
|
||||
|
||||
extern void qt_cleanupFontDatabase();
|
||||
|
3
tests/auto/gui/kernel/qguiapplication/testplugin.json
Normal file
3
tests/auto/gui/kernel/qguiapplication/testplugin.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"Keys": [ "testplugin" ]
|
||||
}
|
@ -44,6 +44,7 @@
|
||||
#include <QtGui/QGuiApplication>
|
||||
#include <QtGui/QWindow>
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
#include <qgenericplugin.h>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
@ -61,6 +62,7 @@ private slots:
|
||||
void keyboardModifiers();
|
||||
void modalWindow();
|
||||
void quitOnLastWindowClosed();
|
||||
void genericPluginsAndWindowSystemEvents();
|
||||
};
|
||||
|
||||
void tst_QGuiApplication::displayName()
|
||||
@ -568,6 +570,74 @@ void tst_QGuiApplication::quitOnLastWindowClosed()
|
||||
}
|
||||
}
|
||||
|
||||
static Qt::ScreenOrientation testOrientationToSend = Qt::PrimaryOrientation;
|
||||
|
||||
class TestPlugin : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
TestPlugin()
|
||||
{
|
||||
QScreen* screen = QGuiApplication::primaryScreen();
|
||||
// Make sure the orientation we want to send doesn't get filtered out.
|
||||
screen->setOrientationUpdateMask(screen->orientationUpdateMask() | testOrientationToSend);
|
||||
QWindowSystemInterface::handleScreenOrientationChange(screen, testOrientationToSend);
|
||||
}
|
||||
};
|
||||
|
||||
class TestPluginFactory : public QGenericPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QGenericPluginFactoryInterface" FILE "testplugin.json")
|
||||
public:
|
||||
QObject* create(const QString &key, const QString &)
|
||||
{
|
||||
if (key == "testplugin")
|
||||
return new TestPlugin;
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
class TestEventReceiver : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
int customEvents;
|
||||
|
||||
TestEventReceiver()
|
||||
: customEvents(0)
|
||||
{}
|
||||
|
||||
virtual void customEvent(QEvent *)
|
||||
{
|
||||
customEvents++;
|
||||
}
|
||||
};
|
||||
|
||||
#include "tst_qguiapplication.moc"
|
||||
|
||||
void tst_QGuiApplication::genericPluginsAndWindowSystemEvents()
|
||||
{
|
||||
testOrientationToSend = Qt::InvertedLandscapeOrientation;
|
||||
|
||||
TestEventReceiver testReceiver;
|
||||
QCoreApplication::postEvent(&testReceiver, new QEvent(QEvent::User));
|
||||
QCOMPARE(testReceiver.customEvents, 0);
|
||||
|
||||
QStaticPlugin testPluginInfo;
|
||||
testPluginInfo.instance = qt_plugin_instance;
|
||||
testPluginInfo.metaData = qt_plugin_query_metadata;
|
||||
qRegisterStaticPluginFunction(testPluginInfo);
|
||||
int argc = 3;
|
||||
char *argv[] = { const_cast<char*>("tst_qguiapplication"), const_cast<char*>("-plugin"), const_cast<char*>("testplugin") };
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QVERIFY(QGuiApplication::primaryScreen());
|
||||
QVERIFY(QGuiApplication::primaryScreen()->orientation() == testOrientationToSend);
|
||||
|
||||
QCOMPARE(testReceiver.customEvents, 0);
|
||||
QCoreApplication::sendPostedEvents(&testReceiver);
|
||||
QCOMPARE(testReceiver.customEvents, 1);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QGuiApplication)
|
||||
#include "tst_qguiapplication.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user