From owner-freebsd-ports-bugs@FreeBSD.ORG Tue Jan 15 21:10:03 2013 Return-Path: Delivered-To: freebsd-ports-bugs@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 368A28C4 for ; Tue, 15 Jan 2013 21:10:03 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 1A864879 for ; Tue, 15 Jan 2013 21:10:03 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.6/8.14.6) with ESMTP id r0FLA2rQ092974 for ; Tue, 15 Jan 2013 21:10:02 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.6/8.14.6/Submit) id r0FLA2JP092973; Tue, 15 Jan 2013 21:10:02 GMT (envelope-from gnats) Resent-Date: Tue, 15 Jan 2013 21:10:02 GMT Resent-Message-Id: <201301152110.r0FLA2JP092973@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-ports-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Yamagi Burmeister Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id D483A783 for ; Tue, 15 Jan 2013 21:04:06 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id F38BD844 for ; Tue, 15 Jan 2013 21:04:05 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.5/8.14.5) with ESMTP id r0FL45iM060043 for ; Tue, 15 Jan 2013 21:04:05 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.5/8.14.5/Submit) id r0FL45o0060042; Tue, 15 Jan 2013 21:04:05 GMT (envelope-from nobody) Message-Id: <201301152104.r0FL45o0060042@red.freebsd.org> Date: Tue, 15 Jan 2013 21:04:05 GMT From: Yamagi Burmeister To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Subject: ports/175332: [PATCH] Implement ACPI battery monitoring for x11/tint X-BeenThere: freebsd-ports-bugs@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Ports bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Jan 2013 21:10:03 -0000 >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 #include -#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) +#if defined(__OpenBSD__) || defined(__NetBSD__) #include #include #include #include #endif +#if defined(__FreeBSD__) +#include +#include +#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: