batt.c - spoon - set dwm status
HTML git clone git://git.codemadness.org/spoon
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
batt.c (1697B)
---
1 #include <err.h>
2 #include <stdio.h>
3
4 #include "types.h"
5 #include "util.h"
6
7 char *crit[] = {
8 "[!!!!]=",
9 " ",
10 };
11
12 void
13 battprint(char *buf, size_t len, int acon, int life)
14 {
15 char c;
16 static int frame = 0;
17
18 c = acon ? '>' : '<';
19 if (!acon && life <= 5)
20 snprintf(buf, len, "%s", crit[frame++ % LEN(crit)]);
21 else if (life >= 80)
22 snprintf(buf, len, "[////]=");
23 else if (life >= 60)
24 snprintf(buf, len, "[///%c]=", c);
25 else if (life >= 40)
26 snprintf(buf, len, "[//%c%c]=", c, c);
27 else if (life >= 20)
28 snprintf(buf, len, "[/%c%c%c]=", c, c, c);
29 else
30 snprintf(buf, len, "[%c%c%c%c]=", c, c, c, c);
31 }
32
33 #ifdef __OpenBSD__
34 #include <sys/ioctl.h>
35
36 #include <fcntl.h>
37 #include <unistd.h>
38
39 #include <machine/apmvar.h>
40
41 int
42 battread(void *arg, char *buf, size_t len)
43 {
44 struct apm_power_info info;
45 int ret, fd;
46
47 fd = open("/dev/apm", O_RDONLY);
48 if (fd < 0) {
49 warn("open %s", "/dev/apm");
50 return -1;
51 }
52 ret = ioctl(fd, APM_IOC_GETPOWER, &info);
53 if (ret < 0) {
54 warn("APM_IOC_GETPOWER %s", "/dev/apm");
55 close(fd);
56 return -1;
57 }
58 close(fd);
59
60 if (info.battery_state == APM_BATTERY_ABSENT)
61 snprintf(buf, len, "[no batt]");
62 else
63 battprint(buf, len, info.ac_state == APM_AC_ON, info.battery_life);
64 return 0;
65 }
66 #elif __linux__
67 int
68 battread(void *arg, char *buf, size_t len)
69 {
70 FILE *fp;
71 int acon;
72 int life;
73 struct battarg *battarg = arg;
74
75 fp = fopen(battarg->cap, "r");
76 if (fp == NULL) {
77 warn("fopen %s", battarg->cap);
78 return -1;
79 }
80 fscanf(fp, "%d", &life);
81 fclose(fp);
82 fp = fopen(battarg->ac, "r");
83 if (fp == NULL) {
84 warn("fopen %s", battarg->ac);
85 return -1;
86 }
87 fscanf(fp, "%d", &acon);
88 fclose(fp);
89 battprint(buf, len, acon, life);
90 return 0;
91 }
92 #endif