summaryrefslogtreecommitdiff
path: root/src/protocols/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocols/core')
-rw-r--r--src/protocols/core/DataDevice.cpp12
-rw-r--r--src/protocols/core/DataDevice.hpp3
-rw-r--r--src/protocols/core/Seat.cpp29
-rw-r--r--src/protocols/core/Shm.cpp23
-rw-r--r--src/protocols/core/Shm.hpp14
5 files changed, 33 insertions, 48 deletions
diff --git a/src/protocols/core/DataDevice.cpp b/src/protocols/core/DataDevice.cpp
index e17b5612..0931608a 100644
--- a/src/protocols/core/DataDevice.cpp
+++ b/src/protocols/core/DataDevice.cpp
@@ -13,6 +13,7 @@
#include "../../managers/HookSystemManager.hpp"
#include "../../helpers/Monitor.hpp"
#include "../../render/Renderer.hpp"
+using namespace Hyprutils::OS;
CWLDataOfferResource::CWLDataOfferResource(SP<CWlDataOffer> resource_, SP<IDataSource> source_) : source(source_), resource(resource_) {
if UNLIKELY (!good())
@@ -39,15 +40,14 @@ CWLDataOfferResource::CWLDataOfferResource(SP<CWlDataOffer> resource_, SP<IDataS
});
resource->setReceive([this](CWlDataOffer* r, const char* mime, uint32_t fd) {
+ CFileDescriptor sendFd{fd};
if (!source) {
LOGM(WARN, "Possible bug: Receive on an offer w/o a source");
- close(fd);
return;
}
if (dead) {
LOGM(WARN, "Possible bug: Receive on an offer that's dead");
- close(fd);
return;
}
@@ -58,7 +58,7 @@ CWLDataOfferResource::CWLDataOfferResource(SP<CWlDataOffer> resource_, SP<IDataS
source->accepted(mime ? mime : "");
}
- source->send(mime ? mime : "", fd);
+ source->send(mime ? mime : "", std::move(sendFd));
recvd = true;
@@ -182,15 +182,13 @@ std::vector<std::string> CWLDataSourceResource::mimes() {
return mimeTypes;
}
-void CWLDataSourceResource::send(const std::string& mime, uint32_t fd) {
+void CWLDataSourceResource::send(const std::string& mime, CFileDescriptor fd) {
if (std::find(mimeTypes.begin(), mimeTypes.end(), mime) == mimeTypes.end()) {
LOGM(ERR, "Compositor/App bug: CWLDataSourceResource::sendAskSend with non-existent mime");
- close(fd);
return;
}
- resource->sendSend(mime.c_str(), fd);
- close(fd);
+ resource->sendSend(mime.c_str(), fd.get());
}
void CWLDataSourceResource::cancelled() {
diff --git a/src/protocols/core/DataDevice.hpp b/src/protocols/core/DataDevice.hpp
index d8bc2b9c..dfea4a71 100644
--- a/src/protocols/core/DataDevice.hpp
+++ b/src/protocols/core/DataDevice.hpp
@@ -16,6 +16,7 @@
#include "../../helpers/signal/Signal.hpp"
#include "../../helpers/math/Math.hpp"
#include "../types/DataDevice.hpp"
+#include <hyprutils/os/FileDescriptor.hpp>
class CWLDataDeviceResource;
class CWLDataDeviceManagerResource;
@@ -63,7 +64,7 @@ class CWLDataSourceResource : public IDataSource {
bool good();
virtual std::vector<std::string> mimes();
- virtual void send(const std::string& mime, uint32_t fd);
+ virtual void send(const std::string& mime, Hyprutils::OS::CFileDescriptor fd);
virtual void accepted(const std::string& mime);
virtual void cancelled();
virtual bool hasDnd();
diff --git a/src/protocols/core/Seat.cpp b/src/protocols/core/Seat.cpp
index c6b2de05..1f07a15e 100644
--- a/src/protocols/core/Seat.cpp
+++ b/src/protocols/core/Seat.cpp
@@ -321,35 +321,18 @@ void CWLKeyboardResource::sendKeymap(SP<IKeyboard> keyboard) {
if (!(PROTO::seat->currentCaps & eHIDCapabilityType::HID_INPUT_CAPABILITY_KEYBOARD))
return;
- std::string_view keymap;
- int fd;
- uint32_t size;
- if (keyboard) {
- keymap = keyboard->xkbKeymapString;
- fd = keyboard->xkbKeymapFD;
- size = keyboard->xkbKeymapString.length() + 1;
- } else {
- fd = open("/dev/null", O_RDONLY | O_CLOEXEC);
- if (fd < 0) {
- LOGM(ERR, "Failed to open /dev/null");
- return;
- }
- size = 0;
- }
+ std::string_view keymap = keyboard->xkbKeymapString;
+ Hyprutils::OS::CFileDescriptor& fd = keyboard->xkbKeymapFD;
+ uint32_t size = keyboard->xkbKeymapString.length() + 1;
- if (keymap == lastKeymap) {
- if (!keyboard)
- close(fd);
+ if (keymap == lastKeymap)
return;
- }
+
lastKeymap = keymap;
const wl_keyboard_keymap_format format = keyboard ? WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1 : WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP;
- resource->sendKeymap(format, fd, size);
-
- if (!keyboard)
- close(fd);
+ resource->sendKeymap(format, fd.get(), size);
}
void CWLKeyboardResource::sendEnter(SP<CWLSurfaceResource> surface) {
diff --git a/src/protocols/core/Shm.cpp b/src/protocols/core/Shm.cpp
index 1649f82f..e0e62560 100644
--- a/src/protocols/core/Shm.cpp
+++ b/src/protocols/core/Shm.cpp
@@ -7,6 +7,7 @@
#include "../types/WLBuffer.hpp"
#include "../../helpers/Format.hpp"
#include "../../render/Renderer.hpp"
+using namespace Hyprutils::OS;
CWLSHMBuffer::CWLSHMBuffer(SP<CWLSHMPoolResource> pool_, uint32_t id, int32_t offset_, const Vector2D& size_, int32_t stride_, uint32_t fmt_) {
if UNLIKELY (!pool_->pool->data)
@@ -51,7 +52,7 @@ bool CWLSHMBuffer::isSynchronous() {
Aquamarine::SSHMAttrs CWLSHMBuffer::shm() {
Aquamarine::SSHMAttrs attrs;
attrs.success = true;
- attrs.fd = pool->fd;
+ attrs.fd = pool->fd.get();
attrs.format = NFormatUtils::shmToDRM(fmt);
attrs.size = size;
attrs.stride = stride;
@@ -75,13 +76,12 @@ void CWLSHMBuffer::update(const CRegion& damage) {
texture->update(NFormatUtils::shmToDRM(fmt), (uint8_t*)pool->data + offset, stride, damage);
}
-CSHMPool::CSHMPool(int fd_, size_t size_) : fd(fd_), size(size_), data(mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) {
+CSHMPool::CSHMPool(CFileDescriptor fd_, size_t size_) : fd(std::move(fd_)), size(size_), data(mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd.get(), 0)) {
;
}
CSHMPool::~CSHMPool() {
munmap(data, size);
- close(fd);
}
void CSHMPool::resize(size_t size_) {
@@ -90,23 +90,23 @@ void CSHMPool::resize(size_t size_) {
if (data)
munmap(data, size);
size = size_;
- data = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ data = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd.get(), 0);
if UNLIKELY (data == MAP_FAILED)
- LOGM(ERR, "Couldn't mmap {} bytes from fd {} of shm client", size, fd);
+ LOGM(ERR, "Couldn't mmap {} bytes from fd {} of shm client", size, fd.get());
}
-static int shmIsSizeValid(int fd, size_t size) {
+static int shmIsSizeValid(CFileDescriptor& fd, size_t size) {
struct stat st;
- if UNLIKELY (fstat(fd, &st) == -1) {
- LOGM(ERR, "Couldn't get stat for fd {} of shm client", fd);
+ if UNLIKELY (fstat(fd.get(), &st) == -1) {
+ LOGM(ERR, "Couldn't get stat for fd {} of shm client", fd.get());
return 0;
}
return (size_t)st.st_size >= size;
}
-CWLSHMPoolResource::CWLSHMPoolResource(SP<CWlShmPool> resource_, int fd_, size_t size_) : resource(resource_) {
+CWLSHMPoolResource::CWLSHMPoolResource(SP<CWlShmPool> resource_, CFileDescriptor fd_, size_t size_) : resource(resource_) {
if UNLIKELY (!good())
return;
@@ -115,7 +115,7 @@ CWLSHMPoolResource::CWLSHMPoolResource(SP<CWlShmPool> resource_, int fd_, size_t
return;
}
- pool = makeShared<CSHMPool>(fd_, size_);
+ pool = makeShared<CSHMPool>(std::move(fd_), size_);
resource->setDestroy([this](CWlShmPool* r) { PROTO::shm->destroyResource(this); });
resource->setOnDestroy([this](CWlShmPool* r) { PROTO::shm->destroyResource(this); });
@@ -176,7 +176,8 @@ CWLSHMResource::CWLSHMResource(SP<CWlShm> resource_) : resource(resource_) {
resource->setOnDestroy([this](CWlShm* r) { PROTO::shm->destroyResource(this); });
resource->setCreatePool([](CWlShm* r, uint32_t id, int32_t fd, int32_t size) {
- const auto RESOURCE = PROTO::shm->m_vPools.emplace_back(makeShared<CWLSHMPoolResource>(makeShared<CWlShmPool>(r->client(), r->version(), id), fd, size));
+ CFileDescriptor poolFd{fd};
+ const auto RESOURCE = PROTO::shm->m_vPools.emplace_back(makeShared<CWLSHMPoolResource>(makeShared<CWlShmPool>(r->client(), r->version(), id), std::move(poolFd), size));
if UNLIKELY (!RESOURCE->good()) {
r->noMemory();
diff --git a/src/protocols/core/Shm.hpp b/src/protocols/core/Shm.hpp
index d7e81367..fef821cb 100644
--- a/src/protocols/core/Shm.hpp
+++ b/src/protocols/core/Shm.hpp
@@ -7,6 +7,8 @@
- wl_buffer with shm
*/
+#include <hyprutils/os/FileDescriptor.hpp>
+#include <memory>
#include <vector>
#include <cstdint>
#include "../WaylandProtocol.hpp"
@@ -18,14 +20,14 @@ class CWLSHMPoolResource;
class CSHMPool {
public:
- CSHMPool(int fd, size_t size);
+ CSHMPool(Hyprutils::OS::CFileDescriptor fd, size_t size);
~CSHMPool();
- int fd = 0;
- size_t size = 0;
- void* data = nullptr;
+ Hyprutils::OS::CFileDescriptor fd;
+ size_t size = 0;
+ void* data = nullptr;
- void resize(size_t size);
+ void resize(size_t size);
};
class CWLSHMBuffer : public IHLBuffer {
@@ -57,7 +59,7 @@ class CWLSHMBuffer : public IHLBuffer {
class CWLSHMPoolResource {
public:
- CWLSHMPoolResource(SP<CWlShmPool> resource_, int fd, size_t size);
+ CWLSHMPoolResource(SP<CWlShmPool> resource_, Hyprutils::OS::CFileDescriptor fd, size_t size);
bool good();