- Notifications
You must be signed in to change notification settings - Fork8
polybar/i3ipcpp
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
An implementation of i3 IPC in C++11.
- cmake (>= 3.0)
- C++11 compiler
- sigc++ 2.0
- jsoncpp
Yet the only way of using is to add this repo as a submodule
git submodule add https://github.com/drmgc/i3ipcpp.git ./i3ipc++/
Then just type this in yourCMakeLists.txt
:
...add_subdirectory(i3ipc++)include_directories(${I3IPCpp_INCLUDE_DIRS})link_directories(${I3IPCpp_LIBRARY_DIRS})...
And then just link:
...target_link_libraries(someapp${I3IPCpp_LIBRARIES})...
See also examples inexamples/
directory.
#include<i3ipc++/ipc.hpp>i3ipc::connection conn;
The connection will be established automaticly.
First of all you need to declare the events you want to handle. As example we want to handle an binding and workspace events:
conn.subscribe(i3ipc::ET_WORKSPACE | i3ipc::ET_BINDING);
Then we need to connect to the signal handlers:
// Handler of WORKSPACE EVENTconn.signal_workspace_event.connect([](const i3ipc::workspace_event_t& ev) {std::cout <<"workspace_event:" << (char)ev.type << std::endl;if (ev.current) {std::cout <<"\tSwitched to #" << ev.current->num <<" -\"" << ev.current->name <<'"' << std::endl;}});// Handler of binding eventconn.signal_binding_event.connect([](const i3ipc::binding_t& b) {std::cout <<"binding_event:" << std::endl<<"\tcommand =\"" << b.command <<'"' << std::endl<<"\tinput_code =" << b.input_code << std::endl<<"\tsymbol =" << b.symbol << std::endl<<"\tinput_type =" <<static_cast<char>(b.input_type) << std::endl<<"\tevent_state_mask =" << std::endl;for (const std::string& s : b.event_state_mask) {std::cout <<"\t\t\"" << s <<'"' << std::endl;}});
Then we starting the event-handling loop
while (true) {conn.handle_event();}
Note: If you want to interract with event_socket or just want to prepare manually you can callconn.connect_event_socket()
(if you want to reconnectconn.connect_event_socket(true)
), but if by defaultconnect_event_socket()
called on firsthandle_event()
call.
Also you can request some data from i3, as example barconfigs:
std::vector<std::string> bar_configs = conn.get_bar_configs_list();
And then do with them something:
for (auto& name : bar_configs) {std::shared_ptr<i3ipc::bar_config_t> bc = conn.get_bar_config(name);// ... handling}
And, of course, you can command i3:
if (!conn.send_command("exit")) {throwstd::string("Failed to exit via command");}
It is written according to thecurrent specification, so some of new features in IPC can be not-implemented. If there is some of them, please notice at issues page.
The latest documentation you can findhere
This library is licensed under under the MIT license, but it also usesJsonCpp
(only for parsing i3's replies) and my header-only libraryauss
While version is0.x
there can be a lack of backward compatibility between minor releases, please see release notes.
About
C++ interface to i3 ipc
Resources
License
Stars
Watchers
Forks
Packages0
Languages
- C++95.3%
- CMake4.7%