summaryrefslogtreecommitdiff
path: root/src/protocols/XWaylandShell.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2024-05-25 22:43:51 +0200
committerGitHub <noreply@github.com>2024-05-25 22:43:51 +0200
commitaddd3e7f1aeb670dd91d26005aaeccce3efb1ae7 (patch)
tree7eae3cf1d780ab84ff34ee0fce5ed85d9ee69c90 /src/protocols/XWaylandShell.cpp
parenta71207434c0bc2c8e05e94b1619e68059a002879 (diff)
xwayland: move to hyprland impl (#6086)
Diffstat (limited to 'src/protocols/XWaylandShell.cpp')
-rw-r--r--src/protocols/XWaylandShell.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/protocols/XWaylandShell.cpp b/src/protocols/XWaylandShell.cpp
new file mode 100644
index 00000000..8b9905f8
--- /dev/null
+++ b/src/protocols/XWaylandShell.cpp
@@ -0,0 +1,84 @@
+#include "XWaylandShell.hpp"
+#include <algorithm>
+
+#define LOGM PROTO::xwaylandShell->protoLog
+
+CXWaylandSurfaceResource::CXWaylandSurfaceResource(SP<CXwaylandSurfaceV1> resource_, wlr_surface* surface_) : surface(surface_), resource(resource_) {
+ if (!good())
+ return;
+
+ resource->setDestroy([this](CXwaylandSurfaceV1* r) {
+ events.destroy.emit();
+ PROTO::xwaylandShell->destroyResource(this);
+ });
+ resource->setOnDestroy([this](CXwaylandSurfaceV1* r) {
+ events.destroy.emit();
+ PROTO::xwaylandShell->destroyResource(this);
+ });
+
+ pClient = resource->client();
+
+ resource->setSetSerial([this](CXwaylandSurfaceV1* r, uint32_t lo, uint32_t hi) {
+ serial = (((uint64_t)hi) << 32) + lo;
+ PROTO::xwaylandShell->events.newSurface.emit(self.lock());
+ });
+}
+
+CXWaylandSurfaceResource::~CXWaylandSurfaceResource() {
+ events.destroy.emit();
+}
+
+bool CXWaylandSurfaceResource::good() {
+ return resource->resource();
+}
+
+wl_client* CXWaylandSurfaceResource::client() {
+ return pClient;
+}
+
+CXWaylandShellResource::CXWaylandShellResource(SP<CXwaylandShellV1> resource_) : resource(resource_) {
+ if (!good())
+ return;
+
+ resource->setDestroy([this](CXwaylandShellV1* r) { PROTO::xwaylandShell->destroyResource(this); });
+ resource->setOnDestroy([this](CXwaylandShellV1* r) { PROTO::xwaylandShell->destroyResource(this); });
+
+ resource->setGetXwaylandSurface([this](CXwaylandShellV1* r, uint32_t id, wl_resource* surface) {
+ const auto RESOURCE = PROTO::xwaylandShell->m_vSurfaces.emplace_back(
+ makeShared<CXWaylandSurfaceResource>(makeShared<CXwaylandSurfaceV1>(r->client(), r->version(), id), wlr_surface_from_resource(surface)));
+
+ if (!RESOURCE->good()) {
+ r->noMemory();
+ PROTO::xwaylandShell->m_vSurfaces.pop_back();
+ return;
+ }
+
+ RESOURCE->self = RESOURCE;
+ });
+}
+
+bool CXWaylandShellResource::good() {
+ return resource->resource();
+}
+
+CXWaylandShellProtocol::CXWaylandShellProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
+ ;
+}
+
+void CXWaylandShellProtocol::bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id) {
+ const auto RESOURCE = m_vManagers.emplace_back(makeShared<CXWaylandShellResource>(makeShared<CXwaylandShellV1>(client, ver, id)));
+
+ if (!RESOURCE->good()) {
+ wl_client_post_no_memory(client);
+ m_vManagers.pop_back();
+ return;
+ }
+}
+
+void CXWaylandShellProtocol::destroyResource(CXWaylandShellResource* resource) {
+ std::erase_if(m_vManagers, [&](const auto& other) { return other.get() == resource; });
+}
+
+void CXWaylandShellProtocol::destroyResource(CXWaylandSurfaceResource* resource) {
+ std::erase_if(m_vSurfaces, [&](const auto& other) { return other.get() == resource; });
+}