Files
i3ipcpp/include/ipc.hpp
Sergey Naumov e59ccb1ffb Inital
2015-12-29 12:44:44 +03:00

190 lines
4.7 KiB
C++

#pragma once
#include <cstdint>
#include <string>
#include <memory>
#include <vector>
#include <sigc++/sigc++.h>
extern "C" {
#include <i3/ipc.h>
}
/**
* @addtogroup i3ipc i3 IPC C++ binding
* @{
*/
namespace i3ipc {
/**
* Get path to the i3 IPC socket
* @return Path to a socket
*/
std::string get_socketpath();
/**
* Primitive of rectangle
*/
struct rect_t {
int x; /**< Position on X axis */
int y; /**< Position on Y axis */
int width; /**< Width of rectangle */
int height; /**< Height of rectangle */
};
/**
* i3's workspace
*/
struct workspace_t {
int num; /**< Index of the worksapce */
std::string name; /**< Name of the workspace */
bool visible; /**< Is the workspace visible */
bool focused; /**< Is the workspace is currently focused */
bool urgent; /**< Is the workspace is urgent */
rect_t rect; /**< A size of the workspace */
std::string output; /**< An output of the workspace */
};
/**
* i3's output
*/
struct output_t {
std::string name; /**< Name of the output */
bool active; /**< Is the output currently active */
std::string current_workspace; /**< Name of current workspace */
rect_t rect; /**< Size of the output */
};
/**
* Version of i3
*/
struct version_t {
std::string human_readable; /**< Human redable version string */
std::string loaded_config_file_name; /**< Path to current config of i3 */
uint32_t major; /**< Major version of i3 */
uint32_t minor; /**< Minor version of i3 */
uint32_t patch; /**< Patch number of i3 */
};
/**
* Types of the events of i3
*/
enum EventType {
ET_WORKSPACE = (1 << 0), /**< Workspace event */
ET_OUTPUT = (1 << 1), /**< Output event */
ET_MODE = (1 << 2), /**< Output mode event */
ET_WINDOW = (1 << 3), /**< Window event */
ET_BARCONFIG_UPDATE = (1 << 4), /**< Bar config update event @attention Yet is not implemented as signal in I3Connection */
};
/**
* Types of workspace events
*/
enum class WorkspaceEventType : char {
FOCUS = 'f', /**< Focused */
INIT = 'i', /**< Initialized */
EMPTY = 'e', /**< Became empty */
URGENT = 'u', /**< Became urgent */
};
/**
* Types of window events
*/
enum class WindowEventType : char {
NEW = 'n', /**< Window created */
CLOSE = 'c', /**< Window closed */
FOCUS = 'f', /**< Window got focus */
TITLE = 't', /**< Title of window has been changed */
FULLSCREEN_MODE = 'F', /**< Window toggled to fullscreen mode */
MOVE = 'M', /**< Window moved */
FLOATING = '_', /**< Window toggled floating mode */
URGENT = 'u', /**< Window became urgent */
};
struct buf_t;
/**
* Connection to the i3
*/
class I3Connection {
public:
/**
* Connect to the i3
* @param socket_path path to a i3 IPC socket
*/
I3Connection(const std::string& socket_path = get_socketpath());
~I3Connection();
/**
* Send a command to i3
* @param command command
* @return Is command successfully executed
*/
bool send_command(const std::string& command) const;
/**
* Request a list of workspaces
* @return List of workspaces
*/
std::vector<workspace_t> get_workspaces() const;
/**
* Request a list of outputs
* @return List of outputs
*/
std::vector<output_t> get_outputs() const;
/**
* Request a version of i3
* @return Version of i3
*/
version_t get_version() const;
/**
* Subscribe on an events of i3
*
* If connection isn't handling events at the moment, event numer will be added to subscription list.
* Else will also send subscripe request to i3
*
* Example:
* @code{.cpp}
* I3Connection conn;
* conn.subscribe(lebar::ipc::ET_WORKSPACE | lebar::ipc::ET_WINDOW);
* @endcode
*
* @param events event type (EventType enum)
* @return Is successfully subscribed. If connection isn't handling events at the moment, then always true.
*/
bool subscribe(const int32_t events);
/**
* Prepare connection to the handling of i3's events
* @note Used only in main()
*/
void prepare_to_event_handling();
/**
* Handle an event from i3
* @note Used only in main()
*/
void handle_event();
sigc::signal<void, WorkspaceEventType> signal_workspace_event; /**< Workspace event signal */
sigc::signal<void> signal_output_event; /**< Output event signal */
sigc::signal<void> signal_mode_event; /**< Output mode event signal */
sigc::signal<void, WindowEventType> signal_window_event; /**< Window event signal */
sigc::signal<void> signal_barconfig_update_event; /**< Barconfig update event signal */
sigc::signal<void, EventType, const std::shared_ptr<const buf_t>&> signal_event; /**< i3 event signal @note Default handler routes event to signal according to type */
private:
const int32_t m_main_socket;
int32_t m_event_socket;
int32_t m_subscriptions;
const std::string m_socket_path;
};
}
/**
* @}
*/