From 826317e41e10ff6d119bfcf85bd083a06359d2f8 Mon Sep 17 00:00:00 2001 From: Sergey Naumov Date: Sun, 25 Sep 2016 08:36:50 +0300 Subject: [PATCH] resolve #12 More control on event socket to user --- include/i3ipc++/ipc.hpp | 14 ++++++++++++-- src/ipc.cpp | 24 +++++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/include/i3ipc++/ipc.hpp b/include/i3ipc++/ipc.hpp index 9e602b1..bc8be07 100644 --- a/include/i3ipc++/ipc.hpp +++ b/include/i3ipc++/ipc.hpp @@ -326,6 +326,18 @@ public: */ int32_t get_event_socket_fd(); + /** + * Connect the event socket to IPC + * @param reconnect if true the event socket will be disconnected and connected again + * @note Automaticly called, when calling handle_event(); + */ + void connect_event_socket(const bool reconnect = false); + + /** + * Disconnect the event socket + */ + void disconnect_event_socket(); + sigc::signal signal_workspace_event; ///< Workspace event signal sigc::signal signal_output_event; ///< Output event signal sigc::signal signal_mode_event; ///< Output mode event signal @@ -333,8 +345,6 @@ public: sigc::signal signal_barconfig_update_event; ///< Barconfig update event signal sigc::signal signal_binding_event; ///< Binding event signal sigc::signal&> signal_event; ///< i3 event signal @note Default handler routes event to signal according to type -protected: - void prepare_to_event_handling(); private: const int32_t m_main_socket; int32_t m_event_socket; diff --git a/src/ipc.cpp b/src/ipc.cpp index a9fc002..9ac8d4d 100644 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -371,18 +371,36 @@ connection::connection(const std::string& socket_path) : m_main_socket(i3_conne connection::~connection() { i3_disconnect(m_main_socket); if (m_event_socket > 0) - i3_disconnect(m_event_socket); + this->disconnect_event_socket(); } -void connection::prepare_to_event_handling() { +void connection::connect_event_socket(const bool reconnect) { + if (m_event_socket > 0) { + if (reconnect) { + this->disconnect_event_socket(); + } else { + I3IPC_ERR("Trying to initialize event socket secondary") + return; + } + } m_event_socket = i3_connect(m_socket_path); this->subscribe(m_subscriptions); } + +void connection::disconnect_event_socket() { + if (m_event_socket <= 0) { + I3IPC_WARN("Trying to disconnect non-connected event socket") + return; + } + i3_disconnect(m_event_socket); +} + + void connection::handle_event() { if (m_event_socket <= 0) { - this->prepare_to_event_handling(); + this->connect_event_socket(); } auto buf = i3_recv(m_event_socket);