Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qwaylandclient.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "qwaylandclient.h"
5#include <QtCore/private/qobject_p.h>
6
7#include <QtWaylandCompositor/QWaylandCompositor>
8#include <QtWaylandCompositor/private/qwaylandcompositor_p.h>
9
10
11#include <wayland-server-core.h>
12#include <wayland-util.h>
13
15
17{
18public:
21 , client(_client)
22 {
23 // Save client credentials
24 wl_client_get_credentials(client, &pid, &uid, &gid);
25 }
26
28 {
29 }
30
31 static void client_destroy_callback(wl_listener *listener, void *data)
32 {
34
35 QWaylandClient *client = reinterpret_cast<Listener *>(listener)->parent;
36 Q_ASSERT(client != nullptr);
37 delete client;
38 }
39
41 wl_client *client = nullptr;
42
43 uid_t uid;
44 gid_t gid;
45 pid_t pid;
46
47 struct Listener {
48 wl_listener listener;
50 };
52
53 QWaylandClient::TextInputProtocols mTextInputProtocols = QWaylandClient::NoProtocol;
54};
55
80QWaylandClient::QWaylandClient(QWaylandCompositor *compositor, wl_client *client)
82{
83 Q_D(QWaylandClient);
84
85 // Destroy wrapper when the client goes away
86 d->listener.parent = this;
87 d->listener.listener.notify = QWaylandClientPrivate::client_destroy_callback;
88 wl_client_add_destroy_listener(client, &d->listener.listener);
89
91}
92
97{
98 Q_D(QWaylandClient);
99
100 // Remove listener from signal
101 wl_list_remove(&d->listener.listener.link);
102
103 QWaylandCompositorPrivate::get(d->compositor)->removeClient(this);
104}
105
112{
113 if (!wlClient)
114 return nullptr;
115
116 QWaylandClient *client = nullptr;
117
118 wl_listener *l = wl_client_get_destroy_listener(wlClient,
120 if (l)
121 client = reinterpret_cast<QWaylandClientPrivate::Listener *>(
122 wl_container_of(l, (QWaylandClientPrivate::Listener *)nullptr, listener))->parent;
123
124 if (!client) {
125 // The original idea was to create QWaylandClient instances when
126 // a client bound wl_compositor, but it's legal for a client to
127 // bind several times resulting in multiple QWaylandClient
128 // instances for the same wl_client therefore we create it from
129 // here on demand
130 client = new QWaylandClient(compositor, wlClient);
131 }
132
133 return client;
134}
135
148{
149 Q_D(const QWaylandClient);
150
151 return d->compositor;
152}
153
157wl_client *QWaylandClient::client() const
158{
159 Q_D(const QWaylandClient);
160
161 return d->client;
162}
163
177{
178 Q_D(const QWaylandClient);
179
180 return d->uid;
181}
182
196{
197 Q_D(const QWaylandClient);
198
199 return d->gid;
200}
201
215{
216 Q_D(const QWaylandClient);
217
218 return d->pid;
219}
220
231{
232 Q_D(QWaylandClient);
233
234 ::kill(d->pid, signal);
235}
236
247{
248 Q_D(QWaylandClient);
249 d->compositor->destroyClient(this);
250}
251
252QWaylandClient::TextInputProtocols QWaylandClient::textInputProtocols() const
253{
254 Q_D(const QWaylandClient);
255 return d->mTextInputProtocols;
256}
257
259{
260 Q_D(QWaylandClient);
261 if (d->mTextInputProtocols != p)
262 d->mTextInputProtocols = p;
263}
264
266
267#include "moc_qwaylandclient.cpp"
268
QObject * parent
Definition qobject.h:73
\inmodule QtCore
Definition qobject.h:103
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
QWaylandClientPrivate(QWaylandCompositor *compositor, wl_client *_client)
~QWaylandClientPrivate() override
QWaylandClient::TextInputProtocols mTextInputProtocols
QWaylandCompositor * compositor
static void client_destroy_callback(wl_listener *listener, void *data)
\qmltype WaylandClient \instantiates QWaylandClient \inqmlmodule QtWayland.Compositor
Q_INVOKABLE void kill(int signal=SIGTERM)
\qmlmethod void QtWayland.Compositor::WaylandClient::kill(signal)
qint64 userId
\qmlproperty int QtWayland.Compositor::WaylandClient::userId
void close()
\qmlmethod void QtWayland.Compositor::WaylandClient::close()
qint64 processId
\qmlproperty int QtWayland.Compositor::WaylandClient::processId \readonly
~QWaylandClient() override
Destroys the QWaylandClient.
void setTextInputProtocols(TextInputProtocols p)
QWaylandCompositor * compositor
\qmlproperty WaylandCompositor QtWayland.Compositor::WaylandClient::compositor
qint64 groupId
\qmlproperty int QtWayland.Compositor::WaylandClient::groupId \readonly
TextInputProtocols textInputProtocols() const
static QWaylandClient * fromWlClient(QWaylandCompositor *compositor, wl_client *wlClient)
Returns the QWaylandClient corresponding to the Wayland client wlClient and compositor.
wl_client * client() const
Returns the Wayland client of this QWaylandClient.
static QWaylandCompositorPrivate * get(QWaylandCompositor *compositor)
\qmltype WaylandCompositor \instantiates QWaylandCompositor \inqmlmodule QtWayland....
auto signal
Combined button and popup list for selecting options.
static QOpenGLCompositor * compositor
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat GLfloat p
[1]
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_UNUSED(x)
long long qint64
Definition qtypes.h:60