i3 - improved tiling WM


Colored clock for work hours

Patch status: rejected

Patch by Blaz Balon

Long description:

If enabled it color clock green during working hours (default 7am to
5pm) and week (Mon to Fri). Days and hours can be manualy configured.

To apply this patch, use:
curl http://cr.i3wm.org/patch/98/raw.patch | git am

b/i3status.c

18
@@ -242,12 +242,22 @@ int main(int argc, char *argv[]) {
19
 
20
         cfg_opt_t time_opts[] = {
21
                 CFG_STR("format", "%Y-%m-%d %H:%M:%S", CFGF_NONE),
22
+                CFG_BOOL("workday_color", false, CFGF_NONE),
23
+                CFG_INT("work_start", 7, CFGF_NONE),
24
+                CFG_INT("work_end", 17, CFGF_NONE),
25
+                CFG_STR("workdays", "1,2,3,4,5", CFGF_NONE),
26
+                CFG_CUSTOM_COLOR_OPTS,
27
                 CFG_END()
28
         };
29
 
30
         cfg_opt_t tztime_opts[] = {
31
                 CFG_STR("format", "%Y-%m-%d %H:%M:%S %Z", CFGF_NONE),
32
+                CFG_BOOL("workday_color", false, CFGF_NONE),
33
+                CFG_INT("work_start", 7, CFGF_NONE),
34
+                CFG_INT("work_end", 17, CFGF_NONE),
35
                 CFG_STR("timezone", "", CFGF_NONE),
36
+                CFG_STR("workdays", "1,2,3,4,5", CFGF_NONE),
37
+                CFG_CUSTOM_COLOR_OPTS,
38
                 CFG_END()
39
         };
40
 
41
@@ -469,13 +479,13 @@ int main(int argc, char *argv[]) {
42
 
43
                         CASE_SEC("time") {
44
                                 SEC_OPEN_MAP("time");
45
-                                print_time(json_gen, buffer, cfg_getstr(sec, "format"), NULL, tv.tv_sec);
46
+                                print_time(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getbool(sec, "workday_color"), cfg_getint(sec, "work_start"), cfg_getint(sec, "work_end"), cfg_getstr(sec, "workdays"), NULL, tv.tv_sec);
47
                                 SEC_CLOSE_MAP;
48
                         }
49
 
50
                         CASE_SEC_TITLE("tztime") {
51
                                 SEC_OPEN_MAP("tztime");
52
-                                print_time(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getstr(sec, "timezone"), tv.tv_sec);
53
+                                print_time(json_gen, buffer, cfg_getstr(sec, "format"), cfg_getbool(sec, "workday_color"), cfg_getint(sec, "work_start"), cfg_getint(sec, "work_end"), cfg_getstr(sec, "workdays"), cfg_getstr(sec, "timezone"), tv.tv_sec);
54
                                 SEC_CLOSE_MAP;
55
                         }
56
 

b/include/i3status.h

61
@@ -143,7 +143,7 @@ void set_timezone(const char *tz);
62
 void print_ipv6_info(yajl_gen json_gen, char *buffer, const char *format_up, const char *format_down);
63
 void print_disk_info(yajl_gen json_gen, char *buffer, const char *path, const char *format);
64
 void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char *path, const char *format, const char *format_down, int low_threshold, char *threshold_type, bool last_full_capacity, bool integer_battery_capacity);
65
-void print_time(yajl_gen json_gen, char *buffer, const char *format, const char *tz, time_t t);
66
+void print_time(yajl_gen json_gen, char *buffer, const char *format, bool wcolor, int wstart, int wend, const char *workdays, const char *tz, time_t t);
67
 void print_ddate(yajl_gen json_gen, char *buffer, const char *format, time_t t);
68
 const char *get_ip_addr();
69
 void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down);

b/man/i3status.man

74
@@ -276,16 +276,30 @@ Outputs the current time in the local timezone.
75
 To use a different timezone, you can set the TZ environment variable,
76
 or use the +tztime+ module.
77
 See +strftime(3)+ for details on the format string.
78
+Workdays colors can be turn on, resulting into showing date in green for
79
+inside wirking hours, and red for outside working hours. Workdays can be
80
+specified with numbers from 0 to 7, 0 and 7 being Sunday, 1 Monday,...
81
 
82
 *Example order*: +time+
83
 
84
 *Example format*: +%Y-%m-%d %H:%M:%S+
85
 
86
+*Example workday_color*: +false+
87
+
88
+*Example work_start*: +7+
89
+
90
+*Example work_end*: +17+
91
+
92
+*Example workdays*: +"1,2,3,4,5"+
93
+
94
 === TzTime
95
 
96
 Outputs the current time in the given timezone.
97
 If no timezone is given, local time will be used.
98
 See +strftime(3)+ for details on the format string.
99
+Workdays colors can be turn on, resulting into showing date in green for
100
+inside wirking hours, and red for outside working hours. Workdays can be
101
+specified with numbers from 0 to 7, 0 and 7 being Sunday, 1 Monday,...
102
 The system's timezone database is usually installed in +/usr/share/zoneinfo+.
103
 Files below that path make for valid timezone strings, e.g. for
104
 +/usr/share/zoneinfo/Europe/Berlin+ you can set timezone to +Europe/Berlin+
105
@@ -295,8 +309,16 @@ in the +tztime+ module.
106
 
107
 *Example format*: +%Y-%m-%d %H:%M:%S %Z+
108
 
109
+*Example workday_color*: +false+
110
+
111
+*Example work_start*: +7+
112
+
113
+*Example work_end*: +17+
114
+
115
 *Example timezone*: +Europe/Berlin+
116
 
117
+*Example workdays*: +"1,2,3,4,5"+
118
+
119
 === DDate
120
 
121
 Outputs the current discordian date in user-specified format. See +ddate(1)+ for

b/src/print_time.c

126
@@ -33,14 +33,32 @@ void set_timezone(const char *tz) {
127
         }
128
 }
129
 
130
-void print_time(yajl_gen json_gen, char *buffer, const char *format, const char *tz, time_t t) {
131
+void print_time(yajl_gen json_gen, char *buffer, const char *format, bool wcolor, int wstart, int wend, const char *wdays, const char *tz, time_t t) {
132
         char *outwalk = buffer;
133
+        char *dayday;
134
         struct tm tm;
135
+        char tt[24];
136
+        char dd[10];
137
 
138
         /* Convert time and format output. */
139
         set_timezone(tz);
140
         localtime_r(&t, &tm);
141
         outwalk += strftime(outwalk, 4095, format, &tm);
142
         *outwalk = '\0';
143
+
144
+        /* Colors for working hours */
145
+        if (wcolor) {
146
+          strftime(tt, 24, "%H", &tm);
147
+          strftime(dd, 10, "%w", &tm);
148
+          dayday = strstr(wdays, dd);
149
+          int hours = atoi(tt);
150
+          if (hours >= wstart && hours <= wend && dayday != NULL) {
151
+            START_COLOR("color_good");
152
+          } else {
153
+            START_COLOR("color_bad");
154
+          }
155
+        }
156
+
157
+        END_COLOR;
158
         OUTPUT_FULL_TEXT(buffer);
159
 }