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_ddate.c | 7 +++++-- src/print_time.c | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/print_ddate.c b/src/print_ddate.c index 8213862..de9a7be 100644 --- a/src/print_ddate.c +++ b/src/print_ddate.c @@ -204,11 +204,14 @@ struct disc_time *get_ddate(struct tm *current_tm) { return &dt; } -void print_ddate(yajl_gen json_gen, char *buffer, const char *format, struct tm *current_tm) { +void print_ddate(yajl_gen json_gen, char *buffer, const char *format, time_t t) { char *outwalk = buffer; static char *form = NULL; + struct tm current_tm; struct disc_time *dt; - if ((dt = get_ddate(current_tm)) == NULL) + set_timezone(NULL); /* Use local time. */ + localtime_r(&t, ¤t_tm); + if ((dt = get_ddate(¤t_tm)) == NULL) return; if (form == NULL) if ((form = malloc(strlen(format) + 1)) == NULL) 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