KWin
Loading...
Searching...
No Matches
appmenu.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2017 David Edmundson <kde@davidedmundson.co.uk>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6#include "appmenu.h"
7#include "display.h"
8#include "surface.h"
9
10#include <QPointer>
11#include <QtGlobal>
12
13#include "qwayland-server-appmenu.h"
14
15namespace KWin
16{
17static const quint32 s_version = 1;
18
19class AppMenuManagerInterfacePrivate : public QtWaylandServer::org_kde_kwin_appmenu_manager
20{
21public:
23
24 QList<AppMenuInterface *> appmenus;
26
27protected:
28 void org_kde_kwin_appmenu_manager_create(Resource *resource, uint32_t id, wl_resource *surface) override;
29};
30
31void AppMenuManagerInterfacePrivate::org_kde_kwin_appmenu_manager_create(Resource *resource, uint32_t id, wl_resource *surface)
32{
34 if (!s) {
35 wl_resource_post_error(resource->handle, 0, "Invalid surface");
36 return;
37 }
38 wl_resource *appmenu_resource = wl_resource_create(resource->client(), &org_kde_kwin_appmenu_interface, resource->version(), id);
39 if (!appmenu_resource) {
40 wl_client_post_no_memory(resource->client());
41 return;
42 }
43 auto appmenu = new AppMenuInterface(s, appmenu_resource);
44
45 appmenus.append(appmenu);
46 QObject::connect(appmenu, &QObject::destroyed, q, [=, this]() {
47 appmenus.removeOne(appmenu);
48 });
49 Q_EMIT q->appMenuCreated(appmenu);
50}
51
53 : QtWaylandServer::org_kde_kwin_appmenu_manager(*d, s_version)
54 , q(_q)
55{
56}
57
58class AppMenuInterfacePrivate : public QtWaylandServer::org_kde_kwin_appmenu
59{
60public:
62
64 QPointer<SurfaceInterface> surface;
66
67protected:
68 void org_kde_kwin_appmenu_destroy_resource(Resource *resource) override;
69 void org_kde_kwin_appmenu_set_address(Resource *resource, const QString &service_name, const QString &object_path) override;
70 void org_kde_kwin_appmenu_release(Resource *resource) override;
71};
72
74 : QtWaylandServer::org_kde_kwin_appmenu(resource)
75 , q(_q)
76 , surface(s)
77{
78}
79
80void AppMenuInterfacePrivate::org_kde_kwin_appmenu_destroy_resource(QtWaylandServer::org_kde_kwin_appmenu::Resource *resource)
81{
82 delete q;
83}
84
85void AppMenuInterfacePrivate::org_kde_kwin_appmenu_set_address(Resource *resource, const QString &service_name, const QString &object_path)
86{
87 if (address.serviceName == service_name && address.objectPath == object_path) {
88 return;
89 }
90
91 address.serviceName = service_name;
92 address.objectPath = object_path;
93 Q_EMIT q->addressChanged(address);
94}
95
96void AppMenuInterfacePrivate::org_kde_kwin_appmenu_release(QtWaylandServer::org_kde_kwin_appmenu::Resource *resource)
97{
98 wl_resource_destroy(resource->handle);
99}
100
102 : QObject(parent)
103 , d(new AppMenuManagerInterfacePrivate(this, display))
104{
105}
106
110
112{
113 for (AppMenuInterface *menu : d->appmenus) {
114 if (menu->surface() == surface) {
115 return menu;
116 }
117 }
118 return nullptr;
119}
120
121AppMenuInterface::AppMenuInterface(SurfaceInterface *surface, wl_resource *resource)
122 : QObject()
123 , d(new AppMenuInterfacePrivate(this, surface, resource))
124{
125}
126
130
132{
133 return d->address;
134}
135
137{
138 return d->surface.data();
139}
140
141} // namespace
~AppMenuInterface() override
Definition appmenu.cpp:127
SurfaceInterface * surface() const
Definition appmenu.cpp:136
void addressChanged(KWin::AppMenuInterface::InterfaceAddress)
InterfaceAddress address() const
Definition appmenu.cpp:131
AppMenuInterface::InterfaceAddress address
Definition appmenu.cpp:65
AppMenuInterface * q
Definition appmenu.cpp:63
void org_kde_kwin_appmenu_set_address(Resource *resource, const QString &service_name, const QString &object_path) override
Definition appmenu.cpp:85
void org_kde_kwin_appmenu_destroy_resource(Resource *resource) override
Definition appmenu.cpp:80
void org_kde_kwin_appmenu_release(Resource *resource) override
Definition appmenu.cpp:96
QPointer< SurfaceInterface > surface
Definition appmenu.cpp:64
AppMenuInterfacePrivate(AppMenuInterface *q, SurfaceInterface *surface, wl_resource *resource)
Definition appmenu.cpp:73
AppMenuManagerInterface(Display *display, QObject *parent=nullptr)
Definition appmenu.cpp:101
AppMenuInterface * appMenuForSurface(SurfaceInterface *)
Definition appmenu.cpp:111
void appMenuCreated(KWin::AppMenuInterface *)
QList< AppMenuInterface * > appmenus
Definition appmenu.cpp:24
AppMenuManagerInterfacePrivate(AppMenuManagerInterface *q, Display *d)
Definition appmenu.cpp:52
void org_kde_kwin_appmenu_manager_create(Resource *resource, uint32_t id, wl_resource *surface) override
Definition appmenu.cpp:31
AppMenuManagerInterface * q
Definition appmenu.cpp:25
Class holding the Wayland server display loop.
Definition display.h:34
Resource representing a wl_surface.
Definition surface.h:80
static SurfaceInterface * get(wl_resource *native)
Definition surface.cpp:819