summaryrefslogtreecommitdiff
path: root/src/managers
diff options
context:
space:
mode:
Diffstat (limited to 'src/managers')
-rw-r--r--src/managers/EventManager.cpp44
-rw-r--r--src/managers/EventManager.hpp14
-rw-r--r--src/managers/KeybindManager.cpp29
-rw-r--r--src/managers/eventLoop/EventLoopManager.cpp13
-rw-r--r--src/managers/eventLoop/EventLoopManager.hpp3
5 files changed, 46 insertions, 57 deletions
diff --git a/src/managers/EventManager.cpp b/src/managers/EventManager.cpp
index fc55b472..6231f0bc 100644
--- a/src/managers/EventManager.cpp
+++ b/src/managers/EventManager.cpp
@@ -9,9 +9,10 @@
#include <sys/un.h>
#include <unistd.h>
#include <cstring>
+using namespace Hyprutils::OS;
CEventManager::CEventManager() : m_iSocketFD(socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)) {
- if (m_iSocketFD < 0) {
+ if (!m_iSocketFD.isValid()) {
Debug::log(ERR, "Couldn't start the Hyprland Socket 2. (1) IPC will not work.");
return;
}
@@ -25,31 +26,27 @@ CEventManager::CEventManager() : m_iSocketFD(socket(AF_UNIX, SOCK_STREAM | SOCK_
strncpy(SERVERADDRESS.sun_path, PATH.c_str(), sizeof(SERVERADDRESS.sun_path) - 1);
- if (bind(m_iSocketFD, (sockaddr*)&SERVERADDRESS, SUN_LEN(&SERVERADDRESS)) < 0) {
+ if (bind(m_iSocketFD.get(), (sockaddr*)&SERVERADDRESS, SUN_LEN(&SERVERADDRESS)) < 0) {
Debug::log(ERR, "Couldn't bind the Hyprland Socket 2. (3) IPC will not work.");
return;
}
// 10 max queued.
- if (listen(m_iSocketFD, 10) < 0) {
+ if (listen(m_iSocketFD.get(), 10) < 0) {
Debug::log(ERR, "Couldn't listen on the Hyprland Socket 2. (4) IPC will not work.");
return;
}
- m_pEventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, m_iSocketFD, WL_EVENT_READABLE, onClientEvent, nullptr);
+ m_pEventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, m_iSocketFD.get(), WL_EVENT_READABLE, onClientEvent, nullptr);
}
CEventManager::~CEventManager() {
for (const auto& client : m_vClients) {
wl_event_source_remove(client.eventSource);
- close(client.fd);
}
if (m_pEventSource != nullptr)
wl_event_source_remove(m_pEventSource);
-
- if (m_iSocketFD >= 0)
- close(m_iSocketFD);
}
int CEventManager::onServerEvent(int fd, uint32_t mask, void* data) {
@@ -66,33 +63,31 @@ int CEventManager::onServerEvent(int fd, uint32_t mask) {
wl_event_source_remove(m_pEventSource);
m_pEventSource = nullptr;
- close(fd);
- m_iSocketFD = -1;
+ m_iSocketFD.reset();
return 0;
}
- sockaddr_in clientAddress;
- socklen_t clientSize = sizeof(clientAddress);
- const auto ACCEPTEDCONNECTION = accept4(m_iSocketFD, (sockaddr*)&clientAddress, &clientSize, SOCK_CLOEXEC | SOCK_NONBLOCK);
- if (ACCEPTEDCONNECTION < 0) {
+ sockaddr_in clientAddress;
+ socklen_t clientSize = sizeof(clientAddress);
+ CFileDescriptor ACCEPTEDCONNECTION{accept4(m_iSocketFD.get(), (sockaddr*)&clientAddress, &clientSize, SOCK_CLOEXEC | SOCK_NONBLOCK)};
+ if (!ACCEPTEDCONNECTION.isValid()) {
if (errno != EAGAIN) {
Debug::log(ERR, "Socket2 failed receiving connection, errno: {}", errno);
wl_event_source_remove(m_pEventSource);
m_pEventSource = nullptr;
- close(fd);
- m_iSocketFD = -1;
+ m_iSocketFD.reset();
}
return 0;
}
- Debug::log(LOG, "Socket2 accepted a new client at FD {}", ACCEPTEDCONNECTION);
+ Debug::log(LOG, "Socket2 accepted a new client at FD {}", ACCEPTEDCONNECTION.get());
// add to event loop so we can close it when we need to
- auto* eventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, ACCEPTEDCONNECTION, 0, onServerEvent, nullptr);
+ auto* eventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, ACCEPTEDCONNECTION.get(), 0, onServerEvent, nullptr);
m_vClients.emplace_back(SClient{
- ACCEPTEDCONNECTION,
+ std::move(ACCEPTEDCONNECTION),
{},
eventSource,
});
@@ -113,7 +108,7 @@ int CEventManager::onClientEvent(int fd, uint32_t mask) {
// send all queued events
while (!CLIENTIT->events.empty()) {
const auto& event = CLIENTIT->events.front();
- if (write(CLIENTIT->fd, event->c_str(), event->length()) < 0)
+ if (write(CLIENTIT->fd.get(), event->c_str(), event->length()) < 0)
break;
CLIENTIT->events.erase(CLIENTIT->events.begin());
@@ -128,13 +123,12 @@ int CEventManager::onClientEvent(int fd, uint32_t mask) {
}
std::vector<CEventManager::SClient>::iterator CEventManager::findClientByFD(int fd) {
- return std::find_if(m_vClients.begin(), m_vClients.end(), [fd](const auto& client) { return client.fd == fd; });
+ return std::find_if(m_vClients.begin(), m_vClients.end(), [fd](const auto& client) { return client.fd.get() == fd; });
}
std::vector<CEventManager::SClient>::iterator CEventManager::removeClientByFD(int fd) {
const auto CLIENTIT = findClientByFD(fd);
wl_event_source_remove(CLIENTIT->eventSource);
- close(fd);
return m_vClients.erase(CLIENTIT);
}
@@ -157,11 +151,11 @@ void CEventManager::postEvent(const SHyprIPCEvent& event) {
for (auto it = m_vClients.begin(); it != m_vClients.end();) {
// try to send the event immediately if the queue is empty
const auto QUEUESIZE = it->events.size();
- if (QUEUESIZE > 0 || write(it->fd, sharedEvent->c_str(), sharedEvent->length()) < 0) {
+ if (QUEUESIZE > 0 || write(it->fd.get(), sharedEvent->c_str(), sharedEvent->length()) < 0) {
if (QUEUESIZE >= MAX_QUEUED_EVENTS) {
// too many events queued, remove the client
- Debug::log(ERR, "Socket2 fd {} overflowed event queue, removing", it->fd);
- it = removeClientByFD(it->fd);
+ Debug::log(ERR, "Socket2 fd {} overflowed event queue, removing", it->fd.get());
+ it = removeClientByFD(it->fd.get());
continue;
}
diff --git a/src/managers/EventManager.hpp b/src/managers/EventManager.hpp
index 6b506d33..c8335d20 100644
--- a/src/managers/EventManager.hpp
+++ b/src/managers/EventManager.hpp
@@ -1,6 +1,6 @@
#pragma once
#include <vector>
-
+#include <hyprutils/os/FileDescriptor.hpp>
#include "../defines.hpp"
#include "../helpers/memory/Memory.hpp"
@@ -26,19 +26,19 @@ class CEventManager {
int onClientEvent(int fd, uint32_t mask);
struct SClient {
- int fd = -1;
- std::vector<SP<std::string>> events;
- wl_event_source* eventSource = nullptr;
+ Hyprutils::OS::CFileDescriptor fd;
+ std::vector<SP<std::string>> events;
+ wl_event_source* eventSource = nullptr;
};
std::vector<SClient>::iterator findClientByFD(int fd);
std::vector<SClient>::iterator removeClientByFD(int fd);
private:
- int m_iSocketFD = -1;
- wl_event_source* m_pEventSource = nullptr;
+ Hyprutils::OS::CFileDescriptor m_iSocketFD;
+ wl_event_source* m_pEventSource = nullptr;
- std::vector<SClient> m_vClients;
+ std::vector<SClient> m_vClients;
};
inline UP<CEventManager> g_pEventManager;
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 2cb77d21..247550ae 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -28,7 +28,9 @@
#include <cstring>
#include <hyprutils/string/String.hpp>
+#include <hyprutils/os/FileDescriptor.hpp>
using namespace Hyprutils::String;
+using namespace Hyprutils::OS;
#include <sys/ioctl.h>
#include <fcntl.h>
@@ -853,19 +855,18 @@ bool CKeybindManager::handleVT(xkb_keysym_t keysym) {
const unsigned int TTY = keysym - XKB_KEY_XF86Switch_VT_1 + 1;
// vtnr is bugged for some reason.
- unsigned int ttynum = 0;
- int fd;
- if ((fd = open("/dev/tty", O_RDONLY | O_NOCTTY)) >= 0) {
+ unsigned int ttynum = 0;
+ Hyprutils::OS::CFileDescriptor fd{open("/dev/tty", O_RDONLY | O_NOCTTY)};
+ if (fd.isValid()) {
#if defined(VT_GETSTATE)
struct vt_stat st;
- if (!ioctl(fd, VT_GETSTATE, &st))
+ if (!ioctl(fd.get(), VT_GETSTATE, &st))
ttynum = st.v_active;
#elif defined(VT_GETACTIVE)
int vt;
- if (!ioctl(fd, VT_GETACTIVE, &vt))
+ if (!ioctl(fd.get(), VT_GETACTIVE, &vt))
ttynum = vt;
#endif
- close(fd);
}
if (ttynum == TTY)
@@ -944,11 +945,11 @@ uint64_t CKeybindManager::spawnRawProc(std::string args, PHLWORKSPACE pInitialWo
Debug::log(LOG, "Unable to create pipe for fork");
}
- pid_t child, grandchild;
+ CFileDescriptor pipeSock[2] = {CFileDescriptor{socket[0]}, CFileDescriptor{socket[1]}};
+
+ pid_t child, grandchild;
child = fork();
if (child < 0) {
- close(socket[0]);
- close(socket[1]);
Debug::log(LOG, "Fail to create the first fork");
return 0;
}
@@ -967,22 +968,16 @@ uint64_t CKeybindManager::spawnRawProc(std::string args, PHLWORKSPACE pInitialWo
setenv(e.first.c_str(), e.second.c_str(), 1);
}
setenv("WAYLAND_DISPLAY", g_pCompositor->m_szWLDisplaySocket.c_str(), 1);
- close(socket[0]);
- close(socket[1]);
execl("/bin/sh", "/bin/sh", "-c", args.c_str(), nullptr);
// exit grandchild
_exit(0);
}
- close(socket[0]);
- write(socket[1], &grandchild, sizeof(grandchild));
- close(socket[1]);
+ write(pipeSock[1].get(), &grandchild, sizeof(grandchild));
// exit child
_exit(0);
}
// run in parent
- close(socket[1]);
- read(socket[0], &grandchild, sizeof(grandchild));
- close(socket[0]);
+ read(pipeSock[0].get(), &grandchild, sizeof(grandchild));
// clear child and leave grandchild to init
waitpid(child, nullptr, 0);
if (grandchild < 0) {
diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp
index 4021c171..83bdf4a0 100644
--- a/src/managers/eventLoop/EventLoopManager.cpp
+++ b/src/managers/eventLoop/EventLoopManager.cpp
@@ -11,11 +11,12 @@
#include <ctime>
#include <aquamarine/backend/Backend.hpp>
+using namespace Hyprutils::OS;
#define TIMESPEC_NSEC_PER_SEC 1000000000L
CEventLoopManager::CEventLoopManager(wl_display* display, wl_event_loop* wlEventLoop) {
- m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
+ m_sTimers.timerfd = CFileDescriptor{timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC)};
m_sWayland.loop = wlEventLoop;
m_sWayland.display = display;
}
@@ -31,8 +32,6 @@ CEventLoopManager::~CEventLoopManager() {
wl_event_source_remove(m_sIdle.eventSource);
if (m_configWatcherInotifySource)
wl_event_source_remove(m_configWatcherInotifySource);
- if (m_sTimers.timerfd >= 0)
- close(m_sTimers.timerfd);
}
static int timerWrite(int fd, uint32_t mask, void* data) {
@@ -52,10 +51,10 @@ static int configWatcherWrite(int fd, uint32_t mask, void* data) {
}
void CEventLoopManager::enterLoop() {
- m_sWayland.eventSource = wl_event_loop_add_fd(m_sWayland.loop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr);
+ m_sWayland.eventSource = wl_event_loop_add_fd(m_sWayland.loop, m_sTimers.timerfd.get(), WL_EVENT_READABLE, timerWrite, nullptr);
- if (const auto FD = g_pConfigWatcher->getInotifyFD(); FD >= 0)
- m_configWatcherInotifySource = wl_event_loop_add_fd(m_sWayland.loop, FD, WL_EVENT_READABLE, configWatcherWrite, nullptr);
+ if (const auto& FD = g_pConfigWatcher->getInotifyFD(); FD.isValid())
+ m_configWatcherInotifySource = wl_event_loop_add_fd(m_sWayland.loop, FD.get(), WL_EVENT_READABLE, configWatcherWrite, nullptr);
syncPollFDs();
m_sListeners.pollFDsChanged = g_pCompositor->m_pAqBackend->events.pollFDsChanged.registerListener([this](std::any d) { syncPollFDs(); });
@@ -120,7 +119,7 @@ void CEventLoopManager::nudgeTimers() {
itimerspec ts = {.it_value = now};
- timerfd_settime(m_sTimers.timerfd, TFD_TIMER_ABSTIME, &ts, nullptr);
+ timerfd_settime(m_sTimers.timerfd.get(), TFD_TIMER_ABSTIME, &ts, nullptr);
}
void CEventLoopManager::doLater(const std::function<void()>& fn) {
diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp
index 95cc6109..ebeb2160 100644
--- a/src/managers/eventLoop/EventLoopManager.hpp
+++ b/src/managers/eventLoop/EventLoopManager.hpp
@@ -6,6 +6,7 @@
#include <thread>
#include <wayland-server.h>
#include "helpers/signal/Signal.hpp"
+#include <hyprutils/os/FileDescriptor.hpp>
#include "EventLoopTimer.hpp"
@@ -54,7 +55,7 @@ class CEventLoopManager {
struct {
std::vector<SP<CEventLoopTimer>> timers;
- int timerfd = -1;
+ Hyprutils::OS::CFileDescriptor timerfd;
} m_sTimers;
SIdleData m_sIdle;