From 6e9e739d81a72c771345e7688b35a225898977c3 Mon Sep 17 00:00:00 2001 From: patrick96 Date: Fri, 15 Sep 2017 14:13:35 +0200 Subject: [PATCH] fix(date): Remove string length limitation Fixes #744 --- include/modules/date.hpp | 6 ++++++ src/modules/date.cpp | 26 ++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/include/modules/date.hpp b/include/modules/date.hpp index f20c076f..e13a7510 100644 --- a/include/modules/date.hpp +++ b/include/modules/date.hpp @@ -3,6 +3,10 @@ #include "modules/meta/input_handler.hpp" #include "modules/meta/timer_module.hpp" +#include +#include +#include + POLYBAR_NS namespace modules { @@ -34,6 +38,8 @@ namespace modules { string m_time; std::atomic m_toggled{false}; + + void set_stream_locale(std::stringstream &stream); }; } diff --git a/src/modules/date.cpp b/src/modules/date.cpp index e86de6be..3c143e56 100644 --- a/src/modules/date.cpp +++ b/src/modules/date.cpp @@ -38,26 +38,36 @@ namespace modules { } } + 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() { auto time = std::time(nullptr); auto date_format = m_toggled ? m_dateformat_alt : m_dateformat; - char date_buffer[64]{'\0'}; - strftime(date_buffer, sizeof(date_buffer), date_format.c_str(), localtime(&time)); + 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; - char time_buffer[64]{'\0'}; - strftime(time_buffer, sizeof(time_buffer), time_format.c_str(), localtime(&time)); + 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_buffer, m_date.c_str(), sizeof(date_buffer)) != 0}; - bool time_changed{strncmp(time_buffer, m_time.c_str(), sizeof(time_buffer)) != 0}; + 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}; if (!date_changed && !time_changed) { return false; } - m_date = string{date_buffer}; - m_time = string{time_buffer}; + m_date = date_string; + m_time = time_string; if (m_label) { m_label->reset_tokens();