]> code.delx.au - gnu-emacs/blobdiff - lisp/erc/erc-menu.el
Merge from emacs-24; up to 2013-01-03T02:37:57Z!rgm@gnu.org
[gnu-emacs] / lisp / erc / erc-menu.el
index a2dc7a1b2f20a3ba3955b6d72d9db7fa34dabc8e..ab11df920638df1311e541f9701aad42004e7581 100644 (file)
@@ -1,16 +1,17 @@
 ;; erc-menu.el -- Menu-bar definitions for ERC
 
-;; Copyright (C) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+;; Copyright (C) 2001-2002, 2004-2013 Free Software Foundation, Inc.
 
 ;; Author: Mario Lang <mlang@delysid.org>
+;; Maintainer: FSF
 ;; Keywords: comm, processes, menu
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; 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 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, 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
@@ -18,9 +19,7 @@
 ;; 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.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 ;;; Code:
 
-;(require 'erc)
+(require 'erc)
 (require 'easymenu)
 
+(defgroup erc-menu nil
+  "ERC menu support."
+  :group 'erc)
+
 (defvar erc-menu-definition
   (list "ERC"
        ["Connect to server..." erc t]
         (and erc-server-connected (fboundp 'erc-list-channels))]
        ["Join channel..." erc-join-channel erc-server-connected]
        ["Start a query..." erc-cmd-QUERY erc-server-connected]
-       "-"
-       ["List users in channel" erc-channel-names erc-channel-users]
-       ["List channel operators" erc-cmd-OPS erc-channel-users]
        ["Input action..." erc-input-action (erc-default-target)]
-       ["Set topic..." erc-set-topic
-        (and (and (erc-default-target) (not (erc-query-buffer-p)))
-             (or (not (member "t" erc-channel-modes))
-                 (erc-channel-user-op-p (erc-current-nick))))]
-       (list "Channel modes"
-             ["Change mode..." erc-insert-mode-command
-              (erc-channel-user-op-p (erc-current-nick))]
-             ["No external send" (erc-toggle-channel-mode "n")
-              :active (erc-channel-user-op-p (erc-current-nick))
-              :style toggle :selected (member "n" erc-channel-modes)]
-             ["Topic set by channel operator" (erc-toggle-channel-mode "t")
-              :style toggle :selected (member "t" erc-channel-modes)
-              :active (erc-channel-user-op-p (erc-current-nick))]
-             ["Invite only" (erc-toggle-channel-mode "i")
-              :style toggle :selected (member "i" erc-channel-modes)
-              :active (erc-channel-user-op-p (erc-current-nick))]
-             ["Private" (erc-toggle-channel-mode "p")
-              :style toggle :selected (member "p" erc-channel-modes)
-              :active (erc-channel-user-op-p (erc-current-nick))]
-             ["Secret" (erc-toggle-channel-mode "s")
-              :style toggle :selected (member "s" erc-channel-modes)
-              :active (erc-channel-user-op-p (erc-current-nick))]
-             ["Moderated" (erc-toggle-channel-mode "m")
-              :style toggle :selected (member "m" erc-channel-modes)
-              :active (erc-channel-user-op-p (erc-current-nick))]
-             ["Set a limit..." erc-set-channel-limit
-              (erc-channel-user-op-p (erc-current-nick))]
-             ["Set a key..." erc-set-channel-key
-              (erc-channel-user-op-p (erc-current-nick))])
-       ["Leave this channel..." erc-part-from-channel erc-channel-users]
+       "-"
+       (list
+        "Current channel"
+        ["List users in channel" erc-channel-names erc-channel-users]
+        ["List channel operators" erc-cmd-OPS erc-channel-users]
+        ["Set topic..." erc-set-topic
+         (and (and (erc-default-target) (not (erc-query-buffer-p)))
+              (or (not (member "t" erc-channel-modes))
+                  (erc-channel-user-op-p (erc-current-nick))))]
+        (list "Channel modes"
+              ["Change mode..." erc-insert-mode-command
+               (erc-channel-user-op-p (erc-current-nick))]
+              ["No external send" (erc-toggle-channel-mode "n")
+               :active (erc-channel-user-op-p (erc-current-nick))
+               :style toggle :selected (member "n" erc-channel-modes)]
+              ["Topic set by channel operator" (erc-toggle-channel-mode "t")
+               :style toggle :selected (member "t" erc-channel-modes)
+               :active (erc-channel-user-op-p (erc-current-nick))]
+              ["Invite only" (erc-toggle-channel-mode "i")
+               :style toggle :selected (member "i" erc-channel-modes)
+               :active (erc-channel-user-op-p (erc-current-nick))]
+              ["Private" (erc-toggle-channel-mode "p")
+               :style toggle :selected (member "p" erc-channel-modes)
+               :active (erc-channel-user-op-p (erc-current-nick))]
+              ["Secret" (erc-toggle-channel-mode "s")
+               :style toggle :selected (member "s" erc-channel-modes)
+               :active (erc-channel-user-op-p (erc-current-nick))]
+              ["Moderated" (erc-toggle-channel-mode "m")
+               :style toggle :selected (member "m" erc-channel-modes)
+               :active (erc-channel-user-op-p (erc-current-nick))]
+              ["Set a limit..." erc-set-channel-limit
+               (erc-channel-user-op-p (erc-current-nick))]
+              ["Set a key..." erc-set-channel-key
+               (erc-channel-user-op-p (erc-current-nick))])
+        ["Leave this channel..." erc-part-from-channel erc-channel-users])
        "-"
        (list "Pals, fools and other keywords"
              ["Add pal..." erc-add-pal]
        ["Show ERC version" erc-version t])
   "ERC menu definition.")
 
-;; `erc-mode-map' must be defined before doing this
-(eval-after-load "erc"
-  '(progn
-     (easy-menu-define erc-menu erc-mode-map "ERC menu" erc-menu-definition)
-     (easy-menu-add erc-menu erc-mode-map)
+(defvar erc-menu-defined nil
+  "Internal variable used to keep track of whether we've defined the
+ERC menu yet.")
 
-     ;; for some reason the menu isn't automatically added to the menu bar
-     (when (featurep 'xemacs)
-       (add-hook 'erc-mode-hook
-                (lambda () (easy-menu-add erc-menu erc-mode-map))))))
+;;;###autoload (autoload 'erc-menu-mode "erc-menu" nil t)
+(define-erc-module menu nil
+  "Enable a menu in ERC buffers."
+  ((unless erc-menu-defined
+     ;; make sure the menu only gets defined once, since Emacs 22
+     ;; activates it immediately
+     (easy-menu-define erc-menu erc-mode-map "ERC menu" erc-menu-definition)
+     (setq erc-menu-defined t))
+   (if (featurep 'xemacs)
+       (progn
+        ;; the menu isn't automatically added to the menu bar in
+        ;; XEmacs
+        (add-hook 'erc-mode-hook 'erc-menu-add)
+        (dolist (buffer (erc-buffer-list))
+          (with-current-buffer buffer (erc-menu-add))))
+     (erc-menu-add)))
+  ((if (featurep 'xemacs)
+       (progn
+        (remove-hook 'erc-mode-hook 'erc-menu-add)
+        (dolist (buffer (erc-buffer-list))
+          (with-current-buffer buffer (erc-menu-remove))))
+     (erc-menu-remove)
+     ;; `easy-menu-remove' is a no-op in Emacs 22
+     (message "You might have to restart Emacs to remove the ERC menu"))))
+
+;; silence byte-compiler warning
+(defvar erc-menu)
+
+(defun erc-menu-add ()
+  "Add the ERC menu to the current buffer."
+  (easy-menu-add erc-menu erc-mode-map))
+
+(defun erc-menu-remove ()
+  "Remove the ERC menu from the current buffer."
+  (easy-menu-remove erc-menu))
 
 (provide 'erc-menu)
 
 ;; tab-width: 8
 ;; End:
 
-;; arch-tag: 671219f2-b082-4753-a185-1d0c7e0c05bd