Mercurial > emacs
view lisp/battery.el @ 80455:4b3759b14cc7
(mac_end_cg_clip): Add argument F. All uses changed.
(mac_begin_cg_clip, mac_end_cg_clip): Allow null GC.
(mac_invert_rectangle, mac_compute_glyph_string_overhangs)
(mac_load_query_font): Use them instead of SetPortWindowPort.
(mac_clear_window) [!USE_CG_DRAWING]: Likewise.
(mac_draw_image_string_cg): Call CGContextSetTextMatrix.
(x_update_begin, x_update_end): Call mac_update_begin and
mac_update_end.
(XTframe_up_to_date): Call mac_frame_up_to_date.
(XTring_bell): Use mac_alert_sound_play.
(note_mouse_movement): Use mac_get_frame_bounds.
(XTmouse_position): Use mac_get_frame_mouse.
(x_scroll_bar_create): Use mac_create_scroll_bar.
(x_scroll_bar_remove): Use mac_dispose_scroll_bar.
(XTset_vertical_scroll_bar): Use mac_set_scroll_bar_bounds and
mac_redraw_scroll_bar.
(mac_move_window_with_gravity) [USE_MAC_TOOLBAR]: Use mac_move_window
instead of MoveWindow.
(mac_handle_size_change) [TARGET_API_MAC_CARBON]:
Use mac_reposition_hourglass.
(x_set_offset): Use mac_move_window_structure instead of
MoveWindowStructure.
(x_set_window_size): Use mac_size_window instead of SizeWindow.
(x_set_mouse_pixel_position) [MAC_OSX]:
Use mac_convert_frame_point_to_global.
(x_raise_frame): Use mac_bring_window_to_front instead of BringToFront.
(x_lower_frame): Use mac_send_window_behind instead of SendBehind.
(mac_handle_visibility_change): Use Window instead of WindowRef.
Use mac_is_window_visible/mac_is_window_collapsed instead of
IsWindowVisible/IsWindowCollapsed, respectively.
Use mac_collapse_window/mac_show_window instead of
CollapseWindow/ShowWindow, respectively.
(x_make_frame_invisible): Use mac_hide_window instead of HideWindow.
(x_iconify_frame): Use mac_show_window instead of ShowWindow.
Use mac_collapse_window instead of CollapseWindow.
(x_free_frame_resources): Use Window instead of WindowRef.
Use mac_dispose_frame_window. Clean up focus-related variables before
calling mac_dispose_frame_window.
(do_zoom_window) [MAC_OS8]: Use mac_clear_area instead of
mac_clear_window.
(mac_initialize): Use mac_toolbox_initialize instead of
initializing any_help_event_p and calling init_apple_event_handler,
init_tsm, and init_menu_bar.
(any_help_event_p, last_window, save_port_clip_region)
(read_socket_inev, saved_menu_event_location): Move variables to
mactoolbox.c.
(last_scroll_bar_part, scroll_bar_timer)
(scroll_bar_timer_event_posted_p) [USE_TOOLKIT_SCROLL_BARS]: Likewise.
(font_panel_shown_p) [USE_MAC_FONT_PANEL]: Likewise.
(tsm_document_id) [USE_MAC_TSM]: Likewise.
(mouse_region) [!TARGET_API_MAC_CARBON]: Likewise.
(mac_window_to_frame, DEFAULT_NUM_COLS, MIN_DOC_SIZE, MAX_DOC_SIZE):
Move defines to mactoolbox.c.
(FRAME_CG_CONTEXT) [USE_CG_DRAWING]: Likewise.
(SCROLL_BAR_FIRST_DELAY, SCROLL_BAR_CONTINUOUS_DELAY)
[USE_TOOLKIT_SCROLL_BARS]: Likewise.
(TOOLBAR_IDENTIFIER, TOOLBAR_ICON_ITEM_IDENTIFIER)
(TOOLBAR_ITEM_COMMAND_ID_OFFSET, TOOLBAR_ITEM_COMMAND_ID_P)
(TOOLBAR_ITEM_COMMAND_ID_VALUE, TOOLBAR_ITEM_MAKE_COMMAND_ID)
[USE_MAC_TOOLBAR]: Likewise.
(M_APPLE, I_ABOUT, EXTRA_STACK_ALLOC, ARGV_STRING_LIST_ID)
(RAM_TOO_LARGE_ALERT_ID, ABOUT_ALERT_ID): Move defines to macgui.h
(x_flush, is_emacs_window, mac_begin_clip, mac_end_clip)
(x_scroll_bar_handle_click, x_scroll_bar_report_motion)
(mac_get_window_bounds, do_window_update, is_emacs_window)
(do_grow_window, do_zoom_window, install_window_handler)
(remove_window_handler, XTread_socket, init_menu_bar): Move functions
to mactoolbox.c.
(mac_flush_display_optional, mac_begin_cg_clip, mac_end_cg_clip)
(mac_prepare_for_quickdraw) [USE_CG_DRAWING]: Likewise.
(mac_scroll_area, mac_event_to_emacs_modifiers, mac_get_mouse_btn)
(mac_convert_event_ref, mac_get_ideal_size, mac_store_drag_event)
(mac_handle_window_event, mac_handle_keyboard_event)
(mac_handle_command_event, mac_handle_mouse_event)
(install_application_handler, mac_post_mouse_moved_event)
[TARGET_API_MAC_CARBON]: Likewise.
(scroll_bar_timer_callback, install_scroll_bar_timer)
(set_scroll_bar_timer, control_part_code_to_scroll_bar_part)
(construct_scroll_bar_click, get_control_part_bounds)
(x_scroll_bar_handle_press, x_scroll_bar_handle_release)
(x_scroll_bar_handle_drag, x_set_toolkit_scroll_bar_thumb)
[USE_TOOLKIT_SCROLL_BARS]: Likewise.
(x_scroll_bar_set_handle, x_scroll_bar_note_movement)
[!USE_TOOLKIT_SCROLL_BARS]: Likewise.
(mac_handle_toolbar_event, mac_create_frame_tool_bar)
(update_frame_tool_bar, free_frame_tool_bar)
(mac_tool_bar_note_mouse_movement, mac_handle_toolbar_command_event)
[USE_MAC_TOOLBAR]: Likewise.
(mac_font_panel_visible_p, mac_handle_font_event)
(mac_show_hide_font_panel, mac_set_font_info_for_selection)
[USE_MAC_FONT_PANEL]: Likewise.
(mac_handle_text_input_event, init_tsm) [USE_MAC_TSM]: Likewise.
(do_apple_menu, mac_wait_next_event) [!TARGET_API_MAC_CARBON]: Likewise.
(mac_store_service_event) [MAC_OSX]: Likewise.
(last_mouse_glyph, last_mouse_glyph_frame, last_mouse_scroll_bar)
(last_mouse_movement_time, input_signal_count)
(mac_screen_config_changed, Qhi_command, Qtoolbar_switch_mode)
(Qservice, Qpaste, Qperform, keycode_to_xkeysym_table): Make variables
non-static.
(Qpanel_closed, Qselection) [USE_MAC_FONT_PANEL]: Likewise.
(Qtext_input, Vmac_ts_active_input_overlay, Qupdate_active_input_area)
(Qunicode_for_key_event, Vmac_ts_script_language_on_focus)
(saved_ts_script_language_on_focus) [USE_MAC_TSM]: Likewise.
(mac_focus_changed, note_mouse_movement, mac_focus_frame)
(mac_handle_origin_change, mac_handle_size_change)
(mac_handle_visibility_change, mac_to_emacs_modifiers)
(mac_mapped_modifiers, mac_get_emulated_btn, do_keystroke)
(mac_get_screen_info): Make functions non-static.
(mac_move_window_with_gravity, mac_get_window_origin_with_gravity)
(mac_image_spec_to_cg_image) [USE_MAC_TOOLBAR]: Likewise.
(mac_store_event_ref_as_apple_event) [TARGET_API_MAC_CARBON]: Likewise.
(Qwindow, mac_ready_for_apple_events): Move externs to mactoolbox.c.
(Qbefore_string) [USE_MAC_TSM]: Likewise.
(mac_toolbox_initialize, x_scroll_bar_report_motion, XTread_socket):
Add externs.
(mac_flush_display_optional) [USE_CG_DRAWING]: Likewise.
(install_drag_handler, remove_drag_handler, install_service_handler)
(install_menu_target_item_handler): Remove externs.
(XSetWindowBackground): Rename to mac_set_frame_window_background.
Take frame as argument instead of display and window.
Move to mactoolbox.c.
(mac_restore_keyboard_input_source, mac_save_keyboard_input_source)
[USE_MAC_TSM]: New functions created from mac_tsm_resume and
mac_tsm_suspend, respectively.
(mac_tsm_resume, mac_tsm_suspend) [USE_MAC_TSM]: Use them.
Move to mactoolbox.c.
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
---|---|
date | Sun, 06 Apr 2008 01:58:59 +0000 |
parents | 73661ddc7ac7 |
children | 606f2d163a64 ba8704a0f1e5 |
line wrap: on
line source
;;; battery.el --- display battery status information ;; Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Author: Ralph Schleicher <rs@nunatak.allgaeu.org> ;; Keywords: hardware ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; There is at present support for GNU/Linux and OS X. 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 (OS X) is supported by using the `pmset' program. ;;; Code: (require 'timer) (eval-when-compile (require 'cl)) (defgroup battery nil "Display battery status information." :prefix "battery-" :group 'hardware) (defcustom battery-status-function (cond ((and (eq system-type 'gnu/linux) (file-readable-p "/proc/apm")) '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) (condition-case nil (with-temp-buffer (and (eq (call-process "pmset" nil t nil "-g" "ps") 0) (> (buffer-size) 0))) (error nil))) '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 (CONVERSION . REPLACEMENT-TEXT) CONVERSION is the character code of a \"conversion specification\" introduced by a `%' character in a control string." :type '(choice (const nil) function) :group 'battery) (defcustom battery-echo-area-format (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 string are substituted as defined by the current value of the variable `battery-status-function'. Here are the ones generally available: %c Current capacity (mAh or mWh) %r Current rate of charge or discharge %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 (to charge or discharge) in minutes %h Remaining time (to charge or discharge) in hours %t Remaining time (to charge or discharge) in the form `h:min'" :type '(choice string (const nil)) :group 'battery) (defvar battery-mode-line-string nil "String to display in the mode line.") ;;;###autoload (put 'battery-mode-line-string 'risky-local-variable t) (defcustom battery-mode-line-format (cond ((eq battery-status-function 'battery-linux-proc-apm) "[%b%p%%]") ((eq battery-status-function 'battery-linux-proc-acpi) "[%b%p%%,%d°C]") ((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 string are substituted as defined by the current value of the variable `battery-status-function'. Here are the ones generally available: %c Current capacity (mAh or mWh) %r Current rate of charge or discharge %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 (to charge or discharge) in minutes %h Remaining time (to charge or discharge) in hours %t Remaining time (to charge or discharge) in the form `h:min'" :type '(choice string (const nil)) :group 'battery) (defcustom battery-update-interval 60 "*Seconds after which the battery status will be updated." :type 'integer :group 'battery) (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) (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) (defvar battery-update-timer nil "Interval timer object.") ;;;###autoload (defun battery () "Display battery status information in the echo area. The text being displayed in the echo area is controlled by the variables `battery-echo-area-format' and `battery-status-function'." (interactive) (message "%s" (if (and battery-echo-area-format battery-status-function) (battery-format battery-echo-area-format (funcall battery-status-function)) "Battery status not available"))) ;;;###autoload (define-minor-mode display-battery-mode "Display battery status information in the mode line. The text being displayed in the mode line is controlled by the variables `battery-mode-line-format' and `battery-status-function'. The mode line will be updated automatically every `battery-update-interval' seconds." :global t :group 'battery (setq battery-mode-line-string "") (or global-mode-string (setq global-mode-string '(""))) (and battery-update-timer (cancel-timer battery-update-timer)) (if (not display-battery-mode) (setq global-mode-string (delq 'battery-mode-line-string global-mode-string)) (add-to-list 'global-mode-string 'battery-mode-line-string t) (setq battery-update-timer (run-at-time nil battery-update-interval 'battery-update-handler)) (battery-update))) (defun battery-update-handler () (battery-update) (sit-for 0)) (defun battery-update () "Update battery status information in the mode line." (setq battery-mode-line-string (propertize (if (and battery-mode-line-format battery-status-function) (battery-format battery-mode-line-format (funcall battery-status-function)) "") 'help-echo "Battery status information")) (force-mode-line-update)) ;;; `/proc/apm' interface for Linux. (defconst battery-linux-proc-apm-regexp (concat "^\\([^ ]+\\)" ; Driver version. " \\([^ ]+\\)" ; APM BIOS version. " 0x\\([0-9a-f]+\\)" ; APM BIOS flags. " 0x\\([0-9a-f]+\\)" ; AC line status. " 0x\\([0-9a-f]+\\)" ; Battery status. " 0x\\([0-9a-f]+\\)" ; Battery flags. " \\(-?[0-9]+\\)%" ; Load percentage. " \\(-?[0-9]+\\)" ; Remaining time. " \\(.*\\)" ; Time unit. "$") "Regular expression matching contents of `/proc/apm'.") (defun battery-linux-proc-apm () "Get APM status information from Linux kernel. This function works only with the new `/proc/apm' format introduced in Linux version 1.3.58. The following %-sequences are provided: %v Linux driver version %V APM BIOS version %I APM BIOS status (verbose) %L AC line status (verbose) %B Battery status (verbose) %b Battery status, empty means high, `-' means low, `!' means critical, and `+' means charging %p Battery load percentage %s Remaining time (to charge or discharge) in seconds %m Remaining time (to charge or discharge) in minutes %h Remaining time (to charge or discharge) in hours %t Remaining time (to charge or discharge) in the form `h:min'" (let (driver-version bios-version bios-interface line-status battery-status battery-status-symbol load-percentage seconds minutes hours remaining-time tem) (with-temp-buffer (ignore-errors (insert-file-contents "/proc/apm")) (when (re-search-forward battery-linux-proc-apm-regexp) (setq driver-version (match-string 1)) (setq bios-version (match-string 2)) (setq tem (string-to-number (match-string 3) 16)) (if (not (logand tem 2)) (setq bios-interface "not supported") (setq bios-interface "enabled") (cond ((logand tem 16) (setq bios-interface "disabled")) ((logand tem 32) (setq bios-interface "disengaged"))) (setq tem (string-to-number (match-string 4) 16)) (cond ((= tem 0) (setq line-status "off-line")) ((= tem 1) (setq line-status "on-line")) ((= tem 2) (setq line-status "on backup"))) (setq tem (string-to-number (match-string 6) 16)) (if (= tem 255) (setq battery-status "N/A") (setq tem (string-to-number (match-string 5) 16)) (cond ((= tem 0) (setq battery-status "high" battery-status-symbol "")) ((= tem 1) (setq battery-status "low" battery-status-symbol "-")) ((= tem 2) (setq battery-status "critical" battery-status-symbol "!")) ((= tem 3) (setq battery-status "charging" battery-status-symbol "+"))) (setq load-percentage (match-string 7)) (setq seconds (string-to-number (match-string 8))) (and (string-equal (match-string 9) "min") (setq seconds (* 60 seconds))) (setq minutes (/ seconds 60) hours (/ seconds 3600)) (setq remaining-time (format "%d:%02d" hours (- minutes (* 60 hours)))))))) (list (cons ?v (or driver-version "N/A")) (cons ?V (or bios-version "N/A")) (cons ?I (or bios-interface "N/A")) (cons ?L (or line-status "N/A")) (cons ?B (or battery-status "N/A")) (cons ?b (or battery-status-symbol "")) (cons ?p (or load-percentage "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"))))) ;;; `/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) %r Current rate %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 (to charge or discharge) in minutes %h Remaining time (to charge or discharge) in hours %t Remaining time (to charge or discharge) in the form `h:min'" (let ((design-capacity 0) (last-full-capacity 0) full-capacity (warn 0) (low 0) capacity rate rate-type charging-state minutes hours) ;; 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. (with-temp-buffer (dolist (dir (ignore-errors (directory-files "/proc/acpi/battery/" t "\\`[^.]"))) (erase-buffer) (ignore-errors (insert-file-contents (expand-file-name "state" dir))) (when (re-search-forward "present: +yes$" nil t) (and (re-search-forward "charging state: +\\(.*\\)$" nil t) (member charging-state '("unknown" "charged" nil)) ;; 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]+\\) \\(m[AW]\\)$" nil t) (setq rate (+ (or rate 0) (string-to-number (match-string 1))) rate-type (or (and rate-type (if (string= rate-type (match-string 2)) rate-type (error "Inconsistent rate types (%s vs. %s)" rate-type (match-string 2)))) (match-string 2)))) (when (re-search-forward "remaining capacity: +\\([0-9]+\\) m[AW]h$" nil t) (setq capacity (+ (or capacity 0) (string-to-number (match-string 1)))))) (goto-char (point-max)) (ignore-errors (insert-file-contents (expand-file-name "info" dir))) (when (re-search-forward "present: +yes$" nil t) (when (re-search-forward "design capacity: +\\([0-9]+\\) m[AW]h$" nil t) (incf design-capacity (string-to-number (match-string 1)))) (when (re-search-forward "last full capacity: +\\([0-9]+\\) m[AW]h$" nil t) (incf last-full-capacity (string-to-number (match-string 1)))) (when (re-search-forward "design capacity warning: +\\([0-9]+\\) m[AW]h$" nil t) (incf warn (string-to-number (match-string 1)))) (when (re-search-forward "design capacity low: +\\([0-9]+\\) m[AW]h$" nil t) (incf low (string-to-number (match-string 1))))))) (setq full-capacity (if (> last-full-capacity 0) last-full-capacity design-capacity)) (and capacity rate (setq minutes (if (zerop rate) 0 (floor (* (/ (float (if (string= charging-state "charging") (- full-capacity capacity) capacity)) rate) 60))) hours (/ minutes 60))) (list (cons ?c (or (and capacity (number-to-string capacity)) "N/A")) (cons ?L (or (battery-search-for-one-match-in-files (mapcar (lambda (e) (concat e "/state")) (ignore-errors (directory-files "/proc/acpi/ac_adapter/" t "\\`[^.]"))) "state: +\\(.*\\)$" 1) "N/A")) (cons ?d (or (battery-search-for-one-match-in-files (mapcar (lambda (e) (concat e "/temperature")) (ignore-errors (directory-files "/proc/acpi/thermal_zone/" t "\\`[^.]"))) "temperature: +\\([0-9]+\\) C$" 1) "N/A")) (cons ?r (or (and rate (concat (number-to-string rate) " " rate-type)) "N/A")) (cons ?B (or charging-state "N/A")) (cons ?b (or (and (string= charging-state "charging") "+") (and capacity (< capacity low) "!") (and capacity (< capacity warn) "-") "")) (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 full-capacity capacity (> full-capacity 0) (number-to-string (floor (/ capacity (/ (float full-capacity) 100))))) "N/A"))))) ;;; `pmset' interface for Darwin (OS X). (defun battery-pmset () "Get battery status information using `pmset'. 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"))))) ;;; Private functions. (defun battery-format (format alist) "Substitute %-sequences in FORMAT." (replace-regexp-in-string "%." (lambda (str) (let ((char (aref str 1))) (if (eq char ?%) "%" (or (cdr (assoc char alist)) "")))) format t t)) (defun battery-search-for-one-match-in-files (files regexp match-num) "Search REGEXP in the content of the files listed in FILES. If a match occurred, return the parenthesized expression numbered by MATCH-NUM in the match. Otherwise, return nil." (with-temp-buffer (catch 'found (dolist (file files) (and (ignore-errors (insert-file-contents file nil nil nil 'replace)) (re-search-forward regexp nil t) (throw 'found (match-string match-num))))))) (provide 'battery) ;; arch-tag: 65916f50-4754-4b6b-ac21-0b510f545a37 ;;; battery.el ends here