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);  } | 
