+setstatus(const char *str)
+{
+ /* set WM_NAME via X11 */
+ XStoreName(dpy, DefaultRootWindow(dpy), str);
+ XSync(dpy, False);
+}
+
+char *
+smprintf(const char *fmt, ...)
+{
+ va_list fmtargs;
+ char *ret = NULL;
+
+ va_start(fmtargs, fmt);
+ if (vasprintf(&ret, fmt, fmtargs) < 0)
+ return NULL;
+ va_end(fmtargs);
+
+ return ret;
+}
+
+char *
+battery_perc(const char *battery)
+{
+ int now, full, perc;
+ char batterynowfile[64] = "";
+ char batteryfullfile[64] = "";
+ FILE *fp;
+
+ strlcat(batterynowfile, batterypath, sizeof(batterynowfile));
+ strlcat(batterynowfile, battery, sizeof(batterynowfile));
+ strlcat(batterynowfile, "/", sizeof(batterynowfile));
+ strlcat(batterynowfile, batterynow, sizeof(batterynowfile));
+
+ strlcat(batteryfullfile, batterypath, sizeof(batteryfullfile));
+ strlcat(batteryfullfile, battery, sizeof(batteryfullfile));
+ strlcat(batteryfullfile, "/", sizeof(batteryfullfile));
+ strlcat(batteryfullfile, batteryfull, sizeof(batteryfullfile));
+
+ if (!(fp = fopen(batterynowfile, "r"))) {
+ fprintf(stderr, "Error opening battery file: %s.\n", batterynowfile);
+ return smprintf(unknowntext);
+ }
+
+ fscanf(fp, "%i", &now);
+ fclose(fp);
+
+ if (!(fp = fopen(batteryfullfile, "r"))) {
+ fprintf(stderr, "Error opening battery file.\n");
+ return smprintf(unknowntext);
+ }
+
+ fscanf(fp, "%i", &full);
+ fclose(fp);
+
+ perc = now / (full / 100);
+
+ return smprintf("%d%%", perc);
+}
+
+char *
+cpu_perc(const char *null)