From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Lute Kamstra Newsgroups: gmane.emacs.devel Subject: Darwin support for lisp/battery.el. Date: Sat, 02 Jul 2005 14:21:42 +0200 Message-ID: <8764vtxusp.fsf@xs4all.nl> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable X-Trace: sea.gmane.org 1120307609 19743 80.91.229.2 (2 Jul 2005 12:33:29 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sat, 2 Jul 2005 12:33:29 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Jul 02 14:33:21 2005 Return-path: Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1DohBH-0003lX-Bv for ged-emacs-devel@m.gmane.org; Sat, 02 Jul 2005 14:33:12 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1DohCM-00027r-Qp for ged-emacs-devel@m.gmane.org; Sat, 02 Jul 2005 08:34:18 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Doh8A-0008M0-6B for emacs-devel@gnu.org; Sat, 02 Jul 2005 08:29:59 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Doh7t-00089k-Pu for emacs-devel@gnu.org; Sat, 02 Jul 2005 08:29:42 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Doh7t-00086Y-GN for emacs-devel@gnu.org; Sat, 02 Jul 2005 08:29:41 -0400 Original-Received: from [194.109.24.24] (helo=smtp-vbr4.xs4all.nl) by monty-python.gnu.org with esmtp (Exim 4.34) id 1Doh5W-0003lF-Ub for emacs-devel@gnu.org; Sat, 02 Jul 2005 08:27:15 -0400 Original-Received: from pijl (a80-127-67-124.adsl.xs4all.nl [80.127.67.124]) by smtp-vbr4.xs4all.nl (8.13.3/8.13.3) with ESMTP id j62CLhQp001871 for ; Sat, 2 Jul 2005 14:21:43 +0200 (CEST) (envelope-from Lute.Kamstra@xs4all.nl) Original-Received: from lute by pijl with local (Exim 3.36 #1 (Debian)) id 1Doh0A-0002rO-00 for ; Sat, 02 Jul 2005 14:21:42 +0200 Original-To: emacs-devel@gnu.org User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) Original-Lines: 187 X-Virus-Scanned: by XS4ALL Virus Scanner X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:40098 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:40098 Currently, lisp/battery.el supports only Linux. I've added support for Darwin. See the patch below. Is it ok to install this now, or should I wait until after the release? Lute. 2005-07-02 Lute Kamstra * battery.el: Add support for Darwin (with much debugging help from Samuel Lauber ). (battery-status-function, battery-echo-area-format) (battery-mode-line-format): Add support for pmset on Darwin. (battery-load-low, battery-load-critical): New user options. (battery-pmset): New function. Index: lisp/battery.el =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/emacs/emacs/lisp/battery.el,v retrieving revision 1.26 diff -c -r1.26 battery.el *** lisp/battery.el 1 Jul 2005 11:02:16 -0000 1.26 --- lisp/battery.el 2 Jul 2005 11:59:04 -0000 *************** *** 25,33 **** =20=20 ;;; Commentary: =20=20 ! ;; There is at present support for interpreting the new `/proc/apm' ! ;; file format of Linux version 1.3.58 or newer and for the `/proc/acpi/' ! ;; directory structure of Linux 2.4.20 and 2.6. =20=20 ;;; Code: =20=20 --- 25,34 ---- =20=20 ;;; Commentary: =20=20 ! ;; There is at present support for Linux and Darwin. This library ! ;; supports both the `/proc/apm' file format of Linux version 1.3.58 ! ;; or newer and the `/proc/acpi/' directory structure of Linux 2.4.20 ! ;; and 2.6. Darwin is supported by using the `pmset' program. =20=20 ;;; Code: =20=20 *************** *** 46,52 **** 'battery-linux-proc-apm) ((and (eq system-type 'gnu/linux) (file-directory-p "/proc/acpi/battery")) ! 'battery-linux-proc-acpi)) "*Function for getting battery status information. The function has to return an alist of conversion definitions. Its cons cells are of the form --- 47,57 ---- 'battery-linux-proc-apm) ((and (eq system-type 'gnu/linux) (file-directory-p "/proc/acpi/battery")) ! 'battery-linux-proc-acpi) ! ((and (eq system-type 'darwin) ! (ignore-errors ! (eq (call-process "pmset" nil nil nil "-g" "ps") 0))) ! 'battery-pmset)) "*Function for getting battery status information. The function has to return an alist of conversion definitions. Its cons cells are of the form *************** *** 62,68 **** (cond ((eq battery-status-function 'battery-linux-proc-apm) "Power %L, battery %B (%p%% load, remaining time %t)") ((eq battery-status-function 'battery-linux-proc-acpi) ! "Power %L, battery %B at %r (%p%% load, remaining time %t)")) "*Control string formatting the string to display in the echo area. Ordinary characters in the control string are printed as-is, while conversion specifications introduced by a `%' character in the control --- 67,75 ---- (cond ((eq battery-status-function 'battery-linux-proc-apm) "Power %L, battery %B (%p%% load, remaining time %t)") ((eq battery-status-function 'battery-linux-proc-acpi) ! "Power %L, battery %B at %r (%p%% load, remaining time %t)") ! ((eq battery-status-function 'battery-pmset) ! "%L power, battery %B (%p%% load, remaining time %t)")) "*Control string formatting the string to display in the echo area. Ordinary characters in the control string are printed as-is, while conversion specifications introduced by a `%' character in the control *************** *** 79,85 **** (cond ((eq battery-status-function 'battery-linux-proc-apm) "[%b%p%%]") ((eq battery-status-function 'battery-linux-proc-acpi) ! "[%b%p%%,%d=B0C]")) "*Control string formatting the string to display in the mode line. Ordinary characters in the control string are printed as-is, while conversion specifications introduced by a `%' character in the control --- 86,94 ---- (cond ((eq battery-status-function 'battery-linux-proc-apm) "[%b%p%%]") ((eq battery-status-function 'battery-linux-proc-acpi) ! "[%b%p%%,%d=B0C]") ! ((eq battery-status-function 'battery-pmset) ! "[%b%p%%]")) "*Control string formatting the string to display in the mode line. Ordinary characters in the control string are printed as-is, while conversion specifications introduced by a `%' character in the control *************** *** 93,98 **** --- 102,119 ---- :type 'integer :group 'battery) =20=20 + (defcustom battery-load-low 25 + "*Upper bound of low battery load percentage. + A battery load percentage below this number is considered low." + :type 'integer + :group 'battery) +=20 + (defcustom battery-load-critical 10 + "*Upper bound of critical battery load percentage. + A battery load percentage below this number is considered critical." + :type 'integer + :group 'battery) +=20 (defvar battery-update-timer nil "Interval timer object.") =20=20 *************** *** 343,348 **** --- 364,421 ---- "N/A"))))) =20=20 + ;;; `pmset' interface for Darwin. +=20 + (defun battery-pmset () + "Get battery status information using `pmset'. +=20 + The following %-sequences are provided: + %L Power source (verbose) + %B Battery status (verbose) + %b Battery status, empty means high, `-' means low, + `!' means critical, and `+' means charging + %p Battery load percentage + %h Remaining time in hours + %m Remaining time in minutes + %t Remaining time in the form `h:min'" + (let (power-source load-percentage battery-status battery-status-symbol + remaining-time hours minutes) + (with-temp-buffer + (ignore-errors (call-process "pmset" nil t nil "-g" "ps")) + (goto-char (point-min)) + (when (re-search-forward "Currentl?y drawing from '\\(AC\\|Battery\= \) Power'" nil t) + (setq power-source (match-string 1)) + (when (re-search-forward "^ -InternalBattery-0[ \t]+" nil t) + (when (looking-at "\\([0-9]\\{1,3\\}\\)%") + (setq load-percentage (match-string 1)) + (goto-char (match-end 0)) + (cond ((looking-at "; charging") + (setq battery-status "charging" + battery-status-symbol "+")) + ((< (string-to-number load-percentage) battery-load-low) + (setq battery-status "low" + battery-status-symbol "-")) + ((< (string-to-number load-percentage) battery-load-critical) + (setq battery-status "critical" + battery-status-symbol "!")) + (t + (setq battery-status "high" + battery-status-symbol ""))) + (when (re-search-forward "\\(\\([0-9]+\\):\\([0-9]+\\)\\) remaining"= nil t) + (setq remaining-time (match-string 1)) + (let ((h (string-to-number (match-string 2))) + (m (string-to-number (match-string 3)))) + (setq hours (number-to-string (+ h (if (< m 30) 0 1))) + minutes (number-to-string (+ (* h 60) m))))))))) + (list (cons ?L (or power-source "N/A")) + (cons ?p (or load-percentage "N/A")) + (cons ?B (or battery-status "N/A")) + (cons ?b (or battery-status-symbol "")) + (cons ?h (or hours "N/A")) + (cons ?m (or minutes "N/A")) + (cons ?t (or remaining-time "N/A"))))) +=20 + ;;; Private functions. =20=20 (defun battery-format (format alist)