From 2ebe1f37269e9bec23a3f0c2e6be956884c7ab92 Mon Sep 17 00:00:00 2001 From: Emil Mikulic Date: Mon, 14 Jan 2013 00:18:38 +1100 Subject: Add tztime module to support multiple different timezones. --- src/print_time.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'src/print_time.c') 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); } -- cgit v1.2.3