[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 01/01: * aumix-mode: New package.
From: |
Stefan Monnier |
Subject: |
[elpa] 01/01: * aumix-mode: New package. |
Date: |
Thu, 19 Jun 2014 19:51:59 +0000 |
monnier pushed a commit to branch master
in repository elpa.
commit 40266fbe42917e6c90824115175d72dd3c80a6f4
Author: Stefan Monnier <address@hidden>
Date: Thu Jun 19 15:51:48 2014 -0400
* aumix-mode: New package.
---
packages/aumix-mode/aumix-mode.el | 295 +++++++++++++++++++++++++++++++++++++
1 files changed, 295 insertions(+), 0 deletions(-)
diff --git a/packages/aumix-mode/aumix-mode.el
b/packages/aumix-mode/aumix-mode.el
new file mode 100644
index 0000000..8507fb7
--- /dev/null
+++ b/packages/aumix-mode/aumix-mode.el
@@ -0,0 +1,295 @@
+;;; aumix-mode.el --- run the aumix program in a buffer
+
+;; Copyright (C) 2006,2009-2011,2013-2014 Free Software Foundation, Inc.
+
+;; Author: Kevin Ryde <address@hidden>
+;; Version: 7
+;; Keywords: multimedia, mixer, aumix
+;; URL: http://user42.tuxfamily.org/aumix-mode/index.html
+;; EmacsWiki: Aumix
+;;
+;; aumix-mode.el 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.
+;;
+;; aumix-mode.el 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 can get a copy of the GNU General Public License online at
+;; <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+
+;; "M-x aumix" runs the aumix sound volume adjuster program in a buffer.
+;; See the docstrings of `aumix' and `aumix-mode' below.
+
+;;; Emacsen:
+
+;; Designed for Emacs 20 up. A bit doubtful with XEmacs 21 term.el (see
+;; `aumix-mode' docstring below).
+
+;;; Install:
+
+;; To make M-x aumix available put aumix-mode.el in one of your `load-path'
+;; directories and the following in your .emacs
+;;
+;; (autoload 'aumix "aumix-mode" nil t)
+;;
+;; If you use desktop.el then make an autoload for the aumix-mode function
+;; too so `desktop-read' can load it when restoring an aumix-mode buffer.
+;;
+;; (autoload 'aumix-mode "aumix-mode" nil t)
+;;
+;; There's autoload cookies for these functions below if you install via
+;; `M-x package-install' or know how to use `update-file-autoloads'.
+
+;;; History:
+
+;; Version 1 - the first version
+;; Version 2 - new program and switches variables
+;; - correction to `provide'
+;; Version 3 - flag aumix-mode-switches as risky-local-variable
+;; Version 4 - correction to `process-kill-without-query' for emacs21
+;; - cl for `dotimes' in emacs20
+;; Version 5 - ensure curses interface if aumix built with gtk interface
+;; - add desktop.el save/restore
+;; Version 6 - autoload aumix-mode for desktop.el
+;; Version 7 - don't autoload the variables
+
+;;; Code:
+
+(require 'term)
+(eval-when-compile
+ (unless (fboundp 'dotimes)
+ (require 'cl))) ;; for emacs20 dotimes
+
+
+;;;###autoload
+(defgroup aumix-mode nil "Aumix Mode"
+ :prefix "aumix-mode-"
+ :group 'multimedia
+ :link '(url-link :tag "aumix-mode.el home page"
+ "http://user42.tuxfamily.org/aumix-mode/index.html")
+ :link '(url-link :tag "Aumix home page"
+ "http://jpj.net/~trevor/aumix.html"))
+
+(defcustom aumix-mode-program "aumix"
+ "Executable program name for aumix."
+ :type 'string
+ :group 'aumix-mode)
+;; automatically `risky-local-variable-p' due to name `-program'
+
+(defcustom aumix-mode-switches nil
+ "List of command line switches to pass to aumix.
+Only a few aumix options do anything for interactive use.
+\"-d\" can set a mixer device file (default /dev/mixer), for
+example
+
+ (setq aumix-mode-switches '(\"-d\" \"/dev/mixer2\"))"
+
+ :type '(repeat string)
+ :group 'aumix-mode)
+;;
+;; Not sure if switches can do very much damage. Make risky just in case
+;; "-d filename" causes ioctls to some device other than a mixer.
+;;;###autoload
+(put 'aumix-mode-switches 'risky-local-variable t)
+
+(defcustom aumix-mode-hook nil
+ "Hook called by `aumix-mode'.
+This hook, and the parent `term-mode-hook', are run when the
+buffer setups are made but before the \"aumix\" program is
+started. This is convenient for applying `font-lock-mode' or
+similar before the program output starts.
+
+See also `term-exec-hook' which runs after \"aumix\" is started."
+
+ :type 'hook
+ :group 'aumix-mode
+ :options '(turn-on-filladapt-mode))
+
+;;-----------------------------------------------------------------------------
+
+(defvar aumix-mode-map (make-sparse-keymap)
+ "Keymap for `aumix-mode'.
+This inherits from parent keymap `term-raw-map'. That parent
+keymap is only set when `aumix-mode' is first called, since in
+Emacs 21 `term-raw-map' is only created then.
+
+Explicit nil settings in `aumix-mode-map' let control characters
+have their usual `global-map' meanings instead of `term-send-raw'
+in `term-raw-map'. This is good for keys aumix doesn't use, in
+particular C-x and C-h have their usual prefix meanings.
+
+C-c is left for the various prefixed bindings of `term-raw-map'.
+C-l and Tab are `term-send-raw' since they're used by the aumix
+program.")
+;;
+(dotimes (i 31)
+ (let ((key (1+ i))) ;; 1 to 31
+ (unless (member key '(?\C-c ?\C-l ?\t))
+ (define-key aumix-mode-map (vector key) nil))))
+(define-key aumix-mode-map "Q" 'aumix-mode-quit)
+(define-key aumix-mode-map "q" 'aumix-mode-quit)
+(define-key aumix-mode-map "\C-l" 'term-send-raw)
+
+;;-----------------------------------------------------------------------------
+
+(defun aumix-mode-quit ()
+ "Quit from aumix, and kill the buffer.
+This is a direct kill of the subprocess (rather than sending
+\"q\" to aumix and waiting for it to exit itself).
+
+For reference, if you use $LANG or $LANGUAGE set to something
+other than English then the quit key in aumix might be
+translated. For example \"b\" (Beenden) in German. In that case
+the aumix program exits but the buffer remains. The buffer is
+left on aumix exit so that if it dies then an error message is
+seen. Re-bind the keys in `aumix-mode-map' if something other
+than \"q\" for quit is desired."
+
+ (interactive)
+ (kill-buffer nil))
+
+(defun aumix-mode-kill-process ()
+ "An internal part of aumix-mode.el.
+This function is designed to be called from `kill-buffer-hook'.
+Kill the aumix sub-process when killing the buffer."
+ (if (get-buffer-process (current-buffer))
+ (delete-process nil)))
+
+;; this is autoloaded for the benefit of desktop.el
+;;;###autoload
+(defun aumix-mode ()
+ "Major mode for running the aumix program.
+Key bindings are per the aumix program. Press `k' for a summary,
+or see KEYS in \"man aumix\". `\\[aumix-mode-quit]' quits and kills the
buffer.
+
+The various terminal setups of `term-mode' are unchanged. Note
+in Emacs 24 the ANSI colours use `font-lock-mode' so be sure
+that's turned on (which it is by default). In Emacs 21 the
+opposite was true; if you turn on font lock then you lose the
+colours.
+
+In XEmacs 21.4, term.el doesn't seem to work very well with
+ncurses programs. A message \"Error opening terminal: eterm\" is
+from aumix (the ncurses library) complaining the terminfo is not
+found. Adding TERMINFO=/usr/share/xemacs21/xemacs-packages/etc/
+or wherever the /e/eterm file lives might help. If something
+doesn't work then C-c C-x C-k will kill the buffer.
+
+`clone-buffer' doesn't work on an aumix-mode buffer, as of Emacs
+24.3. Two or more aumix programs can run simultaneously (their
+displays update with the underlying mixer settings), so perhaps
+`clone-buffer' could be made to work. A `rename-buffer' and
+second `M-x aumix' works. But normally only a single aumix-mode
+buffer is desired.
+
+----
+The aumix home page is
+ URL `http://jpj.net/~trevor/aumix.html'
+The aumix-mode.el home page is
+ URL `http://user42.tuxfamily.org/aumix-mode/index.html'
+
+----
+\\{aumix-mode-map}
+"
+
+ (term-mode)
+
+ ;; kill sub-process when killing buffer
+ (if (eval-when-compile (fboundp 'make-local-hook))
+ (make-local-hook 'kill-buffer-hook)) ;; for xemacs21
+ (add-hook 'kill-buffer-hook 'aumix-mode-kill-process
+ nil ;; not append
+ t) ;; buffer-local
+
+ (setq major-mode 'aumix-mode
+ mode-name "Aumix")
+
+ ;; desktop.el no misc-data needed
+ (set (make-local-variable 'desktop-save-buffer) 'ignore)
+
+ (if (eval-when-compile (fboundp 'run-mode-hooks))
+ (run-mode-hooks 'aumix-mode-hook)
+ (run-hooks 'aumix-mode-hook))
+
+ ;; Unset $DISPLAY to ensure aumix uses the curses interface, not the gtk
+ ;; interface if it was built with gtk interface. The "-C" command line
+ ;; option can do that too, but as of aumix 2.9.1 in the curses build -C
+ ;; demands a colour file whereas prefer to leave that as the default
+ ;; colours or let the user put a "-C" colours in aumix-mode-switches.
+ (let ((process-environment (copy-sequence process-environment)))
+ (setenv "DISPLAY" nil)
+
+ (term-exec (current-buffer)
+ "aumix" ;; process name
+ aumix-mode-program nil aumix-mode-switches))
+
+ (term-char-mode)
+
+ (use-local-map aumix-mode-map)
+
+ ;; In term.el of emacs21 and xemacs21 `term-raw-map' is only created
+ ;; when `term-char-mode' is called, so must wait until this point to set
+ ;; it as the parent keymap.
+ (set-keymap-parent aumix-mode-map term-raw-map)
+
+ ;; `term-in-char-mode' looks for (current-local-map) equal to
+ ;; `term-raw-map' to identify char mode, so buffer-local setting of
+ ;; `term-raw-map' to be `aumix-mode-map' instead.
+ (set (make-local-variable 'term-raw-map) aumix-mode-map)
+
+ (let ((proc (get-buffer-process (current-buffer))))
+ ;; adapt to emacs22 pointless incompatible rename of
+ ;; `process-kill-without-query'
+ (if (eval-when-compile (fboundp 'set-process-query-on-exit-flag))
+ (set-process-query-on-exit-flag proc nil) ;; emacs22
+ (process-kill-without-query proc)))) ;; emacs21
+
+(put 'aumix-mode 'derived-mode-parent 'term-mode)
+
+;;;###autoload
+(defun aumix ()
+ "Run the aumix program in a buffer.
+An *aumix* buffer is created if it doesn't already exist.
+See `aumix-mode' for details of operating the mode."
+
+ (interactive)
+ (switch-to-buffer "*aumix*")
+ (unless (eq major-mode 'aumix-mode)
+ (aumix-mode)))
+
+;;-----------------------------------------------------------------------------
+;; desktop.el save/restore (for emacs22 up)
+;;
+;; `desktop-create-buffer' loads the .el of an autoload mode func such as
+;; `aumix-mode' when it appears in a saved desktop. The alternative would
+;; be to autoload `aumix-mode-desktop-restore' and the `eval-after-load',
+;; but that seems like more.
+
+(defun aumix-mode-desktop-restore (file-name buffer-name misc-data)
+ "Restore `aumix-mode' buffer for desktop.el.
+This is designed for use from `desktop-buffer-mode-handlers'."
+ ;; checkdoc-params: (file-name buffer-name misc-data)
+
+ (set-buffer (get-buffer-create buffer-name))
+ (aumix-mode)
+ (current-buffer)) ;; success, return buffer
+
+(eval-after-load "desktop"
+ '(when (boundp 'desktop-buffer-mode-handlers) ;; new in emacs22
+ (add-to-list 'desktop-buffer-mode-handlers
+ '(aumix-mode . aumix-mode-desktop-restore))))
+
+;;-----------------------------------------------------------------------------
+
+;; LocalWords: docstrings dev subprocess el ncurses terminfo eterm usr
+
+(provide 'aumix-mode)
+
+;;; aumix-mode.el ends here