1
0
Fork 0
mirror of https://github.com/polybar/polybar.git synced 2024-11-11 13:50:56 -05:00
polybar/src/modules/date.cpp

108 lines
3.1 KiB
C++
Raw Normal View History

2016-11-02 15:22:45 -04:00
#include "modules/date.hpp"
#include "drawtypes/label.hpp"
2016-11-02 15:22:45 -04:00
2016-11-20 17:04:31 -05:00
#include "modules/meta/base.inl"
2016-11-19 00:22:44 -05:00
POLYBAR_NS
2016-11-02 15:22:45 -04:00
namespace modules {
2016-11-20 17:04:31 -05:00
template class module<date_module>;
date_module::date_module(const bar_settings& bar, string name_) : timer_module<date_module>(bar, move(name_)) {
2016-11-25 07:55:15 -05:00
if (!m_bar.locale.empty()) {
2016-11-02 15:22:45 -04:00
setlocale(LC_TIME, m_bar.locale.c_str());
2016-11-25 07:55:15 -05:00
}
2016-11-02 15:22:45 -04:00
m_dateformat = string_util::trim(m_conf.get(name(), "date", ""s), '"');
m_dateformat_alt = string_util::trim(m_conf.get(name(), "date-alt", ""s), '"');
m_timeformat = string_util::trim(m_conf.get(name(), "time", ""s), '"');
m_timeformat_alt = string_util::trim(m_conf.get(name(), "time-alt", ""s), '"');
2016-11-02 15:22:45 -04:00
if (m_dateformat.empty() && m_timeformat.empty()) {
throw module_error("No date or time format specified");
}
2016-11-02 15:22:45 -04:00
2016-12-30 21:04:01 -05:00
m_interval = m_conf.get<decltype(m_interval)>(name(), "interval", 1s);
2016-11-02 15:22:45 -04:00
m_formatter->add(DEFAULT_FORMAT, TAG_LABEL, {TAG_LABEL, TAG_DATE});
if (m_formatter->has(TAG_DATE)) {
m_log.warn("%s: The format tag `<date>` is deprecated, use `<label>` instead.", name());
m_formatter->get(DEFAULT_FORMAT)->value =
string_util::replace_all(m_formatter->get(DEFAULT_FORMAT)->value, TAG_DATE, TAG_LABEL);
2016-11-25 07:55:15 -05:00
}
2016-11-02 15:22:45 -04:00
if (m_formatter->has(TAG_LABEL)) {
m_label = load_optional_label(m_conf, name(), "label", "%date%");
}
}
void date_module::set_stream_locale(std::stringstream &stream) {
if(!m_bar.locale.empty()) {
stream.imbue(std::locale(m_bar.locale.c_str()));
}
}
bool date_module::update() {
2016-11-02 15:22:45 -04:00
auto time = std::time(nullptr);
auto date_format = m_toggled ? m_dateformat_alt : m_dateformat;
std::stringstream date_stream;
set_stream_locale(date_stream);
date_stream << std::put_time(localtime(&time), date_format.c_str());
auto date_string = date_stream.str();
auto time_format = m_toggled ? m_timeformat_alt : m_timeformat;
std::stringstream time_stream;
set_stream_locale(time_stream);
time_stream << std::put_time(localtime(&time), time_format.c_str());
auto time_string = time_stream.str();
bool date_changed{strncmp(date_string.c_str(), m_date.c_str(), sizeof(date_string)) != 0};
bool time_changed{strncmp(time_string.c_str(), m_time.c_str(), sizeof(time_string)) != 0};
2016-11-02 15:22:45 -04:00
if (!date_changed && !time_changed) {
2016-11-02 15:22:45 -04:00
return false;
}
m_date = date_string;
m_time = time_string;
if (m_label) {
m_label->reset_tokens();
m_label->replace_token("%date%", m_date);
m_label->replace_token("%time%", m_time);
2016-11-25 07:55:15 -05:00
}
2016-11-02 15:22:45 -04:00
return true;
}
2016-11-25 07:55:15 -05:00
bool date_module::build(builder* builder, const string& tag) const {
if (tag == TAG_LABEL) {
if (!m_dateformat_alt.empty() || !m_timeformat_alt.empty()) {
builder->cmd(mousebtn::LEFT, EVENT_TOGGLE);
builder->node(m_label);
builder->cmd_close();
} else {
builder->node(m_label);
}
} else {
2016-11-02 15:22:45 -04:00
return false;
}
return true;
}
2016-12-23 14:43:52 -05:00
bool date_module::input(string&& cmd) {
if (cmd != EVENT_TOGGLE) {
return false;
2016-11-02 15:22:45 -04:00
}
m_toggled = !m_toggled;
wakeup();
2016-11-02 15:22:45 -04:00
return true;
}
}
2016-11-19 00:22:44 -05:00
POLYBAR_NS_END