-
-
Notifications
You must be signed in to change notification settings - Fork 732
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(swaybar-ipc): add swaybar IPC client
- Loading branch information
Showing
5 changed files
with
158 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
#pragma once | ||
#include <string> | ||
|
||
#include "modules/sway/ipc/client.hpp" | ||
#include "util/SafeSignal.hpp" | ||
#include "util/json.hpp" | ||
|
||
namespace waybar { | ||
|
||
class Client; | ||
|
||
namespace modules::sway { | ||
|
||
/* | ||
* Supported subset of i3/sway IPC barconfig object | ||
*/ | ||
struct swaybar_config { | ||
std::string id; | ||
std::string mode; | ||
std::string position; | ||
}; | ||
|
||
/** | ||
* swaybar IPC client | ||
*/ | ||
class BarIpcClient { | ||
public: | ||
BarIpcClient(waybar::Client& client, const std::string& bar_id, bool get_initial_config = true); | ||
|
||
private: | ||
void onInitialConfig(const struct Ipc::ipc_response& res); | ||
void onIpcEvent(const struct Ipc::ipc_response&); | ||
void onConfigUpdate(const swaybar_config& config); | ||
void onVisibilityUpdate(bool visible_by_modifier); | ||
|
||
const Client& client_; | ||
const std::string bar_id_; | ||
util::JsonParser parser_; | ||
Ipc ipc_; | ||
|
||
SafeSignal<bool> signal_visible_; | ||
SafeSignal<swaybar_config> signal_config_; | ||
}; | ||
|
||
} // namespace modules::sway | ||
} // namespace waybar |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
#include "modules/sway/bar.hpp" | ||
|
||
#include <fmt/ostream.h> | ||
#include <spdlog/spdlog.h> | ||
|
||
#include "client.hpp" | ||
#include "modules/sway/ipc/ipc.hpp" | ||
|
||
namespace waybar::modules::sway { | ||
|
||
BarIpcClient::BarIpcClient(waybar::Client& client, const std::string& bar_id, | ||
bool get_initial_config) | ||
: client_{client}, bar_id_{bar_id} { | ||
if (get_initial_config) { | ||
sigc::connection handle = | ||
ipc_.signal_cmd.connect(sigc::mem_fun(*this, &BarIpcClient::onInitialConfig)); | ||
ipc_.sendCmd(IPC_GET_BAR_CONFIG, bar_id); | ||
|
||
handle.disconnect(); | ||
} | ||
|
||
signal_config_.connect(sigc::mem_fun(*this, &BarIpcClient::onConfigUpdate)); | ||
signal_visible_.connect(sigc::mem_fun(*this, &BarIpcClient::onVisibilityUpdate)); | ||
|
||
ipc_.subscribe(R"(["bar_state_update", "barconfig_update"])"); | ||
ipc_.signal_event.connect(sigc::mem_fun(*this, &BarIpcClient::onIpcEvent)); | ||
// Launch worker | ||
ipc_.setWorker([this] { | ||
try { | ||
ipc_.handleEvent(); | ||
} catch (const std::exception& e) { | ||
spdlog::error("BarIpcClient::handleEvent {}", e.what()); | ||
} | ||
}); | ||
} | ||
|
||
struct swaybar_config parseConfig(const Json::Value& payload) { | ||
swaybar_config conf; | ||
if (auto id = payload["id"]; id.isString()) { | ||
conf.id = id.asString(); | ||
} | ||
if (auto mode = payload["mode"]; mode.isString()) { | ||
conf.mode = mode.asString(); | ||
} | ||
if (auto position = payload["position"]; position.isString()) { | ||
conf.position = position.asString(); | ||
} | ||
return conf; | ||
} | ||
|
||
void BarIpcClient::onInitialConfig(const struct Ipc::ipc_response& res) { | ||
try { | ||
auto payload = parser_.parse(res.payload); | ||
auto config = parseConfig(payload); | ||
spdlog::debug("swaybar ipc: initial config: {}", payload); | ||
onConfigUpdate(config); | ||
} catch (const std::exception& e) { | ||
spdlog::error("BarIpcClient::onInitialConfig {}", e.what()); | ||
} | ||
} | ||
|
||
void BarIpcClient::onIpcEvent(const struct Ipc::ipc_response& res) { | ||
try { | ||
auto payload = parser_.parse(res.payload); | ||
if (auto id = payload["id"]; id.isString() && id.asString() != bar_id_) { | ||
spdlog::trace("swaybar ipc: ignore event for {}", id.asString()); | ||
return; | ||
} | ||
if (payload.isMember("visible_by_modifier")) { | ||
// visibility change for hidden bar | ||
signal_visible_(payload["visible_by_modifier"].asBool()); | ||
} else { | ||
// configuration update | ||
auto config = parseConfig(payload); | ||
signal_config_(config); | ||
} | ||
} catch (const std::exception& e) { | ||
spdlog::error("BarIpcClient::onEvent {}", e.what()); | ||
} | ||
} | ||
|
||
void BarIpcClient::onConfigUpdate(const swaybar_config& config) { | ||
spdlog::info("config update: {} {} {}", config.id, config.mode, config.position); | ||
// TODO: pass config to bars | ||
} | ||
|
||
void BarIpcClient::onVisibilityUpdate(bool visible_by_modifier) { | ||
spdlog::trace("visiblity update: {}", visible_by_modifier); | ||
// TODO: pass visibility to bars | ||
} | ||
|
||
} // namespace waybar::modules::sway |