1/*
2 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
7#include "surface_p.h"
8#include "surface.h"
9
10#include <QGuiApplication>
11#include <private/qwaylandwindow_p.h>
12#include <qpa/qplatformnativeinterface.h>
13
14namespace KWayland
15{
16namespace Client
17{
18
19// The file split from surface.cpp because QtWaylandClient private headers require to unset QT_NO_KEYWORDS.
20Surface *Surface::fromWindow(QWindow *window)
21{
22 if (!window) {
23 return nullptr;
24 }
25 QPlatformNativeInterface *native = qApp->platformNativeInterface();
26 if (!native) {
27 return nullptr;
28 }
29 window->create();
30 wl_surface *s = reinterpret_cast<wl_surface *>(native->nativeResourceForWindow(QByteArrayLiteral("surface"), window));
31 if (!s) {
32 return nullptr;
33 }
34 if (auto surface = get(native: s)) {
35 return surface;
36 }
37 Surface *surface = new Surface(window);
38 surface->d->surface.setup(pointer: s, foreign: true);
39
40 auto waylandWindow = dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle());
41 if (waylandWindow) {
42 connect(sender: waylandWindow, signal: &QtWaylandClient::QWaylandWindow::wlSurfaceDestroyed, context: surface, slot: &QObject::deleteLater);
43 }
44 return surface;
45}
46
47Surface *Surface::fromQtWinId(WId wid)
48{
49 QWindow *window = nullptr;
50
51 for (auto win : qApp->allWindows()) {
52 if (win->winId() == wid) {
53 window = win;
54 break;
55 }
56 }
57
58 if (!window) {
59 return nullptr;
60 }
61 return fromWindow(window);
62}
63
64}
65}
66

source code of kwayland/src/client/surface_p.cpp