diff --git a/include/services/hyprland.hpp b/include/services/hyprland.hpp index 0e1ec43..ff7f0e6 100644 --- a/include/services/hyprland.hpp +++ b/include/services/hyprland.hpp @@ -10,17 +10,14 @@ class HyprlandService HyprlandService(); ~HyprlandService(); - // Setup the connection - void start(); - - // Signal that emits (EventName, EventData) - // Example: emits ("workspace", "1") sigc::signal on_event; + + void start(); void on_hyprland_event(std::string event, std::string data); private: - int m_fd = -1; // File descriptor for the socket - std::string m_buffer; // Buffer to handle partial socket reads + int m_fd = -1; + std::string m_buffer; bool on_socket_read(Glib::IOCondition condition); void parse_message(const std::string &line); diff --git a/src/services/hyprland.cpp b/src/services/hyprland.cpp index 41f0ca9..6e3a0fc 100644 --- a/src/services/hyprland.cpp +++ b/src/services/hyprland.cpp @@ -27,6 +27,8 @@ void HyprlandService::on_hyprland_event(std::string event, std::string data) else if (event == "activewindow") { std::cout << "Active window changed" << std::endl; + } else { + std::cout << event << " " << data << std::endl; } } @@ -34,9 +36,10 @@ void HyprlandService::start() { std::string socket_path = get_socket_path(); if (socket_path.empty()) + { return; + } - // 1. Create Socket m_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (m_fd == -1) { @@ -44,7 +47,6 @@ void HyprlandService::start() return; } - // 2. Connect struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; @@ -60,8 +62,6 @@ void HyprlandService::start() std::cout << "[Hyprland] Connected to event socket." << std::endl; - // 3. Register with GLib Main Loop - // This tells GTK to call 'on_socket_read' whenever there is data to read Glib::signal_io().connect( sigc::mem_fun(*this, &HyprlandService::on_socket_read), m_fd, @@ -70,10 +70,8 @@ void HyprlandService::start() bool HyprlandService::on_socket_read(Glib::IOCondition condition) { - // Handle disconnection or errors auto error_mask = Glib::IOCondition::IO_HUP | Glib::IOCondition::IO_ERR; - // 2. Perform the bitwise AND, then cast to int to check if non-zero if (static_cast(condition & error_mask) != 0) { std::cerr << "[Hyprland] Socket disconnected." << std::endl; @@ -81,7 +79,7 @@ bool HyprlandService::on_socket_read(Glib::IOCondition condition) m_fd = -1; return false; } - // Read data + char buffer[4096]; ssize_t bytes_read = read(m_fd, buffer, sizeof(buffer) - 1); @@ -90,8 +88,8 @@ bool HyprlandService::on_socket_read(Glib::IOCondition condition) buffer[bytes_read] = '\0'; m_buffer.append(buffer); - // Process line by line size_t pos = 0; + while ((pos = m_buffer.find('\n')) != std::string::npos) { std::string line = m_buffer.substr(0, pos); @@ -100,20 +98,17 @@ bool HyprlandService::on_socket_read(Glib::IOCondition condition) } } - return true; // Continue listening + return true; } void HyprlandService::parse_message(const std::string &line) { - // Hyprland events look like: "event>>data" - // Example: "workspace>>1" or "activewindow>>550a12,firefox" size_t split = line.find(">>"); if (split != std::string::npos) { std::string event_name = line.substr(0, split); std::string event_data = line.substr(split + 2); - // Emit the signal on_event.emit(event_name, event_data); } } @@ -129,6 +124,5 @@ std::string HyprlandService::get_socket_path() return ""; } - // Path format: $XDG_RUNTIME_DIR/hypr/$SIGNATURE/.socket2.sock return std::string(runtime) + "/hypr/" + sig + "/.socket2.sock"; }