Handle registry_global out of constructor

Factory functions in QWaylandDisplay::registry_global() can be overridden.
Later, other classes instantiated in the registry_global can support
platform specific implementation with inheritance and some factory function.

Change-Id: I92ce574e049b8c91587687cc7c30611f3dfdbe56
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
Elvis Lee 2021-02-18 15:45:49 +09:00
parent a02c408afc
commit 8e336efb2d
3 changed files with 20 additions and 10 deletions

View File

@ -162,13 +162,6 @@ QWaylandDisplay::QWaylandDisplay(QWaylandIntegration *waylandIntegration)
if (!mXkbContext)
qCWarning(lcQpaWayland, "failed to create xkb context");
#endif
forceRoundTrip();
if (!mWaitingScreens.isEmpty()) {
// Give wl_output.done and zxdg_output_v1.done events a chance to arrive
forceRoundTrip();
}
}
QWaylandDisplay::~QWaylandDisplay(void)
@ -193,6 +186,18 @@ QWaylandDisplay::~QWaylandDisplay(void)
wl_display_disconnect(mDisplay);
}
// Steps which is called just after constructor. This separates registry_global() out of the constructor
// so that factory functions in integration can be overridden.
void QWaylandDisplay::initialize()
{
forceRoundTrip();
if (!mWaitingScreens.isEmpty()) {
// Give wl_output.done and zxdg_output_v1.done events a chance to arrive
forceRoundTrip();
}
}
void QWaylandDisplay::ensureScreen()
{
if (!mScreens.empty() || mPlaceholderScreen)

View File

@ -130,6 +130,8 @@ public:
QWaylandDisplay(QWaylandIntegration *waylandIntegration);
~QWaylandDisplay(void) override;
void initialize();
#if QT_CONFIG(xkbcommon)
struct xkb_context *xkbContext() const { return mXkbContext.get(); }
#endif

View File

@ -189,8 +189,11 @@ QPlatformNativeInterface *QWaylandIntegration::createPlatformNativeInterface()
return new QWaylandNativeInterface(this);
}
// Support platform specific initialization
void QWaylandIntegration::initializePlatform()
{
mDisplay->initialize();
mNativeInterface.reset(createPlatformNativeInterface());
initializeInputDeviceIntegration();
#if QT_CONFIG(clipboard)
@ -205,9 +208,6 @@ void QWaylandIntegration::initializePlatform()
void QWaylandIntegration::initialize()
{
// Support platform specicif initialization
initializePlatform();
QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::eventDispatcher;
QObject::connect(dispatcher, SIGNAL(aboutToBlock()), mDisplay.data(), SLOT(flushRequests()));
QObject::connect(dispatcher, SIGNAL(awake()), mDisplay.data(), SLOT(flushRequests()));
@ -216,6 +216,9 @@ void QWaylandIntegration::initialize()
QSocketNotifier *sn = new QSocketNotifier(fd, QSocketNotifier::Read, mDisplay.data());
QObject::connect(sn, SIGNAL(activated(QSocketDescriptor)), mDisplay.data(), SLOT(flushRequests()));
// Call after eventDispatcher is fully connected, for QWaylandDisplay::forceRoundTrip()
initializePlatform();
// Qt does not support running with no screens
mDisplay->ensureScreen();
}