summaryrefslogtreecommitdiff
path: root/src/protocols/WaylandProtocol.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2023-07-18 15:30:28 +0200
committerGitHub <noreply@github.com>2023-07-18 15:30:28 +0200
commit8370a7fcc4627e6f21395cc8b81298369be5cdaf (patch)
tree6be17dc7ba367ea7322d81f20b89b5cdf7defc4d /src/protocols/WaylandProtocol.cpp
parent629e61c7a56561ee5d565dda6d0d8b7c41dbe9c7 (diff)
internal: Protocol C++ Wraps + XDGOutput impl (#2733)
move to our own xdgoutput impl instead of wlr's
Diffstat (limited to 'src/protocols/WaylandProtocol.cpp')
-rw-r--r--src/protocols/WaylandProtocol.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/protocols/WaylandProtocol.cpp b/src/protocols/WaylandProtocol.cpp
new file mode 100644
index 00000000..b5acffea
--- /dev/null
+++ b/src/protocols/WaylandProtocol.cpp
@@ -0,0 +1,75 @@
+#include "WaylandProtocol.hpp"
+#include "../Compositor.hpp"
+
+CWaylandResource::CWaylandResource(wl_client* client, const wl_interface* wlInterface, uint32_t version, uint32_t id, bool destroyInDestructor) {
+ m_pWLResource = wl_resource_create(client, wlInterface, version, id);
+
+ if (!m_pWLResource) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ m_pWLClient = client;
+ m_bDestroyInDestructor = destroyInDestructor;
+
+ Debug::log(LOG, "[wl res %lx] created", m_pWLResource);
+}
+
+CWaylandResource::~CWaylandResource() {
+ if (m_pWLResource && m_bDestroyInDestructor)
+ wl_resource_destroy(m_pWLResource);
+
+ Debug::log(LOG, "[wl res %lx] destroyed (wl_resource_destroy %s)", m_pWLResource, (m_pWLResource && m_bDestroyInDestructor ? "sent" : "not sent"));
+}
+
+bool CWaylandResource::good() {
+ return resource();
+}
+
+wl_resource* CWaylandResource::resource() {
+ return m_pWLResource;
+}
+
+uint32_t CWaylandResource::version() {
+ return wl_resource_get_version(m_pWLResource);
+}
+
+void CWaylandResource::setImplementation(const void* impl, void* data, wl_resource_destroy_func_t df) {
+ RASSERT(!m_bImplementationSet, "Wayland Resource %lx already has an implementation, cannot re-set!", m_pWLResource);
+
+ wl_resource_set_implementation(m_pWLResource, impl, data, df);
+
+ Debug::log(LOG, "[wl res %lx] set impl to %lx", m_pWLResource, impl);
+
+ m_bImplementationSet = true;
+}
+
+static void bindManagerInternal(wl_client* client, void* data, uint32_t ver, uint32_t id) {
+ ((IWaylandProtocol*)data)->bindManager(client, data, ver, id);
+}
+
+static void displayDestroyInternal(struct wl_listener* listener, void* data) {
+ ((IWaylandProtocol*)data)->onDisplayDestroy();
+}
+
+void IWaylandProtocol::onDisplayDestroy() {
+ wl_global_destroy(m_pGlobal);
+}
+
+IWaylandProtocol::IWaylandProtocol(const wl_interface* iface, const int& ver, const std::string& name) {
+ m_pGlobal = wl_global_create(g_pCompositor->m_sWLDisplay, iface, ver, this, &bindManagerInternal);
+
+ if (!m_pGlobal) {
+ Debug::log(ERR, "[proto %s] could not create a global", name.c_str());
+ return;
+ }
+
+ m_liDisplayDestroy.notify = displayDestroyInternal;
+ wl_display_add_destroy_listener(g_pCompositor->m_sWLDisplay, &m_liDisplayDestroy);
+
+ Debug::log(LOG, "[proto %s] started", name.c_str());
+}
+
+IWaylandProtocol::~IWaylandProtocol() {
+ onDisplayDestroy();
+}