aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorvaxerski <[email protected]>2022-09-10 21:21:28 +0200
committervaxerski <[email protected]>2022-09-10 21:21:28 +0200
commit82aa78916ddfcd2d23720083bd7cea2502a0feca (patch)
tree03c7ed1c530a0909c916575bf0a351196a4f1704
parentf024d7114fe08f505ec9af40ee8cd471fbb6c09b (diff)
downloadHyprland-hyprctl-nopoll.tar.gz
Hyprland-hyprctl-nopoll.zip
hyprctl-nopollhyprctl-nopoll
-rw-r--r--src/Compositor.cpp20
-rw-r--r--src/Compositor.hpp3
-rw-r--r--src/debug/HyprCtl.cpp100
-rw-r--r--src/debug/HyprCtl.hpp5
-rw-r--r--src/managers/ThreadManager.cpp2
5 files changed, 34 insertions, 96 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index bbc893ba..565ec86c 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -245,7 +245,6 @@ void CCompositor::cleanup() {
// end threads
g_pEventManager->m_tThread = std::thread();
- HyprCtl::tThread = std::thread();
m_vWorkspaces.clear();
m_vWindows.clear();
@@ -1719,25 +1718,6 @@ CWindow* CCompositor::getWindowByRegex(const std::string& regexp) {
return nullptr;
}
-wl_event_source* hyprCtlTickSource = nullptr;
-
-int hyprCtlTick(void* data) {
- HyprCtl::tickHyprCtl(); // so that we dont get that race condition multithread bullshit
-
- wl_event_source_timer_update(hyprCtlTickSource, 16); // tick it 60/s, should be enough.
-
- return 0;
-}
-
-void CCompositor::startHyprCtlTick() {
- if (hyprCtlTickSource)
- return;
-
- hyprCtlTickSource = wl_event_loop_add_timer(m_sWLEventLoop, hyprCtlTick, nullptr);
-
- wl_event_source_timer_update(hyprCtlTickSource, 16);
-}
-
void CCompositor::warpCursorTo(const Vector2D& pos) {
// warpCursorTo should only be used for warps that
diff --git a/src/Compositor.hpp b/src/Compositor.hpp
index 216e5e59..5ca530d9 100644
--- a/src/Compositor.hpp
+++ b/src/Compositor.hpp
@@ -166,11 +166,8 @@ public:
void forceReportSizesToWindowsOnWorkspace(const int&);
bool cursorOnReservedArea();
-
std::string explicitConfigPath;
- void startHyprCtlTick();
-
private:
void initAllSignals();
void setRandomSplash();
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index 55a496e8..7af07463 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -721,9 +721,21 @@ std::string getReply(std::string request) {
return "unknown request";
}
-void HyprCtl::tickHyprCtl() {
- if (!requestMade)
- return;
+int hyprCtlFDTick(int fd, uint32_t mask, void* data) {
+ if (mask & WL_EVENT_ERROR || mask & WL_EVENT_HANGUP)
+ return 0;
+
+ sockaddr_in clientAddress;
+ socklen_t clientSize = sizeof(clientAddress);
+
+ const auto ACCEPTEDCONNECTION = accept(HyprCtl::iSocketFD, (sockaddr*)&clientAddress, &clientSize);
+
+ char readBuffer[1024];
+
+ auto messageSize = read(ACCEPTEDCONNECTION, readBuffer, 1024);
+ readBuffer[messageSize == 1024 ? 1023 : messageSize] = '\0';
+
+ std::string request(readBuffer);
std::string reply = "";
@@ -734,88 +746,38 @@ void HyprCtl::tickHyprCtl() {
reply = "Err: " + std::string(e.what());
}
- request = reply;
+ write(ACCEPTEDCONNECTION, reply.c_str(), reply.length());
- requestMade = false;
- requestReady = true;
+ close(ACCEPTEDCONNECTION);
if (g_pConfigManager->m_bWantsMonitorReload) {
g_pConfigManager->ensureDPMS();
}
-}
-
-std::string getRequestFromThread(std::string rq) {
-
- while (HyprCtl::request != "" || HyprCtl::requestMade || HyprCtl::requestReady) {
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
- }
-
- HyprCtl::request = rq;
- HyprCtl::requestMade = true;
-
- while (!HyprCtl::requestReady) {
- std::this_thread::sleep_for(std::chrono::milliseconds(5));
- }
-
- HyprCtl::requestReady = false;
- HyprCtl::requestMade = false;
-
- std::string toReturn = HyprCtl::request;
-
- HyprCtl::request = "";
- return toReturn;
+ return 0;
}
void HyprCtl::startHyprCtlSocket() {
- tThread = std::thread([&]() {
- const auto SOCKET = socket(AF_UNIX, SOCK_STREAM, 0);
- if (SOCKET < 0) {
- Debug::log(ERR, "Couldn't start the Hyprland Socket. (1) IPC will not work.");
- return;
- }
-
- sockaddr_un SERVERADDRESS = {.sun_family = AF_UNIX};
-
- std::string socketPath = "/tmp/hypr/" + g_pCompositor->m_szInstanceSignature + "/.socket.sock";
-
- strcpy(SERVERADDRESS.sun_path, socketPath.c_str());
-
- bind(SOCKET, (sockaddr*)&SERVERADDRESS, SUN_LEN(&SERVERADDRESS));
-
- // 10 max queued.
- listen(SOCKET, 10);
-
- sockaddr_in clientAddress;
- socklen_t clientSize = sizeof(clientAddress);
-
- char readBuffer[1024] = {0};
+ iSocketFD = socket(AF_UNIX, SOCK_STREAM, 0);
- Debug::log(LOG, "Hypr socket started at %s", socketPath.c_str());
+ if (iSocketFD < 0) {
+ Debug::log(ERR, "Couldn't start the Hyprland Socket. (1) IPC will not work.");
+ return;
+ }
- while(1) {
- const auto ACCEPTEDCONNECTION = accept(SOCKET, (sockaddr*)&clientAddress, &clientSize);
+ sockaddr_un SERVERADDRESS = {.sun_family = AF_UNIX};
- if (ACCEPTEDCONNECTION < 0) {
- Debug::log(ERR, "Couldn't listen on the Hyprland Socket. (3) IPC will not work.");
- break;
- }
+ std::string socketPath = "/tmp/hypr/" + g_pCompositor->m_szInstanceSignature + "/.socket.sock";
- auto messageSize = read(ACCEPTEDCONNECTION, readBuffer, 1024);
- readBuffer[messageSize == 1024 ? 1023 : messageSize] = '\0';
+ strcpy(SERVERADDRESS.sun_path, socketPath.c_str());
- std::string request(readBuffer);
+ bind(iSocketFD, (sockaddr*)&SERVERADDRESS, SUN_LEN(&SERVERADDRESS));
- std::string reply = getRequestFromThread(request);
-
- write(ACCEPTEDCONNECTION, reply.c_str(), reply.length());
-
- close(ACCEPTEDCONNECTION);
- }
+ // 10 max queued.
+ listen(iSocketFD, 10);
- close(SOCKET);
- });
+ Debug::log(LOG, "Hypr socket started at %s", socketPath.c_str());
- tThread.detach();
+ wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, iSocketFD, WL_EVENT_READABLE, hyprCtlFDTick, nullptr);
}
diff --git a/src/debug/HyprCtl.hpp b/src/debug/HyprCtl.hpp
index b717f50f..0dd4f741 100644
--- a/src/debug/HyprCtl.hpp
+++ b/src/debug/HyprCtl.hpp
@@ -6,7 +6,6 @@
namespace HyprCtl {
void startHyprCtlSocket();
- void tickHyprCtl();
// very simple thread-safe request method
inline bool requestMade = false;
@@ -15,7 +14,9 @@ namespace HyprCtl {
inline std::ifstream requestStream;
- inline std::thread tThread;
+ inline wl_event_source* hyprCtlTickSource = nullptr;
+
+ inline int iSocketFD = -1;
enum eHyprCtlOutputFormat {
FORMAT_NORMAL = 0,
diff --git a/src/managers/ThreadManager.cpp b/src/managers/ThreadManager.cpp
index 772a6740..efe0ac10 100644
--- a/src/managers/ThreadManager.cpp
+++ b/src/managers/ThreadManager.cpp
@@ -22,8 +22,6 @@ CThreadManager::CThreadManager() {
HyprCtl::startHyprCtlSocket();
- g_pCompositor->startHyprCtlTick();
-
m_esConfigTimer = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, handleTimer, this);
wl_event_source_timer_update(m_esConfigTimer, 1000);