kwin/src/wayland/clientconnection.h
Vlad Zahorodnii 43cfd25d27 Search for Xwayland surfaces differently
Currently, we store all surfaces in a single list and use linear search
to find the SurfaceInterface by its object id and client connection.

With this, we first search for the wl_resource object by its id. Once we
have a wl_resource, SurfaceInterface::get(wl_resource) can be used.

The main advantage of the proposed solution is that we don't need to
maintain a static list with all SurfaceInterface objects.
2021-07-28 14:38:01 +03:00

131 lines
3.7 KiB
C++

/*
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#pragma once
#include <sys/types.h>
#include <QObject>
#include <KWaylandServer/kwaylandserver_export.h>
struct wl_client;
struct wl_resource;
namespace KWaylandServer
{
class ClientConnectionPrivate;
class Display;
/**
* @brief Convenient Class which represents a wl_client.
*
* The ClientConnection gets automatically created for a wl_client when a wl_client is
* first used in the context of KWaylandServer. In particular the signal
* @link Display::clientConnected @endlink will be emitted.
*
* @see Display
*/
class KWAYLANDSERVER_EXPORT ClientConnection : public QObject
{
Q_OBJECT
public:
virtual ~ClientConnection();
/**
* Flushes the connection to this client. Ensures that all events are pushed to the client.
*/
void flush();
/**
* Get the wl_resource associated with the given @p id.
*/
wl_resource *getResource(quint32 id) const;
/**
* @returns the native wl_client this ClientConnection represents.
*/
wl_client *client() const;
/**
* @returns The Display this ClientConnection is connected to
*/
Display *display() const;
/**
* The pid of the ClientConnection endpoint.
*
* Please note: if the ClientConnection got created with @link Display::createClient @endlink
* the pid will be identical to the process running the KWaylandServer::Display.
*
* @returns The pid of the connection.
*/
pid_t processId() const;
/**
* The uid of the ClientConnection endpoint.
*
* Please note: if the ClientConnection got created with @link Display::createClient @endlink
* the uid will be identical to the process running the KWaylandServer::Display.
*
* @returns The uid of the connection.
*/
uid_t userId() const;
/**
* The gid of the ClientConnection endpoint.
*
* Please note: if the ClientConnection got created with @link Display::createClient @endlink
* the gid will be identical to the process running the KWaylandServer::Display.
*
* @returns The gid of the connection.
*/
gid_t groupId() const;
/**
* The absolute path to the executable.
*
* Please note: if the ClientConnection got created with @link Display::createClient @endlink
* the executablePath will be identical to the process running the KWaylandServer::Display.
*
* If the executable path cannot be resolved an empty QString is returned.
*
* @see processId
*/
QString executablePath() const;
/**
* Cast operator the native wl_client this ClientConnection represents.
*/
operator wl_client*();
/**
* Cast operator the native wl_client this ClientConnection represents.
*/
operator wl_client*() const;
/**
* Destroys this ClientConnection.
* This is a convenient wrapper around wl_client_destroy. The use case is in combination
* with ClientConnections created through @link Display::createClient @endlink. E.g. once
* the process for the ClientConnection exited, the ClientConnection needs to be destroyed, too.
*/
void destroy();
Q_SIGNALS:
/**
* This signal is emitted when the client is about to be destroyed.
*/
void aboutToBeDestroyed();
/**
* Signal emitted when the ClientConnection got disconnected from the server.
*/
void disconnected(KWaylandServer::ClientConnection*);
private:
friend class Display;
explicit ClientConnection(wl_client *c, Display *parent);
QScopedPointer<ClientConnectionPrivate> d;
};
}
Q_DECLARE_METATYPE(KWaylandServer::ClientConnection*)