X-Git-Url: https://git.xinqibao.xyz/slstatus.git/blobdiff_plain/96ddf4e1dee808d6ae8162fc1a13126a3d4c77dc..10bdf01b715dcc994f3fe32a6881d5e0b2613a6c:/components/battery.c

diff --git a/components/battery.c b/components/battery.c
index 1178f20..07b6ac1 100644
--- a/components/battery.c
+++ b/components/battery.c
@@ -195,4 +195,57 @@
 
 		return NULL;
 	}
+#elif defined(__FreeBSD__)
+	#include <sys/sysctl.h>
+
+	const char *
+	battery_perc(const char *unused)
+	{
+		int cap;
+		size_t len;
+
+		len = sizeof(cap);
+		if (sysctlbyname("hw.acpi.battery.life", &cap, &len, NULL, 0) == -1
+				|| !len)
+			return NULL;
+
+		return bprintf("%d", cap);
+	}
+
+	const char *
+	battery_state(const char *unused)
+	{
+		int state;
+		size_t len;
+
+		len = sizeof(state);
+		if (sysctlbyname("hw.acpi.battery.state", &state, &len, NULL, 0) == -1
+				|| !len)
+			return NULL;
+
+		switch(state) {
+			case 0:
+			case 2:
+				return "+";
+			case 1:
+				return "-";
+			default:
+				return "?";
+		}
+	}
+
+	const char *
+	battery_remaining(const char *unused)
+	{
+		int rem;
+		size_t len;
+
+		len = sizeof(rem);
+		if (sysctlbyname("hw.acpi.battery.time", &rem, &len, NULL, 0) == -1
+				|| !len
+				|| rem == -1)
+			return NULL;
+
+		return bprintf("%uh %02um", rem / 60, rem % 60);
+	}
 #endif