KWin
Loading...
Searching...
No Matches
xdgtopleveldrag_v1.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2023 David Redondo <kde@david-redondo.de>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6
8#include "dataoffer.h"
9#include "datasource.h"
10#include "datasource_p.h"
11#include "display.h"
12#include "surface.h"
13#include "utils/resource.h"
14#include "xdgshell.h"
15
16#include <qwayland-server-xdg-toplevel-drag-v1.h>
17
18#include <QPointer>
19
20#include <memory>
21
22namespace KWin
23{
24constexpr int version = 1;
25
26class XdgToplevelDragV1InterfacePrivate : public QtWaylandServer::xdg_toplevel_drag_v1
27{
28public:
30 : xdg_toplevel_drag_v1(resource)
31 , q(q)
32 {
33 }
35 QPointer<DataSourceInterface> dataSource;
36 QPointer<XdgToplevelInterface> toplevel;
37 QPoint pos;
38
39private:
40 void xdg_toplevel_drag_v1_attach(Resource *resource, wl_resource *toplevelResource, int32_t x_offset, int32_t y_offset) override
41 {
42 if (toplevel) {
43 wl_resource_post_error(resource->handle, error_toplevel_attached, "Valid toplevel already attached");
44 return;
45 }
46 toplevel = XdgToplevelInterface::get(toplevelResource);
47 QObject::connect(toplevel, &XdgToplevelInterface::resetOccurred, q, [this] {
48 toplevel = nullptr;
49 });
50 pos = QPoint(x_offset, y_offset);
51 Q_EMIT q->toplevelChanged();
52 }
53
54 void xdg_toplevel_drag_v1_destroy_resource(Resource *resource) override
55 {
56 delete q;
57 }
58 void xdg_toplevel_drag_v1_destroy(Resource *resource) override
59 {
60 if (!dataSource || dataSource->isDndCancelled() || dataSource->isDropPerformed()) {
61 wl_resource_destroy(resource->handle);
62 return;
63 }
64 wl_resource_post_error(resource->handle, error_ongoing_drag, "Drag has not ended");
65 }
66};
67
68XdgToplevelDragV1Interface::XdgToplevelDragV1Interface(wl_resource *resource, DataSourceInterface *dataSource)
69 : d(std::make_unique<XdgToplevelDragV1InterfacePrivate>(resource, this))
70{
71 d->dataSource = dataSource;
73}
74
76{
77 if (d->dataSource) {
78 DataSourceInterfacePrivate::get(d->dataSource)->xdgToplevelDrag = nullptr;
79 }
80}
81
83{
84 return d->toplevel;
85}
86
88{
89 return d->pos;
90}
91
92class XdgToplevelDragManagerV1InterfacePrivate : public QtWaylandServer::xdg_toplevel_drag_manager_v1
93{
94public:
96 : xdg_toplevel_drag_manager_v1(*display, version)
97 , q(q)
98 {
99 }
100
101protected:
102 void xdg_toplevel_drag_manager_v1_destroy(Resource *resource) override
103 {
104 wl_resource_destroy(resource->handle);
105 }
106
107 void xdg_toplevel_drag_manager_v1_get_xdg_toplevel_drag(Resource *resource, uint32_t id, wl_resource *data_source) override
108 {
109 auto dataSource = DataSourceInterface::get(data_source);
110
111 wl_resource *xdg_toplevel_drag = wl_resource_create(resource->client(), &xdg_toplevel_drag_v1_interface, resource->version(), id);
112 if (!xdg_toplevel_drag) {
113 wl_resource_post_no_memory(resource->handle);
114 return;
115 }
116 new XdgToplevelDragV1Interface(xdg_toplevel_drag, dataSource);
117 }
118
120};
121
123 : QObject(parent)
124 , d(std::make_unique<XdgToplevelDragManagerV1InterfacePrivate>(this, display))
125{
126}
127
129}
130
131#include "moc_xdgtopleveldrag_v1.cpp"
static DataSourceInterface * get(wl_resource *native)
XdgToplevelDragV1Interface * xdgToplevelDrag
static DataSourceInterfacePrivate * get(DataSourceInterface *dataSource)
Class holding the Wayland server display loop.
Definition display.h:34
XdgToplevelDragManagerV1Interface(Display *display, QObject *parent=nullptr)
XdgToplevelDragManagerV1InterfacePrivate(XdgToplevelDragManagerV1Interface *q, Display *display)
void xdg_toplevel_drag_manager_v1_get_xdg_toplevel_drag(Resource *resource, uint32_t id, wl_resource *data_source) override
void xdg_toplevel_drag_manager_v1_destroy(Resource *resource) override
XdgToplevelInterface * toplevel() const
QPointer< DataSourceInterface > dataSource
QPointer< XdgToplevelInterface > toplevel
XdgToplevelDragV1InterfacePrivate(wl_resource *resource, XdgToplevelDragV1Interface *q)
static XdgToplevelInterface * get(::wl_resource *resource)
Definition xdgshell.cpp:678
constexpr int version