diff options
author | Emil Mikulic <emikulic@gmail.com> | 2013-01-14 00:18:38 +1100 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2013-02-10 17:18:32 +0100 |
commit | 2ebe1f37269e9bec23a3f0c2e6be956884c7ab92 (patch) | |
tree | f326c0affdec8f9d19167f26e8de4dd92380f187 /src | |
parent | 895cbad7a23cfac3b191c711fab052a74c04c0b2 (diff) |
Add tztime module to support multiple different timezones.
Diffstat (limited to 'src')
-rw-r--r-- | src/print_ddate.c | 7 | ||||
-rw-r--r-- | src/print_time.c | 37 |
2 files changed, 37 insertions, 7 deletions
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); } |