Commit 19b748ad authored by Timo Myyrä's avatar Timo Myyrä Committed by Chong Yidong

* battery.el (battery-bsd-apm): New function.

parent 70042c64
......@@ -41,6 +41,10 @@ bound to <f11> and S-<f11>, respectively.
* Changes in Specialized Modes and Packages in Emacs 24.4
** Battery
*** Battery information via the BSD `apm' utility is now supported.
** cl-lib
*** New macro cl-tagbody.
2012-12-16 Timo Myyrä <>
* battery.el (battery-bsd-apm): New function.
2012-12-16 Jay Belanger <>
* calc/calc.el (calc-standard-date-formats): Adjust one of the
......@@ -53,6 +53,9 @@
(directory-files "/sys/class/power_supply/" nil
((and (eq system-type 'berkeley-unix)
(file-executable-p "/usr/sbin/apm"))
((and (eq system-type 'darwin)
(condition-case nil
......@@ -523,6 +526,75 @@ The following %-sequences are provided:
;;; `apm' interface for BSD.
(defun battery-bsd-apm ()
"Get APM status information from BSD apm binary.
The following %-sequences are provided:
%L AC line status (verbose)
%B Battery status (verbose)
%b Battery status, empty means high, `-' means low,
`!' means critical, and `+' means charging
%P Advanced power saving mode state (verbose)
%p Battery charge percentage
%s Remaining battery charge time in seconds
%m Remaining battery charge time in minutes
%h Remaining battery charge time in hours
%t Remaining battery charge time in the form `h:min'"
(let* ((os-name (car (split-string
(shell-command-to-string "/usr/bin/uname"))))
(apm-flag (if (equal os-name "OpenBSD") "P" "s"))
(apm-cmd (concat "/usr/sbin/apm -ablm" apm-flag))
(apm-output (split-string (shell-command-to-string apm-cmd)))
;; Battery status
(let ((stat (string-to-number (nth 0 apm-output))))
(cond ((eq stat 0) '("high" . ""))
((eq stat 1) '("low" . "-"))
((eq stat 2) '("critical" . "!"))
((eq stat 3) '("charging" . "+"))
((eq stat 4) '("absent" . nil)))))
;; Battery percentage
(battery-percentage (nth 1 apm-output))
;; Battery life
(battery-life (nth 2 apm-output))
;; AC status
(let ((ac (string-to-number (nth 3 apm-output))))
(cond ((eq ac 0) "disconnected")
((eq ac 1) "connected")
((eq ac 2) "backup power"))))
;; Advanced power savings mode
(let ((apm (string-to-number (nth 4 apm-output))))
(if (string= os-name "OpenBSD")
(cond ((eq apm 0) "manual")
((eq apm 1) "automatic")
((eq apm 2) "cool running"))
(if (eq apm 1) "on" "off"))))
seconds minutes hours remaining-time)
(unless (member battery-life '("unknown" "-1"))
(if (member os-name '("OpenBSD" "NetBSD"))
(setq minutes (string-to-number battery-life)
seconds (* 60 minutes))
(setq seconds (string-to-number battery-life)
minutes (truncate (/ seconds 60))))
(setq hours (truncate (/ minutes 60))
remaining-time (format "%d:%02d" hours
(- minutes (* 60 hours)))))
(list (cons ?L (or line-status "N/A"))
(cons ?B (or (car battery-status) "N/A"))
(cons ?b (or (cdr battery-status) "N/A"))
(cons ?p (if (string= battery-percentage "255")
(cons ?P (or apm-mode "N/A"))
(cons ?s (or (and seconds (number-to-string seconds)) "N/A"))
(cons ?m (or (and minutes (number-to-string minutes)) "N/A"))
(cons ?h (or (and hours (number-to-string hours)) "N/A"))
(cons ?t (or remaining-time "N/A")))))
;;; `pmset' interface for Darwin (OS X).
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment