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 }