--- xbatt.c.orig Fri Sep 11 10:47:12 1998 +++ xbatt.c Sat Jun 28 14:51:49 2008 @@ -43,12 +43,14 @@ */ #include +#include #include #include +#include #include #include #include -#include +#include #include #include #include @@ -65,6 +67,11 @@ # define APMDEV22 "/dev/apm" #endif +#ifdef __OpenBSD__ +# include +# define APMDEV "/dev/apm" +#endif /* __OpenBSD__ */ + #include "pixmaps/battery.xpm" #include "pixmaps/unknown.xpm" #include "bitmaps/full.xbm" @@ -195,6 +202,14 @@ main( } #endif +#ifdef __OpenBSD__ + /* initialize APM Interface */ + if ((apmfd = open(APMDEV, O_RDONLY)) == -1) { + fprintf(stderr, "xbatt: cannot open apm device\n"); + exit(1); + } +#endif /* __OpenBSD__ */ + /* start X-Window session */ XtSetLanguageProc( NULL, NULL, NULL ); toplevel = XtOpenApplication(&appContext, "XBatt", @@ -371,6 +386,52 @@ struct status getBatteryStatus() /* chrging or not. */ } #endif /* FreeBSD */ + +#ifdef __OpenBSD__ + struct apm_power_info info; + + if (ioctl(apmfd, APM_IOC_GETPOWER, &info) == -1) { + fprintf(stderr, "xbatt: ioctl APM_IOC_GETPOWER failed\n"); + exit(1); + } + + /* get current status */ + if (info.battery_life == APM_BATT_LIFE_UNKNOWN) { + switch (info.battery_state) { + case APM_BATT_HIGH: + ret.remain = 100; + break; + case APM_BATT_LOW: + ret.remain = 40; + break; + case APM_BATT_CRITICAL: + ret.remain = 10; + break; + default: /* expected to be APM_STAT_UNKNOWN */ + ret.remain = APM_STAT_UNKNOWN; + } + } else if (info.battery_life > 100) { + /* some APM BIOSes return values slightly > 100 */ + ret.remain = 100; + } else { + ret.remain = info.battery_life; + } + + /* get AC-line status */ + if (info.ac_state == APM_AC_ON) { + ret.acline = APM_STAT_LINE_ON; + } else { + ret.acline = APM_STAT_LINE_OFF; + } + + /* get charging status */ + if (info.battery_state == APM_BATT_CHARGING) { + ret.charge = APM_STAT_BATT_CHARGING; + } else { + ret.charge = APM_STAT_BATT_HIGH; /* I only want to know, */ + /* chrging or not. */ + } +#endif /* __OpenBSD__ */ #ifdef __linux__ char buffer[64];