Merge pull request #4896 from nickjj/feature-clock-calendar-css-classes
feat (clock): Add support for optional CSS classes to the clock module's calendar tooltip
This commit is contained in:
@@ -187,6 +187,45 @@ auto waybar::modules::Clock::update() -> void {
|
||||
}
|
||||
|
||||
m_tlpText_ = fmt_lib::vformat(m_locale_, m_tlpText_, fmt_lib::make_format_args(now));
|
||||
|
||||
// Pango doesn't support CSS classes but to continue using it while staying
|
||||
// backwards compatible this approach uses post-posting to replace fake
|
||||
// classes with attributes Pango does understand.
|
||||
//
|
||||
// The benefit of this approach is anyone using the original styling choices
|
||||
// can continue doing that and folks can optionally opt into using classes.
|
||||
//
|
||||
// It's also forwards compatible to where if this implemention ever changes
|
||||
// to support proper classes anyone using them will continue to work.
|
||||
auto context = label_.get_style_context();
|
||||
|
||||
static const std::vector<std::pair<std::string, std::string>> calendar_class_map = {
|
||||
{"calendar-today", "class='today'"},
|
||||
{"calendar-days", "class='days'"},
|
||||
{"calendar-weeks", "class='weeks'"},
|
||||
{"calendar-weekdays", "class='weekdays'"},
|
||||
{"calendar-months", "class='months'"}};
|
||||
|
||||
for (const auto& [css_class, search_str] : calendar_class_map) {
|
||||
try {
|
||||
context->add_class(css_class);
|
||||
const Gdk::RGBA color = context->get_color();
|
||||
context->remove_class(css_class);
|
||||
|
||||
const std::string replace_str = fmt::format(
|
||||
"color='#{:02x}{:02x}{:02x}'", static_cast<int>(color.get_red() * 255),
|
||||
static_cast<int>(color.get_green() * 255), static_cast<int>(color.get_blue() * 255));
|
||||
|
||||
m_tlpText_ = std::regex_replace(m_tlpText_, std::regex(search_str), replace_str);
|
||||
} catch (const Glib::Error& e) {
|
||||
spdlog::warn("Clock: Failed to fetch CSS color for {}: {}", css_class, e.what().raw());
|
||||
continue;
|
||||
} catch (...) {
|
||||
// Catch-all for any other weirdness.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
m_tooltip_->set_markup(m_tlpText_);
|
||||
label_.trigger_tooltip_query();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user