diff options
Diffstat (limited to 'lisp/erc/erc-menu.el')
-rw-r--r-- | lisp/erc/erc-menu.el | 120 |
1 files changed, 76 insertions, 44 deletions
diff --git a/lisp/erc/erc-menu.el b/lisp/erc/erc-menu.el index a2dc7a1b2f2..a5826625bde 100644 --- a/lisp/erc/erc-menu.el +++ b/lisp/erc/erc-menu.el @@ -1,6 +1,6 @@ ;; erc-menu.el -- Menu-bar definitions for ERC -;; Copyright (C) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. +;; Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: Mario Lang <mlang@delysid.org> ;; Keywords: comm, processes, menu @@ -28,7 +28,7 @@ ;;; Code: -;(require 'erc) +(require 'erc) (require 'easymenu) (defvar erc-menu-definition @@ -40,41 +40,43 @@ (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] ["Delete pal..." erc-delete-pal] @@ -98,16 +100,46 @@ ["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 +(eval-when-compile + (defvar erc-menu nil)) + +(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) |