File indexing completed on 2024-05-19 16:35:20

0001 /*
0002     SPDX-FileCopyrightText: 2020 Benjamin Port <benjamin.port@enioka.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "keyboard_shortcuts_inhibit_v1_interface.h"
0008 
0009 #include <qwayland-server-keyboard-shortcuts-inhibit-unstable-v1.h>
0010 
0011 #include "display.h"
0012 #include "seat_interface.h"
0013 #include "surface_interface.h"
0014 
0015 static const int s_version = 1;
0016 
0017 namespace KWaylandServer
0018 {
0019 class KeyboardShortcutsInhibitorV1InterfacePrivate : public QtWaylandServer::zwp_keyboard_shortcuts_inhibitor_v1
0020 {
0021 public:
0022     KeyboardShortcutsInhibitorV1InterfacePrivate(SurfaceInterface *surface,
0023                                                  SeatInterface *seat,
0024                                                  KeyboardShortcutsInhibitManagerV1Interface *manager,
0025                                                  KeyboardShortcutsInhibitorV1Interface *q,
0026                                                  wl_resource *resource);
0027 
0028     KeyboardShortcutsInhibitorV1Interface *q;
0029     QPointer<KeyboardShortcutsInhibitManagerV1Interface> m_manager;
0030     SurfaceInterface *const m_surface;
0031     SeatInterface *const m_seat;
0032     bool m_active;
0033 
0034 protected:
0035     void zwp_keyboard_shortcuts_inhibitor_v1_destroy_resource(Resource *resource) override;
0036 
0037     void zwp_keyboard_shortcuts_inhibitor_v1_destroy(Resource *resource) override;
0038 };
0039 
0040 class KeyboardShortcutsInhibitManagerV1InterfacePrivate : public QtWaylandServer::zwp_keyboard_shortcuts_inhibit_manager_v1
0041 {
0042 public:
0043     KeyboardShortcutsInhibitManagerV1InterfacePrivate(Display *display, KeyboardShortcutsInhibitManagerV1Interface *q);
0044 
0045     void zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(Resource *resource,
0046                                                                      uint32_t id,
0047                                                                      struct ::wl_resource *surface_resource,
0048                                                                      struct ::wl_resource *seat_resource) override;
0049 
0050     KeyboardShortcutsInhibitorV1Interface *findInhibitor(SurfaceInterface *surface, SeatInterface *seat) const;
0051 
0052     void removeInhibitor(SurfaceInterface *const surface, SeatInterface *const seat);
0053 
0054     KeyboardShortcutsInhibitManagerV1Interface *q;
0055     Display *const m_display;
0056     QHash<QPair<SurfaceInterface *, SeatInterface *>, KeyboardShortcutsInhibitorV1Interface *> m_inhibitors;
0057 
0058 protected:
0059     void zwp_keyboard_shortcuts_inhibit_manager_v1_destroy(Resource *resource) override;
0060 };
0061 
0062 KeyboardShortcutsInhibitorV1InterfacePrivate::KeyboardShortcutsInhibitorV1InterfacePrivate(SurfaceInterface *surface,
0063                                                                                            SeatInterface *seat,
0064                                                                                            KeyboardShortcutsInhibitManagerV1Interface *manager,
0065                                                                                            KeyboardShortcutsInhibitorV1Interface *q,
0066                                                                                            wl_resource *resource)
0067     : zwp_keyboard_shortcuts_inhibitor_v1(resource)
0068     , q(q)
0069     , m_manager(manager)
0070     , m_surface(surface)
0071     , m_seat(seat)
0072     , m_active(false)
0073 {
0074 }
0075 
0076 void KeyboardShortcutsInhibitorV1InterfacePrivate::zwp_keyboard_shortcuts_inhibitor_v1_destroy(Resource *resource)
0077 {
0078     wl_resource_destroy(resource->handle);
0079 }
0080 
0081 void KeyboardShortcutsInhibitorV1InterfacePrivate::zwp_keyboard_shortcuts_inhibitor_v1_destroy_resource(Resource *resource)
0082 {
0083     // Ensure manager don't track anymore this inhibitor
0084     if (m_manager) {
0085         m_manager->removeInhibitor(m_surface, m_seat);
0086     }
0087     delete q;
0088 }
0089 
0090 KeyboardShortcutsInhibitorV1Interface::KeyboardShortcutsInhibitorV1Interface(SurfaceInterface *surface,
0091                                                                              SeatInterface *seat,
0092                                                                              KeyboardShortcutsInhibitManagerV1Interface *manager,
0093                                                                              wl_resource *resource)
0094     : QObject(nullptr)
0095     , d(new KeyboardShortcutsInhibitorV1InterfacePrivate(surface, seat, manager, this, resource))
0096 {
0097 }
0098 
0099 KeyboardShortcutsInhibitorV1Interface::~KeyboardShortcutsInhibitorV1Interface() = default;
0100 
0101 void KeyboardShortcutsInhibitorV1Interface::setActive(bool active)
0102 {
0103     if (d->m_active == active) {
0104         return;
0105     }
0106     d->m_active = active;
0107     if (active) {
0108         d->send_active();
0109     } else {
0110         d->send_inactive();
0111     }
0112 }
0113 
0114 bool KeyboardShortcutsInhibitorV1Interface::isActive() const
0115 {
0116     return d->m_active;
0117 }
0118 
0119 SeatInterface *KeyboardShortcutsInhibitorV1Interface::seat() const
0120 {
0121     return d->m_seat;
0122 }
0123 
0124 SurfaceInterface *KeyboardShortcutsInhibitorV1Interface::surface() const
0125 {
0126     return d->m_surface;
0127 }
0128 
0129 KeyboardShortcutsInhibitManagerV1InterfacePrivate::KeyboardShortcutsInhibitManagerV1InterfacePrivate(Display *display,
0130                                                                                                      KeyboardShortcutsInhibitManagerV1Interface *q)
0131     : zwp_keyboard_shortcuts_inhibit_manager_v1(*display, s_version)
0132     , q(q)
0133     , m_display(display)
0134 {
0135 }
0136 
0137 void KeyboardShortcutsInhibitManagerV1InterfacePrivate::zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(Resource *resource,
0138                                                                                                                     uint32_t id,
0139                                                                                                                     wl_resource *surface_resource,
0140                                                                                                                     wl_resource *seat_resource)
0141 {
0142     SeatInterface *seat = SeatInterface::get(seat_resource);
0143     SurfaceInterface *surface = SurfaceInterface::get(surface_resource);
0144     if (m_inhibitors.contains({surface, seat})) {
0145         wl_resource_post_error(resource->handle, error::error_already_inhibited, "the shortcuts are already inhibited for this surface and seat");
0146         return;
0147     }
0148 
0149     wl_resource *inhibitorResource = wl_resource_create(resource->client(), &zwp_keyboard_shortcuts_inhibitor_v1_interface, resource->version(), id);
0150     auto inhibitor = new KeyboardShortcutsInhibitorV1Interface(surface, seat, q, inhibitorResource);
0151     m_inhibitors[{surface, seat}] = inhibitor;
0152     Q_EMIT q->inhibitorCreated(inhibitor);
0153     inhibitor->setActive(true);
0154 }
0155 
0156 KeyboardShortcutsInhibitorV1Interface *KeyboardShortcutsInhibitManagerV1InterfacePrivate::findInhibitor(SurfaceInterface *surface, SeatInterface *seat) const
0157 {
0158     return m_inhibitors.value({surface, seat}, nullptr);
0159 }
0160 
0161 void KeyboardShortcutsInhibitManagerV1InterfacePrivate::zwp_keyboard_shortcuts_inhibit_manager_v1_destroy(Resource *resource)
0162 {
0163     wl_resource_destroy(resource->handle);
0164 }
0165 
0166 void KeyboardShortcutsInhibitManagerV1InterfacePrivate::removeInhibitor(SurfaceInterface *const surface, SeatInterface *const seat)
0167 {
0168     m_inhibitors.remove({surface, seat});
0169 }
0170 
0171 KeyboardShortcutsInhibitManagerV1Interface::KeyboardShortcutsInhibitManagerV1Interface(Display *display, QObject *parent)
0172     : QObject(parent)
0173     , d(new KeyboardShortcutsInhibitManagerV1InterfacePrivate(display, this))
0174 {
0175 }
0176 
0177 KeyboardShortcutsInhibitManagerV1Interface::~KeyboardShortcutsInhibitManagerV1Interface() = default;
0178 
0179 KeyboardShortcutsInhibitorV1Interface *KeyboardShortcutsInhibitManagerV1Interface::findInhibitor(SurfaceInterface *surface, SeatInterface *seat) const
0180 {
0181     return d->findInhibitor(surface, seat);
0182 }
0183 
0184 void KeyboardShortcutsInhibitManagerV1Interface::removeInhibitor(SurfaceInterface *surface, SeatInterface *seat)
0185 {
0186     d->removeInhibitor(surface, seat);
0187 }
0188 
0189 }