#pragma once #include #include #include #include #include "util/json.hpp" namespace waybar::modules::niri { class EventHandler { public: virtual void onEvent(const Json::Value& ev) = 0; virtual ~EventHandler() = default; }; class IPC { public: IPC() { startIPC(); } void registerForIPC(const std::string& ev, EventHandler* ev_handler); void unregisterForIPC(EventHandler* handler); static Json::Value send(const Json::Value& request); // The data members are only safe to access while dataMutex_ is locked. std::lock_guard lockData() { return std::lock_guard(dataMutex_); } const std::vector& workspaces() const { return workspaces_; } const std::vector& windows() const { return windows_; } const std::vector& keyboardLayoutNames() const { return keyboardLayoutNames_; } unsigned keyboardLayoutCurrent() const { return keyboardLayoutCurrent_; } private: void startIPC(); static int connectToSocket(); void parseIPC(const std::string&); std::mutex dataMutex_; std::vector workspaces_; std::vector windows_; std::vector keyboardLayoutNames_; unsigned keyboardLayoutCurrent_; util::JsonParser parser_; std::mutex callbackMutex_; std::list> callbacks_; }; inline std::unique_ptr gIPC; }; // namespace waybar::modules::niri