File indexing completed on 2024-05-12 05:32:33

0001 /*
0002     SPDX-FileCopyrightText: 2022 David Redondo <kde@david-redondo.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "xwaylandkeyboardgrab_v1.h"
0008 
0009 #include <qwayland-server-xwayland-keyboard-grab-unstable-v1.h>
0010 
0011 #include "display.h"
0012 #include "seat.h"
0013 #include "surface.h"
0014 
0015 constexpr int version = 1;
0016 
0017 namespace KWin
0018 {
0019 
0020 class XWaylandKeyboardGrabManagerV1InterfacePrivate : QtWaylandServer::zwp_xwayland_keyboard_grab_manager_v1
0021 {
0022 public:
0023     XWaylandKeyboardGrabManagerV1InterfacePrivate(Display *display, XWaylandKeyboardGrabManagerV1Interface *q);
0024     XWaylandKeyboardGrabManagerV1Interface *const q;
0025     QHash<QPair<const SurfaceInterface *, const SeatInterface *>, XWaylandKeyboardGrabV1Interface *> m_grabs;
0026 
0027 protected:
0028     void zwp_xwayland_keyboard_grab_manager_v1_destroy(Resource *resource) override;
0029     void zwp_xwayland_keyboard_grab_manager_v1_grab_keyboard(Resource *resource, uint32_t id, wl_resource *surface, wl_resource *seat) override;
0030 };
0031 
0032 class XWaylandKeyboardGrabV1InterfacePrivate : QtWaylandServer::zwp_xwayland_keyboard_grab_v1
0033 {
0034 public:
0035     XWaylandKeyboardGrabV1InterfacePrivate(XWaylandKeyboardGrabV1Interface *q, wl_resource *resource);
0036     XWaylandKeyboardGrabV1Interface *const q;
0037 
0038 protected:
0039     void zwp_xwayland_keyboard_grab_v1_destroy(Resource *resource) override;
0040     void zwp_xwayland_keyboard_grab_v1_destroy_resource(Resource *resource) override;
0041 };
0042 
0043 XWaylandKeyboardGrabManagerV1InterfacePrivate::XWaylandKeyboardGrabManagerV1InterfacePrivate(Display *display, XWaylandKeyboardGrabManagerV1Interface *q)
0044     : zwp_xwayland_keyboard_grab_manager_v1(*display, version)
0045     , q(q)
0046 {
0047 }
0048 
0049 void XWaylandKeyboardGrabManagerV1InterfacePrivate::zwp_xwayland_keyboard_grab_manager_v1_destroy(Resource *resource)
0050 {
0051     wl_resource_destroy(resource->handle);
0052 }
0053 
0054 void XWaylandKeyboardGrabManagerV1InterfacePrivate::zwp_xwayland_keyboard_grab_manager_v1_grab_keyboard(Resource *resource, uint32_t id, wl_resource *surface, wl_resource *seat)
0055 {
0056     wl_resource *keyboardGrab = wl_resource_create(resource->client(), &zwp_xwayland_keyboard_grab_v1_interface, version, id);
0057     if (!keyboardGrab) {
0058         wl_client_post_no_memory(resource->client());
0059         return;
0060     }
0061     const auto surfaceInterface = SurfaceInterface::get(surface);
0062     const auto seatInterface = SeatInterface::get(seat);
0063     auto grab = new XWaylandKeyboardGrabV1Interface(keyboardGrab);
0064     QObject::connect(grab, &QObject::destroyed, q, [this, surfaceInterface, seatInterface] {
0065         m_grabs.remove({surfaceInterface, seatInterface});
0066     });
0067     m_grabs.insert({SurfaceInterface::get(surface), SeatInterface::get(seat)}, grab);
0068 }
0069 
0070 XWaylandKeyboardGrabManagerV1Interface::XWaylandKeyboardGrabManagerV1Interface(Display *display, QObject *parent)
0071     : QObject(parent)
0072     , d(std::make_unique<XWaylandKeyboardGrabManagerV1InterfacePrivate>(display, this))
0073 {
0074 }
0075 
0076 XWaylandKeyboardGrabManagerV1Interface::~XWaylandKeyboardGrabManagerV1Interface()
0077 {
0078 }
0079 
0080 bool XWaylandKeyboardGrabManagerV1Interface::hasGrab(SurfaceInterface *surface, SeatInterface *seat) const
0081 {
0082     return d->m_grabs.contains({surface, seat});
0083 }
0084 
0085 XWaylandKeyboardGrabV1InterfacePrivate::XWaylandKeyboardGrabV1InterfacePrivate(XWaylandKeyboardGrabV1Interface *q, wl_resource *resource)
0086     : zwp_xwayland_keyboard_grab_v1(resource)
0087     , q(q)
0088 {
0089 }
0090 
0091 void XWaylandKeyboardGrabV1InterfacePrivate::zwp_xwayland_keyboard_grab_v1_destroy(Resource *resource)
0092 {
0093     wl_resource_destroy(resource->handle);
0094 }
0095 
0096 void XWaylandKeyboardGrabV1InterfacePrivate::zwp_xwayland_keyboard_grab_v1_destroy_resource(Resource *resource)
0097 {
0098     delete q;
0099 }
0100 
0101 XWaylandKeyboardGrabV1Interface::XWaylandKeyboardGrabV1Interface(wl_resource *resource)
0102     : d(std::make_unique<XWaylandKeyboardGrabV1InterfacePrivate>(this, resource))
0103 {
0104 }
0105 
0106 XWaylandKeyboardGrabV1Interface::~XWaylandKeyboardGrabV1Interface()
0107 {
0108 }
0109 
0110 }
0111 
0112 #include "moc_xwaylandkeyboardgrab_v1.cpp"