--- xbatt.c.orig	Wed Jun 21 18:58:25 2000
+++ xbatt.c	Wed Jun 21 19:02:20 2000
@@ -65,6 +65,11 @@
 # define APMDEV22	"/dev/apm"
 #endif
 
+#ifdef __OpenBSD__
+# include <machine/apmvar.h>
+# define APMDEV                "/dev/apm"
+#endif /* __OpenBSD__ */
+
 #include "pixmaps/battery.xpm"
 #include "pixmaps/unknown.xpm"
 #include "bitmaps/full.xbm"
@@ -195,6 +200,12 @@
     }
 #endif
 
+#ifdef __OpenBSD__
+     /* initialize APM Interface */
+     if ((apmfd = open(APMDEV, O_RDONLY)) == -1)
+	err(1, "cannot open apm device");
+#endif /* __OpenBSD__ */
+
     /* start X-Window session */
     XtSetLanguageProc( NULL, NULL, NULL );
     toplevel = XtOpenApplication(&appContext, "XBatt",
@@ -371,6 +382,50 @@
 						/* chrging or not.	*/
     }
 #endif	/* FreeBSD */
+
+#ifdef __OpenBSD__
+    struct apm_power_info info;
+
+    if (ioctl(apmfd, APM_IOC_GETPOWER, &info) == -1)
+      err(1, "ioctl APM_IOC_GETPOWER failed");
+
+    /* 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];
