diff options
Diffstat (limited to 'hyprctl/main.cpp')
| -rw-r--r-- | hyprctl/main.cpp | 110 |
1 files changed, 64 insertions, 46 deletions
diff --git a/hyprctl/main.cpp b/hyprctl/main.cpp index 12cac2ce..41c4e27b 100644 --- a/hyprctl/main.cpp +++ b/hyprctl/main.cpp @@ -1,11 +1,17 @@ #include <ctype.h> +#include <netdb.h> +#include <netinet/in.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/types.h> #include <unistd.h> -#include <fstream> #include <iostream> -#include <string.h> +#include <string> +#include <fstream> #include <string> const std::string USAGE = R"#( @@ -16,64 +22,76 @@ usage: hyprctl [command] [(opt)args] clients )#"; -void readReply() { - std::ifstream ifs; +void request(std::string arg) { + const auto SERVERSOCKET = socket(AF_INET, SOCK_STREAM, 0); - while (1) { - usleep(1000 * 25); - - ifs.open("/tmp/hypr/.hyprlandrq"); + if (SERVERSOCKET < 0) { + std::cout << "Couldn't open a socket (1)"; + return; + } - if (ifs.good()) { - std::string reply = ""; - std::getline(ifs, reply); + const auto SERVER = gethostbyname("localhost"); - if (reply.find("RPLY:") != std::string::npos) { - reply = ""; - std::string temp = ""; - while (std::getline(ifs, temp)) - reply += temp + '\n'; + if (!SERVER) { + std::cout << "Couldn't get host (2)"; + return; + } - std::cout << reply; + sockaddr_in serverAddress = {0}; + serverAddress.sin_family = AF_INET; + bcopy((char*)SERVER->h_addr, (char*)&serverAddress.sin_addr.s_addr, SERVER->h_length); - unlink("/tmp/hypr/.hyprlandrq"); // cleanup - break; - } - } + std::ifstream socketPortStream; + socketPortStream.open("/tmp/hypr/.socket"); + + if (!socketPortStream.good()) { + std::cout << "No socket port file (2a)"; + return; } -} -void requestMonitors() { - std::ofstream ofs; - ofs.open("/tmp/hypr/.hyprlandrq", std::ios::trunc); + std::string port = ""; + std::getline(socketPortStream, port); + socketPortStream.close(); - ofs << "R>monitors"; - - ofs.close(); + int portInt = 0; + try { + portInt = std::stoi(port.c_str()); + } catch (...) { + std::cout << "Port not an int?! (2b)"; + return; + } - readReply(); -} + if (portInt == 0) { + std::cout << "Port not an int?! (2c)"; + return; + } + + serverAddress.sin_port = portInt; -void requestClients() { - std::ofstream ofs; - ofs.open("/tmp/hypr/.hyprlandrq", std::ios::trunc); + if (connect(SERVERSOCKET, (sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) { + std::cout << "Couldn't connect to port " << port << " (3) Is Hyprland running?"; + return; + } - ofs << "R>clients"; + auto sizeWritten = write(SERVERSOCKET, arg.c_str(), arg.length()); - ofs.close(); + if (sizeWritten < 0) { + std::cout << "Couldn't write (4)"; + return; + } - readReply(); -} + char buffer[8192] = {0}; -void requestWorkspaces() { - std::ofstream ofs; - ofs.open("/tmp/hypr/.hyprlandrq", std::ios::trunc); + sizeWritten = read(SERVERSOCKET,buffer, 8192); - ofs << "R>workspaces"; + if (sizeWritten < 0) { + std::cout << "Couldn't read (5)"; + return; + } - ofs.close(); + close(SERVERSOCKET); - readReply(); + std::cout << std::string(buffer); } int main(int argc, char** argv) { @@ -84,9 +102,9 @@ int main(int argc, char** argv) { return 1; } - if (!strcmp(argv[1], "monitors")) requestMonitors(); - else if (!strcmp(argv[1], "clients")) requestClients(); - else if (!strcmp(argv[1], "workspaces")) requestWorkspaces(); + if (!strcmp(argv[1], "monitors")) request("R>monitors"); + else if (!strcmp(argv[1], "clients")) request("R>clients"); + else if (!strcmp(argv[1], "workspaces")) request("R>workspaces"); else { printf(USAGE.c_str()); return 1; |
