Add option to rewrite sway/window title

Rewrites window title according to config option "rewrite".
"rewrite" is an object where keys are regular expressions and values are
rewrite rules if the expression matches. Rules may contain references to
captures of the expression. Regex and replacement follow ECMA-script
rules. If no regex matches, the title is left unchanged.

example:
"sway/window": {
  "rewrite": {
    "(.*) - Mozilla Firefox": " $1",
    "(.*) - zsh": " $1",
  }
}
This commit is contained in:
Matthias Richter 2021-03-21 11:42:25 +01:00
parent 1c9b62de07
commit b16c8972c7
2 changed files with 22 additions and 1 deletions

View File

@ -22,6 +22,7 @@ class Window : public ALabel, public sigc::trackable {
std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes, std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes,
std::string& output); std::string& output);
void getTree(); void getTree();
std::string rewriteTitle(const std::string& title);
const Bar& bar_; const Bar& bar_;
std::string window_; std::string window_;

View File

@ -1,5 +1,6 @@
#include "modules/sway/window.hpp" #include "modules/sway/window.hpp"
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include <regex>
namespace waybar::modules::sway { namespace waybar::modules::sway {
@ -56,7 +57,7 @@ auto Window::update() -> void {
bar_.window.get_style_context()->remove_class("solo"); bar_.window.get_style_context()->remove_class("solo");
bar_.window.get_style_context()->remove_class("empty"); bar_.window.get_style_context()->remove_class("empty");
} }
label_.set_markup(fmt::format(format_, fmt::arg("title", window_), label_.set_markup(fmt::format(format_, fmt::arg("title", rewriteTitle(window_)),
fmt::arg("app_id", app_id_))); fmt::arg("app_id", app_id_)));
if (tooltipEnabled()) { if (tooltipEnabled()) {
label_.set_tooltip_text(window_); label_.set_tooltip_text(window_);
@ -131,4 +132,23 @@ void Window::getTree() {
} }
} }
std::string Window::rewriteTitle(const std::string& title)
{
const auto& rules = config_["rewrite"];
if (!rules.isObject()) {
return title;
}
for (auto it = rules.begin(); it != rules.end(); ++it) {
if (it.key().isString() && it->isString()) {
const std::regex rule{it.key().asString()};
if (std::regex_match(title, rule)) {
return std::regex_replace(title, rule, it->asString());
}
}
}
return title;
}
} // namespace waybar::modules::sway } // namespace waybar::modules::sway