diff options
Diffstat (limited to 'src/debug/HyprCtl.cpp')
-rw-r--r-- | src/debug/HyprCtl.cpp | 100 |
1 files changed, 31 insertions, 69 deletions
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); } |