kwin/src/wayland/xdgshell_interface.h
2021-04-29 11:45:00 +02:00

557 lines
16 KiB
C++

/*
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#pragma once
#include <KWaylandServer/kwaylandserver_export.h>
#include <QObject>
#include <QSharedDataPointer>
struct wl_resource;
namespace KWaylandServer
{
class Display;
class OutputInterface;
class SeatInterface;
class SurfaceInterface;
class XdgShellInterfacePrivate;
class XdgSurfaceInterfacePrivate;
class XdgToplevelInterfacePrivate;
class XdgPopupInterfacePrivate;
class XdgPositionerData;
class XdgToplevelInterface;
class XdgPopupInterface;
class XdgSurfaceInterface;
/**
* The XdgShellInterface class represents an extension for destrop-style user interfaces.
*
* The XdgShellInterface class provides a way for a client to extend a regular Wayland surface
* with functionality required to construct user interface elements, e.g. toplevel windows or
* menus.
*
* XdgShellInterface corresponds to the WaylandInterface \c xdg_wm_base.
*/
class KWAYLANDSERVER_EXPORT XdgShellInterface : public QObject
{
Q_OBJECT
public:
/**
* Constructs an XdgShellInterface object with the given wayland display \a display.
*/
XdgShellInterface(Display *display, QObject *parent = nullptr);
/**
* Destructs the XdgShellInterface object.
*/
~XdgShellInterface() override;
/**
* Returns the wayland display of the XdgShellInterface.
*/
Display *display() const;
/**
* Sends a ping event to the client with the given xdg-surface \a surface. If the client
* replies to the event within a reasonable amount of time, pongReceived signal will be
* emitted.
*/
quint32 ping(XdgSurfaceInterface *surface);
Q_SIGNALS:
/**
* This signal is emitted when a new XdgToplevelInterface object is created.
*/
void toplevelCreated(XdgToplevelInterface *toplevel);
/**
* This signal is emitted when a new XdgPopupInterface object is created.
*/
void popupCreated(XdgPopupInterface *popup);
/**
* This signal is emitted when the client has responded to a ping event with serial \a serial.
*/
void pongReceived(quint32 serial);
/**
* @todo Drop this signal.
*
* This signal is emitted when the client has not responded to a ping event with serial
* \a serial within a reasonable amount of time and the compositor gave up on it.
*/
void pingTimeout(quint32 serial);
/**
* This signal is emitted when the client has not responded to a ping event with serial
* \a serial within a reasonable amount of time.
*/
void pingDelayed(quint32 serial);
private:
QScopedPointer<XdgShellInterfacePrivate> d;
friend class XdgShellInterfacePrivate;
};
/**
* The XdgSurfaceInterface class provides a base set of functionality required to construct
* user interface elements.
*
* XdgSurfaceInterface corresponds to the Wayland interface \c xdg_surface.
*/
class KWAYLANDSERVER_EXPORT XdgSurfaceInterface : public QObject
{
Q_OBJECT
public:
/**
* Constructs an XdgSurfaceInterface for the given \a shell and \a surface.
*/
XdgSurfaceInterface(XdgShellInterface *shell, SurfaceInterface *surface,
::wl_resource *resource);
/**
* Destructs the XdgSurfaceInterface object.
*/
~XdgSurfaceInterface() override;
/**
* Returns the XdgToplevelInterface associated with this XdgSurfaceInterface.
*
* This method will return \c null if no xdg_toplevel object is associated with this surface.
*/
XdgToplevelInterface *toplevel() const;
/**
* Returns the XdgPopupInterface associated with this XdgSurfaceInterface.
*
* This method will return \c null if no xdg_popup object is associated with this surface.
*/
XdgPopupInterface *popup() const;
/**
* Returns the XdgShellInterface associated with this XdgSurfaceInterface.
*/
XdgShellInterface *shell() const;
/**
* Returns the SurfaceInterface assigned to this XdgSurfaceInterface.
*/
SurfaceInterface *surface() const;
/**
* Returns \c true if the surface has been configured; otherwise returns \c false.
*/
bool isConfigured() const;
/**
* Returns the window geometry of the XdgSurfaceInterface.
*
* This method will return an invalid QRect if the window geometry is not set by the client.
*/
QRect windowGeometry() const;
/**
* Returns the XdgSurfaceInterface for the specified wayland resource object \a resource.
*/
static XdgSurfaceInterface *get(::wl_resource *resource);
Q_SIGNALS:
/**
* This signal is emitted when a configure event with serial \a serial has been acknowledged.
*/
void configureAcknowledged(quint32 serial);
/**
* This signal is emitted when the window geometry has been changed.
*/
void windowGeometryChanged(const QRect &rect);
/**
* This signal is emitted when the surface has been unmapped and its state has been reset.
*/
void resetOccurred();
private:
QScopedPointer<XdgSurfaceInterfacePrivate> d;
friend class XdgSurfaceInterfacePrivate;
};
/**
* The XdgToplevelInterface class represents a surface with window-like functionality such
* as maximize, fullscreen, resizing, minimizing, etc.
*
* XdgToplevelInterface corresponds to the Wayland interface \c xdg_toplevel.
*/
class KWAYLANDSERVER_EXPORT XdgToplevelInterface : public QObject
{
Q_OBJECT
public:
enum State {
MaximizedHorizontal = 0x1,
MaximizedVertical = 0x2,
FullScreen = 0x4,
Resizing = 0x8,
Activated = 0x10,
TiledLeft = 0x20,
TiledTop = 0x40,
TiledRight = 0x80,
TiledBottom = 0x100,
Maximized = MaximizedHorizontal | MaximizedVertical,
};
Q_DECLARE_FLAGS(States, State)
/**
* Constructs an XdgToplevelInterface for the given xdg-surface \a surface.
*/
XdgToplevelInterface(XdgSurfaceInterface *surface, ::wl_resource *resource);
/**
* Destructs the XdgToplevelInterface object.
*/
~XdgToplevelInterface() override;
/**
* Returns the XdgShellInterface for this XdgToplevelInterface.
*
* This is equivalent to xdgSurface()->shell().
*/
XdgShellInterface *shell() const;
/**
* Returns the XdgSurfaceInterface associated with the XdgToplevelInterface.
*/
XdgSurfaceInterface *xdgSurface() const;
/**
* Returns the SurfaceInterface associated with the XdgToplevelInterface.
*/
SurfaceInterface *surface() const;
/**
* Returns the parent XdgToplevelInterface above which this toplevel is stacked.
*/
XdgToplevelInterface *parentXdgToplevel() const;
/**
* Returns \c true if the toplevel has been configured; otherwise returns \c false.
*/
bool isConfigured() const;
/**
* Returns the window title of the toplevel surface.
*/
QString windowTitle() const;
/**
* Returns the window class of the toplevel surface.
*/
QString windowClass() const;
/**
* Returns the minimum window geometry size of the toplevel surface.
*/
QSize minimumSize() const;
/**
* Returns the maximum window geometry size of the toplevel surface.
*/
QSize maximumSize() const;
/**
* Sends a configure event to the client. \a size specifies the new window geometry size. A size
* of zero means the client should decide its own window dimensions.
*/
quint32 sendConfigure(const QSize &size, const States &states);
/**
* Sends a close event to the client. The client may choose to ignore this request.
*/
void sendClose();
/**
* Returns the XdgToplevelInterface for the specified wayland resource object \a resource.
*/
static XdgToplevelInterface *get(::wl_resource *resource);
Q_SIGNALS:
/**
* This signal is emitted when the xdg-toplevel has commited the initial state and wants to
* be configured. After initializing the toplevel, you must send a configure event.
*/
void initializeRequested();
/**
* This signal is emitted when the toplevel has been unmapped and its state has been reset.
*/
void resetOccurred();
/**
* This signal is emitted when the toplevel's title has been changed.
*/
void windowTitleChanged(const QString &windowTitle);
/**
* This signal is emitted when the toplevel's application id has been changed.
*/
void windowClassChanged(const QString &windowClass);
/**
* This signal is emitted when the toplevel has requested the window menu to be shown at
* \a pos. The \a seat and the \a serial indicate the user action that triggerred the request.
*/
void windowMenuRequested(KWaylandServer::SeatInterface *seat, const QPoint &pos, quint32 serial);
/**
* This signal is emitted when the toplevel's minimum size has been changed.
*/
void minimumSizeChanged(const QSize &size);
/**
* This signal is emitted when the toplevel's maximum size has been changed.
*/
void maximumSizeChanged(const QSize &size);
/**
* This signal is emitted when the toplevel wants to be interactively moved. The \a seat and
* the \a serial indicate the user action in response to which this request has been issued.
*/
void moveRequested(KWaylandServer::SeatInterface *seat, quint32 serial);
/**
* This signal is emitted when the toplevel wants to be interactively resized along the
* specified window edges \a edges. The \a seat and the \a serial indicate the user action
* in response to which this request has been issued.
*/
void resizeRequested(KWaylandServer::SeatInterface *seat, Qt::Edges edges, quint32 serial);
/**
* This signal is emitted when the toplevel surface wants to become maximized.
*/
void maximizeRequested();
/**
* This signal is emitted when the toplevel surface wants to become unmaximized.
*/
void unmaximizeRequested();
/**
* This signal is emitted when the toplevel wants to be shown in the full screen mode.
*/
void fullscreenRequested(KWaylandServer::OutputInterface *output);
/**
* This signal is emitted when the toplevel surface wants to leave the full screen mode.
*/
void unfullscreenRequested();
/**
* This signal is emitted when the toplevel wants to be iconified.
*/
void minimizeRequested();
/**
* This signal is emitted when the parent toplevel has changed.
*/
void parentXdgToplevelChanged();
private:
QScopedPointer<XdgToplevelInterfacePrivate> d;
friend class XdgToplevelInterfacePrivate;
};
/**
* The XdgPositioner class provides a collection of rules for the placement of a popup surface.
*
* XdgPositioner corresponds to the Wayland interface \c xdg_positioner.
*/
class KWAYLANDSERVER_EXPORT XdgPositioner
{
public:
/**
* Constructs an incomplete XdgPositioner object.
*/
XdgPositioner();
/**
* Constructs a copy of the XdgPositioner object.
*/
XdgPositioner(const XdgPositioner &other);
/**
* Destructs the XdgPositioner object.
*/
~XdgPositioner();
/**
* Assigns the value of \a other to this XdgPositioner object.
*/
XdgPositioner &operator=(const XdgPositioner &other);
/**
* Returns \c true if the positioner object is complete; otherwise returns \c false.
*
* An xdg positioner considered complete if it has a valid size and a valid anchor rect.
*/
bool isComplete() const;
/**
* Returns the set of orientations along which the compositor may slide the popup to ensure
* that it is entirely inside the compositor's defined "work area."
*/
Qt::Orientations slideConstraintAdjustments() const;
/**
* Returns the set of orientations along which the compositor may flip the popup to ensure
* that it is entirely inside the compositor's defined "work area."
*/
Qt::Orientations flipConstraintAdjustments() const;
/**
* Returns the set of orientations along which the compositor can resize the popup to ensure
* that it is entirely inside the compositor's defined "work area."
*/
Qt::Orientations resizeConstraintAdjustments() const;
/**
* Returns the set of edges on the anchor rectangle that the surface should be positioned
* around.
*/
Qt::Edges anchorEdges() const;
/**
* Returns the direction in which the surface should be positioned, relative to the anchor
* point of the parent surface.
*/
Qt::Edges gravityEdges() const;
/**
* Returns the window geometry size of the surface that is to be positioned.
*/
QSize size() const;
/**
* Returns the anchor rectangle relative to the upper left corner of the window geometry of
* the parent surface that the popup should be positioned around.
*/
QRect anchorRect() const;
/**
* Returns the surface position offset relative to the position of the anchor on the anchor
* rectangle and the anchor on the surface.
*/
QPoint offset() const;
/**
* Returns whether the surface should respond to movements in its parent window.
*/
bool isReactive() const;
/**
* Returns the parent size to use when positioning the popup.
*/
QSize parentSize() const;
/**
* Returns the serial of the configure event for the parent window.
*/
quint32 parentConfigure() const;
/**
* Returns the current state of the xdg positioner object identified by \a resource.
*/
static XdgPositioner get(::wl_resource *resource);
private:
XdgPositioner(const QSharedDataPointer<XdgPositionerData> &data);
QSharedDataPointer<XdgPositionerData> d;
};
/**
* The XdgPopupInterface class represents a surface that can be used to implement context menus,
* popovers and other similar short-lived user interface elements.
*
* XdgPopupInterface corresponds to the Wayland interface \c xdg_popup.
*/
class KWAYLANDSERVER_EXPORT XdgPopupInterface : public QObject
{
Q_OBJECT
public:
XdgPopupInterface(XdgSurfaceInterface *surface, SurfaceInterface *parentSurface,
const XdgPositioner &positioner, ::wl_resource *resource);
/**
* Destructs the XdgPopupInterface object.
*/
~XdgPopupInterface() override;
XdgShellInterface *shell() const;
/**
* Returns the parent surface for this popup surface. If the initial state hasn't been
* committed yet, this function may return \c null.
*/
SurfaceInterface *parentSurface() const;
/**
* Returns the XdgSurfaceInterface associated with the XdgPopupInterface.
*/
XdgSurfaceInterface *xdgSurface() const;
/**
* Returns the SurfaceInterface associated with the XdgPopupInterface.
*/
SurfaceInterface *surface() const;
/**
* Returns the XdgPositioner assigned to this XdgPopupInterface.
*/
XdgPositioner positioner() const;
/**
* Returns \c true if the popup has been configured; otherwise returns \c false.
*/
bool isConfigured() const;
/**
* Sends a configure event to the client and returns the serial number of the event.
*/
quint32 sendConfigure(const QRect &rect);
/**
* Sends a popup done event to the client.
*/
void sendPopupDone();
/**
* Sends a popup repositioned event to the client.
*/
void sendRepositioned(quint32 token);
/**
* Returns the XdgPopupInterface for the specified wayland resource object \a resource.
*/
static XdgPopupInterface *get(::wl_resource *resource);
Q_SIGNALS:
/**
* This signal is emitted when the xdg-popup has commited the initial state and wants to
* be configured. After initializing the popup, you must send a configure event.
*/
void initializeRequested();
void grabRequested(SeatInterface *seat, quint32 serial);
void repositionRequested(quint32 token);
private:
QScopedPointer<XdgPopupInterfacePrivate> d;
friend class XdgPopupInterfacePrivate;
};
} // namespace KWaylandServer
Q_DECLARE_OPERATORS_FOR_FLAGS(KWaylandServer::XdgToplevelInterface::States)
Q_DECLARE_METATYPE(KWaylandServer::XdgToplevelInterface::State)
Q_DECLARE_METATYPE(KWaylandServer::XdgToplevelInterface::States)