Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Jan 2013 21:04:05 GMT
From:      Yamagi Burmeister <yamagi@yamagi.org>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/175332: [PATCH] Implement ACPI battery monitoring for x11/tint
Message-ID:  <201301152104.r0FL45o0060042@red.freebsd.org>
Resent-Message-ID: <201301152110.r0FLA2JP092973@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         175332
>Category:       ports
>Synopsis:       [PATCH] Implement ACPI battery monitoring for x11/tint
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 15 21:10:02 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Yamagi Burmeister
>Release:        FreeBSD 8.3-RELEASE
>Organization:
>Environment:
FreeBSD maka.home.yamagi.org 8.3-RELEASE-p4 FreeBSD 8.3-RELEASE-p4 #0 r239214M: Sun Aug 12 20:32:17 CEST 2012     root@maka.home.yamagi.org:/usr/obj/usr/src/sys/MAKA  amd64
>Description:
A long time ago I implemented ACPI battery monitoring for x11/tint. Other than the included APM battery monitor it works on nearly all modern laptops. The patch was committed upstream and would have been part of the next release. But that release never came and so the patch never reached the ports collection. After a recent forum discussion I've digged it up again and here it is. Put the attached patch into the files/ directory of x11/tint and the panel grows ACPI battery monitoring.

The upstream changeset can be found here: http://code.google.com/p/tint2/source/diff?spec=svn515&r=515&format=side&path=/trunk/src/battery/battery.c
>How-To-Repeat:
-
>Fix:
Index: src/battery/battery.c
===================================================================
--- src/battery/battery.c	(Revision 514)
+++ src/battery/battery.c	(Revision 515)
@@ -24,13 +24,18 @@
 #include <cairo-xlib.h>
 #include <pango/pangocairo.h>
 
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 #include <machine/apmvar.h>
 #include <err.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
 #endif
 
+#if defined(__FreeBSD__)
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
 #include "window.h"
 #include "server.h"
 #include "area.h"
@@ -59,11 +64,10 @@
 char *path_current_now;
 char *path_status;
 
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 int apm_fd;
 #endif
 
-
 void update_batterys(void* arg)
 {
 	int i;
@@ -103,7 +107,7 @@
 	path_energy_full = 0;
 	path_current_now = 0;
 	path_status = 0;
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 	apm_fd = -1;
 #endif
 }
@@ -118,7 +122,7 @@
 	if (path_status) g_free(path_status);
 	if (battery_low_cmd) g_free(battery_low_cmd);
 
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 	if ((apm_fd != -1) && (close(apm_fd) == -1))
 		warn("cannot close /dev/apm");
 #endif
@@ -129,7 +133,7 @@
 {
 	if (!battery_enabled) return;
 
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 	apm_fd = open("/dev/apm", O_RDONLY);
 	if (apm_fd < 0) {
 		warn("init_battery: failed to open /dev/apm.");
@@ -137,7 +141,7 @@
 		return;
 	}
 
-#else
+#elif !defined(__FreeBSD__)
 	// check battery
 	GDir *directory = 0;
 	GError *error = NULL;
@@ -258,17 +262,21 @@
 
 
 void update_battery() {
-#if !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__NetBSD__)
+#if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__)
 	// unused on OpenBSD, silence compiler warnings
 	FILE *fp;
 	char tmp[25];
 	int64_t current_now = 0;
 #endif
+#if defined(__FreeBSD__)
+	int sysctl_out =  0;
+	size_t len = 0;
+#endif
 	int64_t energy_now = 0, energy_full = 0;
 	int seconds = 0;
 	int8_t new_percentage = 0;
 
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+#if defined(__OpenBSD__) || defined(__NetBSD__)
 	struct apm_power_info info;
 	if (ioctl(apm_fd, APM_IOC_GETPOWER, &(info)) < 0)
 		warn("power update: APM_IOC_GETPOWER");
@@ -298,6 +306,45 @@
 
 	new_percentage = info.battery_life;
 
+#elif defined(__FreeBSD__)
+	len = sizeof(sysctl_out);
+
+	if (sysctlbyname("hw.acpi.battery.state", &sysctl_out, &len, NULL, 0) != 0)
+		fprintf(stderr, "power update: no such sysctl");
+
+	// attemp to map the battery state to linux
+	battery_state.state = BATTERY_UNKNOWN;
+
+	switch(sysctl_out) {
+		case 1:
+			battery_state.state = BATTERY_DISCHARGING;
+			break;
+		case 2:
+			battery_state.state = BATTERY_CHARGING;
+			break;
+		default:
+			battery_state.state = BATTERY_FULL;
+			break;
+	}
+
+	// no mapping for freebsd
+	energy_full = 0;
+	energy_now = 0;
+
+	if (sysctlbyname("hw.acpi.battery.time", &sysctl_out, &len, NULL, 0) != 0)
+		seconds = -1;
+	else
+		seconds = sysctl_out * 60;
+
+	// charging or error
+	if (seconds < 0)
+		seconds = 0;
+
+	if (sysctlbyname("hw.acpi.battery.life", &sysctl_out, &len, NULL, 0) != 0)
+		new_percentage = -1;
+	else
+		new_percentage = sysctl_out;
+
 #else
 	fp = fopen(path_status, "r");
 	if(fp != NULL) { 

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201301152104.r0FL45o0060042>