diff options
Diffstat (limited to 'src/print_time.c')
-rw-r--r-- | src/print_time.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/src/print_time.c b/src/print_time.c index 00a6196..ad1efdd 100644 --- a/src/print_time.c +++ b/src/print_time.c @@ -7,12 +7,39 @@ #include "i3status.h" -void print_time(yajl_gen json_gen, char *buffer, const char *format, struct tm *current_tm) { +static int local_timezone_init = 0; +static const char *local_timezone = NULL; +static const char *current_timezone = NULL; + +void set_timezone(const char *timezone) { + if (!local_timezone_init) { + /* First call, initialize. */ + local_timezone = getenv("TZ"); + local_timezone_init = 1; + } + if (timezone == NULL || timezone[0] == '\0') { + /* User wants localtime. */ + timezone = local_timezone; + } + if (timezone != current_timezone) { + if (timezone) { + setenv("TZ", timezone, 1); + } else { + unsetenv("TZ"); + } + tzset(); + current_timezone = timezone; + } +} + +void print_time(yajl_gen json_gen, char *buffer, const char *format, const char *timezone, time_t t) { char *outwalk = buffer; - if (current_tm == NULL) - return; - /* Get date & time */ - outwalk += strftime(outwalk, 4095, format, current_tm); + struct tm tm; + + /* Convert time and format output. */ + set_timezone(timezone); + localtime_r(&t, &tm); + outwalk += strftime(outwalk, 4095, format, &tm); *outwalk = '\0'; OUTPUT_FULL_TEXT(buffer); } |