diff --git a/include/i3ipc++/ipc.hpp b/include/i3ipc++/ipc.hpp index ab8eb91..584252d 100644 --- a/include/i3ipc++/ipc.hpp +++ b/include/i3ipc++/ipc.hpp @@ -153,6 +153,17 @@ struct container_t { std::list< std::shared_ptr > nodes; }; + +/** + * A workspace event + */ +struct workspace_event_t { + WorkspaceEventType type; + std::shared_ptr current; ///< Current focused workspace + std::shared_ptr old; ///< Old (previous) workspace @note With some WindowEventType could be null +}; + + /** * @deprecated */ @@ -231,7 +242,7 @@ public: */ void handle_event(); - sigc::signal signal_workspace_event; ///< Workspace event signal + 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 sigc::signal signal_window_event; ///< Window event signal diff --git a/src/ipc.cpp b/src/ipc.cpp index e4409f5..b08d1dd 100644 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -176,25 +176,35 @@ connection::connection(const std::string& socket_path) : m_main_socket(i3_conne signal_event.connect([this](EventType event_type, const std::shared_ptr& buf) { switch (event_type) { case ET_WORKSPACE: { - WorkspaceEventType type; + workspace_event_t ev; Json::Value root; IPC_JSON_READ(root); std::string change = root["change"].asString(); if (change == "focus") { - type = WorkspaceEventType::FOCUS; + ev.type = WorkspaceEventType::FOCUS; } else if (change == "init") { - type = WorkspaceEventType::INIT; + ev.type = WorkspaceEventType::INIT; } else if (change == "empty") { - type = WorkspaceEventType::EMPTY; + ev.type = WorkspaceEventType::EMPTY; } else if (change == "urgent") { - type = WorkspaceEventType::URGENT; + ev.type = WorkspaceEventType::URGENT; } else { I3IPC_WARN("Unknown workspace event type " << change) break; } I3IPC_DEBUG("WORKSPACE " << change) - signal_workspace_event.emit(type); + Json::Value current = root["current"]; + Json::Value old = root["current"]; + + if (!current.isNull()) { + ev.current = parse_workspace_from_json(current); + } + if (!old.isNull()) { + ev.old = parse_workspace_from_json(old); + } + + signal_workspace_event.emit(ev); break; } case ET_OUTPUT: