* cyan | red | dimgrey charged - low [1]
* grey | red | dimgrey charging&discharching, low [1]
* ... darkgreen ... no batteries present
+ * ... yellow ... error
*
* [1] battery must be quite badly degraded
*/
#define TOP 60
#define BOTTOM 3600
-#define TIMEOUT 5000 /* milliseconds */
+#define TIMEOUT 5000 /* milliseconds */
+#define TIMEOUT_ONERROR 3333 /* milliseconds */
static const char program_name[]= "xacpi-simple";
#define CHGST_DISCHARGING 0 /* Reflects order in E(state,charging_state) */
#define CHGST_CHARGING 1 /* in fields table. Also, much code assumes */
#define CHGST_CHARGED 2 /* exactly these three possible states. */
+#define CHGST_ERROR 8 /* Except that this one is an extra bit. */
/*---------- structure of and results from /proc/acpi/battery/... ----------*/
/* variables thisbat_... are the results from readbattery();
return batfailf("line without a colon");
*colon= 0;
+ for (batlinevalue= colon+1;
+ *batlinevalue && isspace((unsigned char)*batlinevalue);
+ batlinevalue++);
+
+ if (!strcmp(batlinebuf,"ERROR"))
+ return batfailf("kernel reports error");
+
for (p=batlinebuf; p<colon; p++)
if (*p == ' ')
*p= '_';
continue;
label_interesting:
- for (batlinevalue= colon+1;
- *batlinevalue && isspace((unsigned char)*batlinevalue);
- batlinevalue++);
-
if (field->unit) {
*field->valuep= strtoul(batlinevalue,&ep,10);
r= readbattery();
tidybattery();
- if (r) continue;
+ if (r) { charging_state_mask |= CHGST_ERROR; continue; }
if (!thisbat_info_present || !thisbat_state_present)
continue;
C(cyan) \
C(grey) \
C(darkgreen) \
+ C(yellow) \
C(white) \
GC(remain) \
GC(white) \
if (!r) fail("XChangeGC");
}
+static void show_solid(unsigned long px) {
+ setbackground(px);
+ XClearWindow(disp,win);
+}
+
static void show(void) {
double elap, then;
int i, leftmost_lit, leftmost_nondeg, beyond, first_beyond;
- if (!charging_state_mask) {
- setbackground(pix_darkgreen);
- XClearWindow(disp,win);
- return;
- }
+ if (!charging_state_mask)
+ return show_solid(pix_darkgreen);
+
+ if (charging_state_mask & CHGST_ERROR)
+ return show_solid(pix_yellow);
setbackground(pix_dimgrey);
XClearWindow(disp,win);
static void initgraphics(int argc, char **argv) {
int r;
- XTextProperty tp;
const char *geom_string;
XSizeHints *normal_hints;
XWMHints *wm_hints;
class_hint->res_name= program_name_silly;
class_hint->res_class= program_name_silly;
- /*r= XStringListToTextProperty(&program_name_silly, 1, &tp);
- if (!r) fail("XStringListtoTextProperty");*/
-
XmbSetWMProperties(disp,win, program_name,program_name,
argv,argc, normal_hints, wm_hints, class_hint);
static void eventloop(void) {
XEvent ev;
struct pollfd pfd;
- int r;
+ int r, timeout;
newgeometry();
refresh();
pfd.fd= ConnectionNumber(disp);
pfd.events= POLLIN|POLLERR;
- r= poll(&pfd,1,TIMEOUT);
+ timeout= !(charging_state_mask & CHGST_ERROR) ? TIMEOUT : TIMEOUT_ONERROR;
+ r= poll(&pfd,1,timeout);
if (r==-1 && errno!=EINTR) failr("poll",errno);
while (XPending(disp)) {