# HG changeset patch # User Eli Zaretskii # Date 1062876488 0 # Node ID d096f00804db9e8647c0267f820c6a054737e426 # Parent f558a29204a8e1fad81ab968b136e1f299a30ed9 (battery-linux-proc-acpi): New function. (battery-status-function): Modified default value calculation to also check for availability of ACPI. (battery-echo-area-format): Ditto. (battery-mode-line-format): Ditto. diff -r f558a29204a8 -r d096f00804db lisp/battery.el --- a/lisp/battery.el Sat Sep 06 19:27:29 2003 +0000 +++ b/lisp/battery.el Sat Sep 06 19:28:08 2003 +0000 @@ -42,7 +42,10 @@ (defcustom battery-status-function (cond ((and (eq system-type 'gnu/linux) (file-readable-p "/proc/apm")) - 'battery-linux-proc-apm)) + '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 @@ -56,7 +59,9 @@ (defcustom battery-echo-area-format (cond ((eq battery-status-function 'battery-linux-proc-apm) - "Power %L, battery %B (%p%% load, remaining time %t)")) + "Power %L, battery %B (%p%% load, remaining time %t)") + ((eq battery-status-function 'battery-linux-proc-acpi) + "Power %L, battery %B at %r mA (%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 @@ -70,7 +75,9 @@ (defcustom battery-mode-line-format (cond ((eq battery-status-function 'battery-linux-proc-apm) - " [%b%p%%]")) + " [%b%p%%]") + ((eq battery-status-function 'battery-linux-proc-acpi) + " [%b%p%%,%d°C]")) "*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 @@ -218,6 +225,104 @@ (cons ?t (or remaining-time "N/A"))))) +;;; `/proc/acpi/' interface for Linux. + +(defun battery-linux-proc-acpi () + "Get ACPI status information from Linux kernel. +This function works only with the new `/proc/acpi/' format introduced +in Linux version 2.4.20 and 2.6.0. + +The following %-sequences are provided: +%c Current capacity (mAh) +%B Battery status (verbose) +%b Battery status, empty means high, `-' means low, + `!' means critical, and `+' means charging +%d Temperature (in degrees Celsius) +%L AC line status (verbose) +%p battery load percentage +%m Remaining time in minutes +%h Remaining time in hours +%t Remaining time in the form `h:min'" + (let (capacity design-capacity rate charging-state warn low minutes hours) + (when (file-directory-p "/proc/acpi/battery/") + ;; ACPI provides information about each battery present in the system in + ;; a separate subdirectory. We are going to merge the available + ;; information together since displaying for a variable amount of + ;; batteries seems overkill for format-strings. + (mapc + (lambda (dir) + (with-temp-buffer + (insert-file-contents (expand-file-name "state" dir)) + (when (re-search-forward "present: +yes$" nil t) + (and (re-search-forward "charging state: +\\(.*\\)$" nil t) + (or (null charging-state) (string= charging-state + "unknown")) + ;; On most multi-battery systems, most of the time only one + ;; battery is "charging"/"discharging", the others are + ;; "unknown". + (setq charging-state (match-string 1))) + (when (re-search-forward "present rate: +\\([0-9]+\\) mA$" nil t) + (setq rate (+ (or rate 0) (string-to-int (match-string 1))))) + (when (re-search-forward "remaining capacity: +\\([0-9]+\\) mAh$" + nil t) + (setq capacity + (+ (or capacity 0) (string-to-int (match-string 1)))))) + (goto-char (point-max)) + (insert-file-contents (expand-file-name "info" dir)) + (when (re-search-forward "present: +yes$" nil t) + (when (re-search-forward "design capacity: +\\([0-9]+\\) mAh$" + nil t) + (setq design-capacity (+ (or design-capacity 0) + (string-to-int (match-string 1))))) + (when (re-search-forward "design capacity warning: +\\([0-9]+\\) mAh$" + nil t) + (setq warn (+ (or warn 0) (string-to-int (match-string 1))))) + (when (re-search-forward "design capacity low: +\\([0-9]+\\) mAh$" + nil t) + (setq low (+ (or low 0) + (string-to-int (match-string 1)))))))) + (directory-files "/proc/acpi/battery/" t "BAT"))) + (and capacity rate + (setq minutes (floor (* (/ (float (if (string= charging-state + "charging") + (- design-capacity capacity) + capacity)) rate) 60)) + hours (/ minutes 60))) + (list (cons ?c (or (and capacity (number-to-string capacity)) "N/A")) + (cons ?L (or (when (file-exists-p "/proc/acpi/ac_adapter/AC/state") + (with-temp-buffer + (insert-file-contents + "/proc/acpi/ac_adapter/AC/state") + (when (re-search-forward "state: +\\(.*\\)$" nil t) + (match-string 1)))) + "N/A")) + (cons ?d (or (when (file-exists-p + "/proc/acpi/thermal_zone/THRM/temperature") + (with-temp-buffer + (insert-file-contents + "/proc/acpi/thermal_zone/THRM/temperature") + (when (re-search-forward + "temperature: +\\([0-9]+\\) C$" nil t) + (match-string 1)))) + "N/A")) + (cons ?r (or (and rate (number-to-string rate)) "N/A")) + (cons ?B (or charging-state "N/A")) + (cons ?b (or (and (string= charging-state "charging") "+") + (and warn (< capacity warn) "-") + (and low (< capacity low) "!") + "")) + (cons ?h (or (and hours (number-to-string hours)) "N/A")) + (cons ?m (or (and minutes (number-to-string minutes)) "N/A")) + (cons ?t (or (and minutes + (format "%d:%02d" hours (- minutes (* 60 hours)))) + "N/A")) + (cons ?p (or (and design-capacity capacity + (number-to-string + (floor (/ capacity + (/ (float design-capacity) 100))))) + "N/A"))))) + + ;;; Private functions. (defun battery-format (format alist)