Introduction
Introduction Statistics Contact Development Disclaimer Help
dwmstatus.c - dwmstatus - A simple dwm status application in C.
git clone git://git.suckless.org/dwmstatus
Log
Files
Refs
LICENSE
---
dwmstatus.c (4380B)
---
1 /*
2 * Copy me if you can.
3 * by 20h
4 */
5
6 #define _BSD_SOURCE
7 #include <unistd.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <stdarg.h>
11 #include <string.h>
12 #include <strings.h>
13 #include <sys/time.h>
14 #include <time.h>
15 #include <sys/types.h>
16 #include <sys/wait.h>
17
18 #include <X11/Xlib.h>
19
20 char *tzargentina = "America/Buenos_Aires";
21 char *tzutc = "UTC";
22 char *tzberlin = "Europe/Berlin";
23
24 static Display *dpy;
25
26 char *
27 smprintf(char *fmt, ...)
28 {
29 va_list fmtargs;
30 char *ret;
31 int len;
32
33 va_start(fmtargs, fmt);
34 len = vsnprintf(NULL, 0, fmt, fmtargs);
35 va_end(fmtargs);
36
37 ret = malloc(++len);
38 if (ret == NULL) {
39 perror("malloc");
40 exit(1);
41 }
42
43 va_start(fmtargs, fmt);
44 vsnprintf(ret, len, fmt, fmtargs);
45 va_end(fmtargs);
46
47 return ret;
48 }
49
50 void
51 settz(char *tzname)
52 {
53 setenv("TZ", tzname, 1);
54 }
55
56 char *
57 mktimes(char *fmt, char *tzname)
58 {
59 char buf[129];
60 time_t tim;
61 struct tm *timtm;
62
63 settz(tzname);
64 tim = time(NULL);
65 timtm = localtime(&tim);
66 if (timtm == NULL)
67 return smprintf("");
68
69 if (!strftime(buf, sizeof(buf)-1, fmt, timtm)) {
70 fprintf(stderr, "strftime == 0\n");
71 return smprintf("");
72 }
73
74 return smprintf("%s", buf);
75 }
76
77 void
78 setstatus(char *str)
79 {
80 XStoreName(dpy, DefaultRootWindow(dpy), str);
81 XSync(dpy, False);
82 }
83
84 char *
85 loadavg(void)
86 {
87 double avgs[3];
88
89 if (getloadavg(avgs, 3) < 0)
90 return smprintf("");
91
92 return smprintf("%.2f %.2f %.2f", avgs[0], avgs[1], avgs[2]);
93 }
94
95 char *
96 readfile(char *base, char *file)
97 {
98 char *path, line[513];
99 FILE *fd;
100
101 memset(line, 0, sizeof(line));
102
103 path = smprintf("%s/%s", base, file);
104 fd = fopen(path, "r");
105 free(path);
106 if (fd == NULL)
107 return NULL;
108
109 if (fgets(line, sizeof(line)-1, fd) == NULL) {
110 fclose(fd);
111 return NULL;
112 }
113 fclose(fd);
114
115 return smprintf("%s", line);
116 }
117
118 char *
119 getbattery(char *base)
120 {
121 char *co, status;
122 int descap, remcap;
123
124 descap = -1;
125 remcap = -1;
126
127 co = readfile(base, "present");
128 if (co == NULL)
129 return smprintf("");
130 if (co[0] != '1') {
131 free(co);
132 return smprintf("not present");
133 }
134 free(co);
135
136 co = readfile(base, "charge_full_design");
137 if (co == NULL) {
138 co = readfile(base, "energy_full_design");
139 if (co == NULL)
140 return smprintf("");
141 }
142 sscanf(co, "%d", &descap);
143 free(co);
144
145 co = readfile(base, "charge_now");
146 if (co == NULL) {
147 co = readfile(base, "energy_now");
148 if (co == NULL)
149 return smprintf("");
150 }
151 sscanf(co, "%d", &remcap);
152 free(co);
153
154 co = readfile(base, "status");
155 if (!strncmp(co, "Discharging", 11)) {
156 status = '-';
157 } else if(!strncmp(co, "Charging", 8)) {
158 status = '+';
159 } else {
160 status = '?';
161 }
162
163 if (remcap < 0 || descap < 0)
164 return smprintf("invalid");
165
166 return smprintf("%.0f%%%c", ((float)remcap / (float)descap) * 10…
167 }
168
169 char *
170 gettemperature(char *base, char *sensor)
171 {
172 char *co;
173
174 co = readfile(base, sensor);
175 if (co == NULL)
176 return smprintf("");
177 return smprintf("%02.0f°C", atof(co) / 1000);
178 }
179
180 char *
181 execscript(char *cmd)
182 {
183 FILE *fp;
184 char retval[1025], *rv;
185
186 memset(retval, 0, sizeof(retval));
187
188 fp = popen(cmd, "r");
189 if (fp == NULL)
190 return smprintf("");
191
192 rv = fgets(retval, sizeof(retval), fp);
193 pclose(fp);
194 if (rv == NULL)
195 return smprintf("");
196 retval[strlen(retval)-1] = '\0';
197
198 return smprintf("%s", retval);
199 }
200
201 int
202 main(void)
203 {
204 char *status;
205 char *avgs;
206 char *bat;
207 char *tmar;
208 char *tmutc;
209 char *tmbln;
210 char *t0;
211 char *t1;
212 char *kbmap;
213 char *surfs;
214 char *memes;
215
216 if (!(dpy = XOpenDisplay(NULL))) {
217 fprintf(stderr, "dwmstatus: cannot open display.\n");
218 return 1;
219 }
220
221 for (;;sleep(30)) {
222 avgs = loadavg();
223 bat = getbattery("/sys/class/power_supply/BAT0");
224 tmar = mktimes("%H:%M", tzargentina);
225 tmutc = mktimes("%H:%M", tzutc);
226 tmbln = mktimes("KW %W %a %d %b %H:%M %Z %Y", tzberlin);
227 kbmap = execscript("setxkbmap -query | grep layout | cut…
228 surfs = execscript("surf-status");
229 memes = execscript("meme-status");
230 t0 = gettemperature("/sys/devices/virtual/thermal/therma…
231 t1 = gettemperature("/sys/devices/virtual/thermal/therma…
232
233 status = smprintf("S:%s M:%s K:%s T:%s|%s L:%s B:%s A:%s…
234 surfs, memes, kbmap, t0, t1, avgs, bat, …
235 tmbln);
236 setstatus(status);
237
238 free(surfs);
239 free(memes);
240 free(kbmap);
241 free(t0);
242 free(t1);
243 free(avgs);
244 free(bat);
245 free(tmar);
246 free(tmutc);
247 free(tmbln);
248 free(status);
249 }
250
251 XCloseDisplay(dpy);
252
253 return 0;
254 }
255
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.