diff options
author | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2019-06-26 09:47:03 +0200 |
---|---|---|
committer | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2019-08-19 14:13:50 +0200 |
commit | 37a03693f22cba7a17a5e7bdc3c340e7646aa6ef (patch) | |
tree | a273eae5ece3f4e89e9c40a36a6d9fc739011070 | |
parent | 3e96fa1df8d2bc0ec8ab66abae1f20439b786b40 (diff) | |
download | qtwayland-37a03693f22cba7a17a5e7bdc3c340e7646aa6ef.tar.gz |
Client: Emit wl_surface lifetime signals on QWaylandWindow
Recent changes in QtBase means QtWayland will have to follow the convention of
the rest of the QPA plugins and have QPlatformSurfaceEvent::SurfaceCreated and
SurfaceAboutToBeDestroyed follow the QPlatformWindow (QWaylandWindow) lifetime
and not the lifetime of wl_surface.
Some users were depending on those events to get notified about wl_surface
changes and used QPlatformNativeInterface in order to get the window's
underlying wl_surfaces in responses to the events.
The good news is that QPlatformNativeInterface is private (QPA) API, so we can
provide an alternative by exposing new private API, which is what this patch
does.
The QWaylandWindow::wlSurfaceDestroyed signal already exists in the dev branch
(introduced in eb66211ea9), so this is a backport of that signal as well as an
addition of a new QWaylandWindow::wlSurfaceCreated signal.
Task-number: QTBUG-76324
Change-Id: Ibc5748474cd52f5b9461fd1ad6cef973491174b1
Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
-rw-r--r-- | src/client/qwaylandwindow.cpp | 6 | ||||
-rw-r--r-- | src/client/qwaylandwindow_p.h | 4 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index 76d7715a..abc54f58 100644 --- a/src/client/qwaylandwindow.cpp +++ b/src/client/qwaylandwindow.cpp @@ -210,7 +210,9 @@ void QWaylandWindow::initWindow() void QWaylandWindow::initializeWlSurface() { + Q_ASSERT(!isInitialized()); init(mDisplay->createSurface(static_cast<QtWayland::wl_surface *>(this))); + emit wlSurfaceCreated(); } bool QWaylandWindow::shouldCreateShellSurface() const @@ -245,8 +247,10 @@ void QWaylandWindow::reset(bool sendDestroyEvent) mShellSurface = nullptr; delete mSubSurfaceWindow; mSubSurfaceWindow = nullptr; - if (isInitialized()) + if (isInitialized()) { + emit wlSurfaceDestroyed(); destroy(); + } mScreens.clear(); if (mFrameCallback) { diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h index 23432e39..ec9bd7d0 100644 --- a/src/client/qwaylandwindow_p.h +++ b/src/client/qwaylandwindow_p.h @@ -199,6 +199,10 @@ public: public slots: void applyConfigure(); +signals: + void wlSurfaceCreated(); + void wlSurfaceDestroyed(); + protected: void surface_enter(struct ::wl_output *output) override; void surface_leave(struct ::wl_output *output) override; |