mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 07:52:42 +01:00 
			
		
		
		
	fix: prefer default fmt date formatting unless timezone specified
This commit is contained in:
		| @@ -1,4 +1,7 @@ | ||||
| #include "modules/clock.hpp" | ||||
|  | ||||
| #include <time.h> | ||||
|  | ||||
| #include <sstream> | ||||
| #include <type_traits> | ||||
| #ifdef HAVE_LANGINFO_1STDAY | ||||
| @@ -9,9 +12,7 @@ | ||||
| using waybar::modules::waybar_time; | ||||
|  | ||||
| waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config) | ||||
|     : ALabel(config, "clock", id, "{:%H:%M}", 60) | ||||
|     , fixed_time_zone_(false) | ||||
| { | ||||
|     : ALabel(config, "clock", id, "{:%H:%M}", 60), fixed_time_zone_(false) { | ||||
|   if (config_["timezone"].isString()) { | ||||
|     time_zone_ = date::locate_zone(config_["timezone"].asString()); | ||||
|     fixed_time_zone_ = true; | ||||
| @@ -37,18 +38,27 @@ auto waybar::modules::Clock::update() -> void { | ||||
|     // Time zone can change. Be sure to pick that. | ||||
|     time_zone_ = date::current_zone(); | ||||
|   } | ||||
|  | ||||
|   auto        now = std::chrono::system_clock::now(); | ||||
|   waybar_time wtime = {locale_, | ||||
|                        date::make_zoned(time_zone_, date::floor<std::chrono::seconds>(now))}; | ||||
|  | ||||
|   auto text = fmt::format(format_, wtime); | ||||
|   label_.set_markup(text); | ||||
|   if (!fixed_time_zone_) { | ||||
|     // As date dep is not fully compatible, prefer fmt | ||||
|     tzset(); | ||||
|     auto localtime = fmt::localtime(std::chrono::system_clock::to_time_t(now)); | ||||
|     auto text = fmt::format(format_, localtime); | ||||
|     label_.set_markup(text); | ||||
|   } else { | ||||
|     auto text = fmt::format(format_, wtime); | ||||
|     label_.set_markup(text); | ||||
|   } | ||||
|  | ||||
|   if (tooltipEnabled()) { | ||||
|     if (config_["tooltip-format"].isString()) { | ||||
|       const auto calendar = calendar_text(wtime); | ||||
|       auto tooltip_format = config_["tooltip-format"].asString(); | ||||
|       auto tooltip_text = fmt::format(tooltip_format, wtime, fmt::arg("calendar", calendar)); | ||||
|       auto       tooltip_format = config_["tooltip-format"].asString(); | ||||
|       auto       tooltip_text = fmt::format(tooltip_format, wtime, fmt::arg("calendar", calendar)); | ||||
|       label_.set_tooltip_markup(tooltip_text); | ||||
|     } else { | ||||
|       label_.set_tooltip_markup(text); | ||||
| @@ -66,19 +76,19 @@ auto waybar::modules::Clock::calendar_text(const waybar_time& wtime) -> std::str | ||||
|   } | ||||
|  | ||||
|   const date::year_month ym(ymd.year(), ymd.month()); | ||||
|   const auto curr_day = ymd.day(); | ||||
|   const auto             curr_day = ymd.day(); | ||||
|  | ||||
|   std::stringstream os; | ||||
|   const auto first_dow = first_day_of_week(); | ||||
|   const auto        first_dow = first_day_of_week(); | ||||
|   weekdays_header(first_dow, os); | ||||
|  | ||||
|   // First week prefixed with spaces if needed. | ||||
|   auto wd = date::weekday(ym/1); | ||||
|   auto wd = date::weekday(ym / 1); | ||||
|   auto empty_days = (wd - first_dow).count(); | ||||
|   if (empty_days > 0) { | ||||
|     os << std::string(empty_days * 3 - 1, ' '); | ||||
|   } | ||||
|   auto last_day = (ym/date::literals::last).day(); | ||||
|   auto last_day = (ym / date::literals::last).day(); | ||||
|   for (auto d = date::day(1); d <= last_day; ++d, ++wd) { | ||||
|     if (wd != first_dow) { | ||||
|       os << ' '; | ||||
| @@ -98,12 +108,13 @@ auto waybar::modules::Clock::calendar_text(const waybar_time& wtime) -> std::str | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| auto waybar::modules::Clock::weekdays_header(const date::weekday& first_dow, std::ostream& os) -> void { | ||||
| auto waybar::modules::Clock::weekdays_header(const date::weekday& first_dow, std::ostream& os) | ||||
|     -> void { | ||||
|   auto wd = first_dow; | ||||
|   do { | ||||
|     if (wd != first_dow) os << ' '; | ||||
|     Glib::ustring wd_ustring(date::format(locale_, "%a", wd)); | ||||
|     auto wd_len = wd_ustring.length(); | ||||
|     auto          wd_len = wd_ustring.length(); | ||||
|     if (wd_len > 2) { | ||||
|       wd_ustring = wd_ustring.substr(0, 2); | ||||
|       wd_len = 2; | ||||
| @@ -125,13 +136,13 @@ using deleting_unique_ptr = std::unique_ptr<T, deleter_from_fn<fn>>; | ||||
| // Computations done similarly to Linux cal utility. | ||||
| auto waybar::modules::Clock::first_day_of_week() -> date::weekday { | ||||
| #ifdef HAVE_LANGINFO_1STDAY | ||||
|   deleting_unique_ptr<std::remove_pointer<locale_t>::type, freelocale> | ||||
|     posix_locale{newlocale(LC_ALL, locale_.name().c_str(), nullptr)}; | ||||
|   deleting_unique_ptr<std::remove_pointer<locale_t>::type, freelocale> posix_locale{ | ||||
|       newlocale(LC_ALL, locale_.name().c_str(), nullptr)}; | ||||
|   if (posix_locale) { | ||||
|     const int i = (std::intptr_t) nl_langinfo_l(_NL_TIME_WEEK_1STDAY, posix_locale.get()); | ||||
|     auto ymd = date::year(i / 10000)/(i / 100 % 100)/(i % 100); | ||||
|     auto wd = date::weekday(ymd); | ||||
|     uint8_t j = *nl_langinfo_l(_NL_TIME_FIRST_WEEKDAY, posix_locale.get()); | ||||
|     const int i = (std::intptr_t)nl_langinfo_l(_NL_TIME_WEEK_1STDAY, posix_locale.get()); | ||||
|     auto      ymd = date::year(i / 10000) / (i / 100 % 100) / (i % 100); | ||||
|     auto      wd = date::weekday(ymd); | ||||
|     uint8_t   j = *nl_langinfo_l(_NL_TIME_FIRST_WEEKDAY, posix_locale.get()); | ||||
|     return wd + date::days(j - 1); | ||||
|   } | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alex
					Alex