diff --git a/events.cpp b/events.cpp index 2575b63ce5..24dab56c11 100644 --- a/events.cpp +++ b/events.cpp @@ -66,6 +66,10 @@ along with this program. If not, see . #include "killwindow.h" #include "x11eventfilter.h" +#if HAVE_WAYLAND +#include +#endif + #ifndef XCB_GE_GENERIC #define XCB_GE_GENERIC 35 typedef struct xcb_ge_generic_event_t { @@ -1693,6 +1697,9 @@ void Toplevel::clientMessageEvent(xcb_client_message_event_t *e) { if (e->type == atoms->wl_surface_id) { m_surfaceId = e->data.data32[0]; +#if HAVE_WAYLAND + m_surface = KWayland::Server::SurfaceInterface::get(m_surfaceId); +#endif emit surfaceIdChanged(m_surfaceId); } } diff --git a/toplevel.h b/toplevel.h index 10b8b59af4..1ec0d129dc 100644 --- a/toplevel.h +++ b/toplevel.h @@ -41,6 +41,16 @@ along with this program. If not, see . // c++ #include +#if HAVE_WAYLAND +namespace KWayland +{ +namespace Server +{ +class SurfaceInterface; +} +} +#endif + namespace KWin { @@ -344,6 +354,10 @@ public: void setSkipCloseAnimation(bool set); quint32 surfaceId() const; +#if HAVE_WAYLAND + KWayland::Server::SurfaceInterface *surface() const; + void setSurface(KWayland::Server::SurfaceInterface *surface); +#endif virtual void sendPointerMoveEvent(const QPointF &globalPos); virtual void sendPointerEnterEvent(const QPointF &globalPos); @@ -482,6 +496,9 @@ private: int m_screen; bool m_skipCloseAnimation; quint32 m_surfaceId = 0; +#if HAVE_WAYLAND + KWayland::Server::SurfaceInterface *m_surface = nullptr; +#endif // when adding new data members, check also copyToDeleted() }; @@ -718,6 +735,18 @@ inline quint32 Toplevel::surfaceId() const return m_surfaceId; } +#if HAVE_WAYLAND +inline KWayland::Server::SurfaceInterface *Toplevel::surface() const +{ + return m_surface; +} + +inline void Toplevel::setSurface(KWayland::Server::SurfaceInterface *surface) +{ + m_surface = surface; +} +#endif + template inline T *Toplevel::findInList(const QList &list, std::function func) { diff --git a/wayland_server.cpp b/wayland_server.cpp index 914315af08..afdbbaa849 100644 --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -18,6 +18,8 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #include "wayland_server.h" +#include "toplevel.h" +#include "workspace.h" #include #include @@ -47,6 +49,22 @@ void WaylandServer::init(const QByteArray &socketName) m_display->start(); m_compositor = m_display->createCompositor(m_display); m_compositor->create(); + connect(m_compositor, &CompositorInterface::surfaceCreated, this, + [this] (SurfaceInterface *surface) { + // check whether we have a Toplevel with the Surface's id + Workspace *ws = Workspace::self(); + if (!ws) { + // it's possible that a Surface gets created before Workspace is created + return; + } + auto check = [surface] (const Toplevel *t) { + return t->surfaceId() == surface->id(); + }; + if (Toplevel *t = ws->findToplevel(check)) { + t->setSurface(surface); + } + } + ); m_shell = m_display->createShell(m_display); m_shell->create(); m_display->createShm();