mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
refactor(workspaces): listen ipc event
This commit is contained in:
@ -6,47 +6,60 @@ waybar::modules::Workspaces::Workspaces(Bar &bar)
|
||||
{
|
||||
_box.get_style_context()->add_class("workspaces");
|
||||
std::string socketPath = get_socketpath();
|
||||
_ipcSocketfd = ipc_open_socket(socketPath);
|
||||
_ipcEventSocketfd = ipc_open_socket(socketPath);
|
||||
const char *subscribe = "[ \"workspace\", \"mode\" ]";
|
||||
_ipcfd = ipc_open_socket(socketPath);
|
||||
_ipcEventfd = ipc_open_socket(socketPath);
|
||||
const char *subscribe = "[ \"workspace\" ]";
|
||||
uint32_t len = strlen(subscribe);
|
||||
ipc_single_command(_ipcEventSocketfd, IPC_SUBSCRIBE, subscribe, &len);
|
||||
ipc_single_command(_ipcEventfd, IPC_SUBSCRIBE, subscribe, &len);
|
||||
_thread = [this] {
|
||||
Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Workspaces::update));
|
||||
_thread.sleep_for(chrono::milliseconds(250));
|
||||
try {
|
||||
if (_bar.outputName.empty()) {
|
||||
// Wait for the name of the output
|
||||
while (_bar.outputName.empty())
|
||||
_thread.sleep_for(chrono::milliseconds(150));
|
||||
} else
|
||||
ipc_recv_response(_ipcEventfd);
|
||||
uint32_t len = 0;
|
||||
auto str = ipc_single_command(_ipcfd, IPC_GET_WORKSPACES, nullptr, &len);
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
_workspaces = _getWorkspaces(str);
|
||||
Glib::signal_idle().connect_once(sigc::mem_fun(*this, &Workspaces::update));
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
auto waybar::modules::Workspaces::update() -> void
|
||||
{
|
||||
if (_bar.outputName.empty()) return;
|
||||
Json::Value workspaces = _getWorkspaces();
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
bool needReorder = false;
|
||||
for (auto it = _buttons.begin(); it != _buttons.end(); ++it) {
|
||||
auto ws = std::find_if(workspaces.begin(), workspaces.end(),
|
||||
auto ws = std::find_if(_workspaces.begin(), _workspaces.end(),
|
||||
[it](auto node) -> bool { return node["num"].asInt() == it->first; });
|
||||
if (ws == workspaces.end()) {
|
||||
if (ws == _workspaces.end()) {
|
||||
it = _buttons.erase(it);
|
||||
needReorder = true;
|
||||
}
|
||||
}
|
||||
for (auto node : workspaces) {
|
||||
for (auto node : _workspaces) {
|
||||
if (_bar.outputName != node["output"].asString())
|
||||
continue;
|
||||
auto it = _buttons.find(node["num"].asInt());
|
||||
if (it == _buttons.end() && _bar.outputName == node["output"].asString()) {
|
||||
if (it == _buttons.end()) {
|
||||
_addWorkspace(node);
|
||||
needReorder = true;
|
||||
} else {
|
||||
auto styleContext = it->second.get_style_context();
|
||||
auto &button = it->second;
|
||||
bool isCurrent = node["focused"].asBool();
|
||||
if (!isCurrent) {
|
||||
styleContext->remove_class("current");
|
||||
button.get_style_context()->remove_class("current");
|
||||
} else if (isCurrent) {
|
||||
styleContext->add_class("current");
|
||||
button.get_style_context()->add_class("current");
|
||||
}
|
||||
if (needReorder)
|
||||
_box.reorder_child(it->second, node["num"].asInt() - 1);
|
||||
it->second.show();
|
||||
_box.reorder_child(button, node["num"].asInt() - 1);
|
||||
button.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -61,7 +74,7 @@ void waybar::modules::Workspaces::_addWorkspace(Json::Value node)
|
||||
try {
|
||||
auto value = fmt::format("workspace \"{}\"", pair.first->first);
|
||||
uint32_t size = value.size();
|
||||
ipc_single_command(_ipcSocketfd, IPC_COMMAND, value.c_str(), &size);
|
||||
ipc_single_command(_ipcfd, IPC_COMMAND, value.c_str(), &size);
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
}
|
||||
@ -73,27 +86,16 @@ void waybar::modules::Workspaces::_addWorkspace(Json::Value node)
|
||||
button.show();
|
||||
}
|
||||
|
||||
Json::Value waybar::modules::Workspaces::_getWorkspaces()
|
||||
Json::Value waybar::modules::Workspaces::_getWorkspaces(const std::string data)
|
||||
{
|
||||
uint32_t len = 0;
|
||||
Json::Value root;
|
||||
Json::CharReaderBuilder builder;
|
||||
Json::CharReader* reader = builder.newCharReader();
|
||||
Json::Value res;
|
||||
try {
|
||||
std::string str = ipc_single_command(_ipcSocketfd, IPC_GET_WORKSPACES,
|
||||
nullptr, &len);
|
||||
std::string err;
|
||||
bool res =
|
||||
reader->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
|
||||
delete reader;
|
||||
if (!res) {
|
||||
std::cerr << err << std::endl;
|
||||
return root;
|
||||
}
|
||||
res = _parser.parse(data);
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
}
|
||||
return root;
|
||||
return res;
|
||||
}
|
||||
|
||||
waybar::modules::Workspaces::operator Gtk::Widget &() {
|
||||
|
Reference in New Issue
Block a user