annotate lisp/menubar.el @ 5697:40fbceabaafd

menubar-items.el (default-menubar): Reorganize. Add PROBLEMS to toplevel. New "More about XEmacs" submenu for NEWS, licensing, etc. New "Recent History" menu for messages, lossage, etc. Get rid of ugly and unexpressive ellipses.
author Stephen J. Turnbull <stephen@xemacs.org>
date Mon, 24 Dec 2012 03:08:33 +0900
parents cc6f0266bc36
children 44b0b4ea5cae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; menubar.el --- Menubar support for XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1991-4, 1997-1998 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1995 Tinker Systems and INS Engineering Corp.
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
5 ;; Copyright (C) 1995, 1996, 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Keywords: internal, extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
12 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
13 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
14 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
15 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
18 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
19 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
20 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4310
diff changeset
23 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;;; Synched up with: Not in FSF. (Completely divergent from FSF menu-bar.el)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;; This file is dumped with XEmacs (when menubar support is compiled in).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
31 ;; Some stuff in FSF menu-bar.el is in menubar-items.el
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 (defgroup menu nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 "Input from the menus."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 :group 'environment)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 (defvar default-menubar nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 ;; this function is considered "part of the lexicon" by many,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 ;; so we'll leave it here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 (defun kill-this-buffer () ; for the menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 "Kill the current buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 (kill-buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (defun set-menubar-dirty-flag ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 "Tell XEmacs that the menubar has to be updated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 NOTE: XEmacs now recognizes when you set a different value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 `current-menubar'. You *only* need to call this function if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 destructively modify a part of the menubar and don't set `current-menubar'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 Note that all the functions that modify a menu call this automatically."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 (setq-default current-menubar (default-value 'current-menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 ;; #### shouldn't this perhaps be `copy-tree'?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 (defun set-menubar (menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 "Set the default menubar to be MENUBAR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 See `current-menubar' for a description of the syntax of a menubar."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 (check-menu-syntax menubar t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 (setq-default current-menubar (copy-sequence menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (defun set-buffer-menubar (menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 "Set the buffer-local menubar to be MENUBAR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 See `current-menubar' for a description of the syntax of a menubar."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (check-menu-syntax menubar t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 (make-local-variable 'current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (setq current-menubar (copy-sequence menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (defun check-menu-syntax (menu &optional menubar-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 ;; The C code does syntax checking on the value of `current-menubar',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 ;; but it's better to do it early, before things have gotten messed up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (if menubar-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 (or (stringp (car menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (list "menu name (first element) must be a string" menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 ;;(or (cdr menu) (signal 'error (list "menu is empty" menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (setq menu (cdr menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 (let (menuitem item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (while (keywordp (setq item (car menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (or (memq item '(:config :included :filter :accelerator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (list "menu keyword must be :config, :included, :accelerator or :filter"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 (if (or (not (cdr menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 (vectorp (nth 1 menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 (keywordp (nth 1 menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (signal 'error (list "strange keyword value" item (nth 1 menu))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 (setq menu (nthcdr 2 menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 (while menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (setq menuitem (car menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 ((stringp menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (and (string-match "^\\(-+\\|=+\\):\\(.*\\)" menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (setq item (match-string 2 menuitem))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
97 (or (member item '(;; Motif-compatible
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 "singleLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 "doubleLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 "singleDashedLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 "doubleDashedLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 "noLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 "shadowEtchedIn"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 "shadowEtchedOut"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 "shadowEtchedInDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 "shadowEtchedOutDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 ;; non-Motif (Lucid menubar widget only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 "shadowDoubleEtchedIn"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 "shadowDoubleEtchedOut"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 "shadowDoubleEtchedInDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 "shadowDoubleEtchedOutDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 (signal 'error (list "bogus separator style in menu item" item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 ((null menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 (or menubar-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 (signal 'error (list "nil is only permitted in the top level of menubars"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 ((consp menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (check-menu-syntax menuitem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 ((vectorp menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 (let ((L (length menuitem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 plistp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (and (< L 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (list "button descriptors must be at least 2 long"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 menuitem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (setq plistp (or (>= L 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (and (> L 2) (keywordp (aref menuitem 2)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (if plistp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (let ((i 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 selp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 (while (< i L)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (setq item (aref menuitem i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (cond ((not (memq item '(:active :suffix :keys :style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 :full :included :selected
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 :accelerator)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 (list (if (keywordp item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 "unknown menu item keyword"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 "not a keyword")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 item menuitem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 ((eq item :style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 (setq style (aref menuitem (1+ i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 (or (memq style '(nil toggle radio button text))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (signal 'error (list "unknown style" style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 menuitem))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 ((eq item :selected) (setq selp t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (setq i (+ i (if (eq item :full) 1 2))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (if (and selp (not (memq style '(toggle button radio))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 ":selected only makes sense with :style toggle, radio, or button"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 menuitem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 ;; (t (signal 'error (list "unrecognized menu descriptor" menuitem))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 (t (message "unrecognized menu descriptor %s" (prin1-to-string menuitem))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (setq menu (cdr menu)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
164 ;;; basic menu manipulation functions
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
166 (defun menu-item-text (item &optional normalize)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
167 "Return the text that is displayed for a menu item.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
168 If ITEM is a string (unselectable text), it is returned; otherwise,
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
169 the first element of the cons or vector is returned.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
170 If NORMALIZE is non-nil, pass the text through `normalize-menu-text'
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
171 before being returned, to remove accelerator specs and convert %% to %."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
172 (let ((val (if (stringp item) item (elt item 0))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
173 (if normalize (normalize-menu-text val) val)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
174
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
175 (defun find-menu-item (menubar item-path-list)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
176 "Search MENUBAR for item given by ITEM-PATH-LIST.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 Returns (ITEM . PARENT), where PARENT is the immediate parent of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 the item found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 If the item does not exist, the car of the returned value is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 If some menu in the ITEM-PATH-LIST does not exist, an error is signalled."
5645
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
181 (labels
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
182 ((find-menu-item-1 (menubar item-path-list &optional parent)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
183 (check-argument-type 'listp item-path-list)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
184 (if (not (consp menubar))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
185 nil
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
186 (let ((rest menubar)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
187 result)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
188 (when (stringp (car rest))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
189 (setq rest (cdr rest)))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
190 (while (keywordp (car rest))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
191 (setq rest (cddr rest)))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
192 (while rest
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
193 (if (and (car rest)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
194 (stringp (car item-path-list))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
195 (= 0 (compare-menu-text (car item-path-list)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
196 (menu-item-text (car rest)))))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
197 (setq result (car rest)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
198 rest nil)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
199 (setq rest (cdr rest))))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
200 (if (cdr item-path-list)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
201 (cond ((consp result)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
202 (find-menu-item-1 (cdr result) (cdr item-path-list)
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
203 result))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
204 (result
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
205 (signal 'error (list (gettext "not a submenu") result)))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
206 (t
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
207 (signal 'error (list (gettext "no such submenu")
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
208 (car item-path-list)))))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
209 (cons result parent))))))
5d3bb1100832 Remove some utility functions from the global namespace, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5490
diff changeset
210 (find-menu-item-1 menubar item-path-list)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
4310
a6d7e031a10b Fix two Tailor glitches.
Mike Sperber <sperber@deinprogramm.de>
parents: 4164
diff changeset
212 (defun add-menu-item-1 (leaf-p menu-path new-item before in-menu)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ;; This code looks like it could be cleaned up some more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 ;; Do we really need 6 calls to find-menu-item?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (let* ((item-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (cond ((vectorp new-item) (aref new-item 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 ((consp new-item) (car new-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (menubar (or in-menu current-menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (menu (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 (car (find-menu-item menubar menu-path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 (item-found (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 ((null item-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 ((not (listp menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (signal 'error (list (gettext "not a submenu")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 menu-path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 (menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (find-menu-item (cdr menu) (list item-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (find-menu-item menubar (list item-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (unless menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (error "`current-menubar' is nil: can't add menus to it."))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (unless menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 (let ((rest menu-path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (so-far menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (while rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 ;;; (setq menu (car (find-menu-item (cdr so-far) (list (car rest)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 (setq menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 (if (eq so-far menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 (car (find-menu-item so-far (list (car rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 (car (find-menu-item (cdr so-far) (list (car rest))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (unless menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (let ((rest2 so-far))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (while (and (cdr rest2) (car (cdr rest2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (setq rest2 (cdr rest2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 (setcdr rest2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 (nconc (list (setq menu (list (car rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 (cdr rest2)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 (setq so-far menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (setq rest (cdr rest)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (if (and item-found (car item-found))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 ;; hack the item in place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (if menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 ;; Isn't it very bad form to use nsubstitute for side effects?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (nsubstitute new-item (car item-found) menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 (setq current-menubar (nsubstitute new-item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (car item-found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 current-menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 ;; OK, we have to add the whole thing...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 ;; if BEFORE is specified, try to add it there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (unless menu (setq menu current-menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (when before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (setq before (car (find-menu-item menu (list before)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (let ((rest menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (added-before nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (while rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 (if (eq before (car (cdr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 (setcdr rest (cons new-item (cdr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 (setq rest nil added-before t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 (setq rest (cdr rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (when (not added-before)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 ;; adding before the first item on the menubar itself is harder
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 (if (and (eq menu menubar) (eq before (car menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 (setq menu (cons new-item menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 current-menubar menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 ;; otherwise, add the item to the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 (nconc menu (list new-item))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 new-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284
4310
a6d7e031a10b Fix two Tailor glitches.
Mike Sperber <sperber@deinprogramm.de>
parents: 4164
diff changeset
285 (defun add-menu-button (menu-path menu-leaf &optional before in-menu)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 "Add a menu item to some menu, creating the menu first if necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 If the named item exists already, it is changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 MENU-PATH identifies the menu under which the new menu item should be inserted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 It is a list of strings; for example, (\"File\") names the top-level \"File\"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
4310
a6d7e031a10b Fix two Tailor glitches.
Mike Sperber <sperber@deinprogramm.de>
parents: 4164
diff changeset
291 MENU-LEAF is a menubar leaf node. See the documentation of `current-menubar'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 BEFORE, if provided, is the name of a menu item before which this item should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 be added, if this item is not on the menu already. If the item is already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 present, it will not be moved.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
295 IN-MENU, if provided, means use that instead of `current-menubar' as the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
296 menu to change."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 ;; Note easymenu.el uses the fact that menu-leaf can be a submenu.
4310
a6d7e031a10b Fix two Tailor glitches.
Mike Sperber <sperber@deinprogramm.de>
parents: 4164
diff changeset
298 (add-menu-item-1 t menu-path menu-leaf before in-menu))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 ;; I actually liked the old name better, but the interface has changed too
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
301 ;; drastically to keep it. --Stig
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (defun add-submenu (menu-path submenu &optional before in-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 "Add a menu to the menubar or one of its submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 If the named menu exists already, it is changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 MENU-PATH identifies the menu under which the new menu should be inserted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 It is a list of strings; for example, (\"File\") names the top-level \"File\"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 If MENU-PATH is nil, then the menu will be added to the menubar itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 SUBMENU is the new menu to add.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 See the documentation of `current-menubar' for the syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 BEFORE, if provided, is the name of a menu before which this menu should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 be added, if this menu is not on its parent already. If the menu is already
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
313 present, it will not be moved.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
314 IN-MENU, if provided, means use that instead of `current-menubar' as the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
315 menu to change."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (check-menu-syntax submenu nil)
4310
a6d7e031a10b Fix two Tailor glitches.
Mike Sperber <sperber@deinprogramm.de>
parents: 4164
diff changeset
317 (add-menu-item-1 nil menu-path submenu before in-menu))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
318 ;; purespace is no more, so this function is unnecessary
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
319 ;(defun purecopy-menubar (x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
320 ; ;; this calls purecopy on the strings, and the contents of the vectors,
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
321 ; ;; but not on the vectors themselves, or the conses - those must be
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
322 ; ;; writable.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
323 ; (cond ((vectorp x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
324 ; (let ((i (length x)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
325 ; (while (> i 0)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
326 ; (aset x (1- i) (purecopy (aref x (1- i))))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
327 ; (setq i (1- i))))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
328 ; x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
329 ; ((consp x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
330 ; (let ((rest x))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
331 ; (while rest
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
332 ; (setcar rest (purecopy-menubar (car rest)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
333 ; (setq rest (cdr rest))))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
334 ; x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
335 ; (t
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
336 ; (purecopy x))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 (defun delete-menu-item (path &optional from-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 "Remove the named menu item from the menu hierarchy.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
340 PATH is a list of strings which identify the position of the menu item
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
341 in the menu hierarchy. The documentation of `add-submenu' describes
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
342 menu paths.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
343 FROM-MENU, if provided, means use that instead of `current-menubar'
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
344 as the menu to change."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (let* ((pair (condition-case nil (find-menu-item (or from-menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 current-menubar) path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 (item (car pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (parent (or (cdr pair) current-menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (if (not item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 ;; the menubar is the only special case, because other menus begin
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 ;; with their name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (if (eq parent current-menubar)
5652
cc6f0266bc36 Avoid #'delq in core Lisp, for the sake of style, a very slightly smaller binary
Aidan Kehoe <kehoea@parhasard.net>
parents: 5645
diff changeset
355 (setq current-menubar (delete* item parent))
cc6f0266bc36 Avoid #'delq in core Lisp, for the sake of style, a very slightly smaller binary
Aidan Kehoe <kehoea@parhasard.net>
parents: 5645
diff changeset
356 (delete* item parent))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (defun relabel-menu-item (path new-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 "Change the string of the specified menu item.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
362 PATH is a list of strings which identify the position of the menu item in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\"
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
364 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 NEW-NAME is the string that the menu item will be printed as from now on."
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
367 (check-type new-name string)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (let* ((menubar current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 (pair (find-menu-item menubar path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (item (car pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 (menu (cdr pair)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 (or item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 (signal 'error (list (if menu (gettext "No such menu item")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (gettext "No such menu"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 (if (and (consp item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 (stringp (car item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 (setcar item new-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 (aset item 0 new-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 ;; these are all bad style. Why in the world would we put evaluable forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 ;; into the menubar if we didn't want people to use 'em?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 ;; x-font-menu.el is the only known offender right now and that ought to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 ;; rehashed a bit.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
389 ;;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (defun enable-menu-item-1 (path toggle-p on-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 (let (menu item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (if (and (vectorp path) (> (length path) 2)) ; limited syntax checking...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (setq item path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 (let* ((menubar current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (pair (find-menu-item menubar path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (setq item (car pair)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 menu (cdr pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (or item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (signal 'error (list (if menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 "No such menu item"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 "No such menu")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 (if (consp item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (error "%S is a menu, not a menu item" path))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 (if (or (> (length item) 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (and (symbolp (aref item 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 (= ?: (aref (symbol-name (aref item 2)) 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 ;; plist-like syntax
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (let ((i 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (keyword (if toggle-p :selected :active))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (ok nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (while (< i (length item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (cond ((eq (aref item i) keyword)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (aset item (1+ i) on-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (setq ok t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (setq i (+ i 2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 (cond (ok nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (toggle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (signal 'error (list "not a toggle menu item" item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 ;; Need to copy the item to extend it, sigh...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 (let ((cons (memq item menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 (new-item (vconcat item (list keyword on-p))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (if cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 (setcar cons (setq item new-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 (if menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (error "couldn't find %S on its parent?" item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (error "no %S slot to set: %S" keyword item)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 ;; positional syntax
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (if toggle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (signal 'error (list "not a toggle menu item" item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (aset item 2 on-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 (defun enable-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 "Make the named menu item be selectable.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
439 PATH is a list of strings which identify the position of the menu item in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\"
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
441 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (enable-menu-item-1 path nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 (defun disable-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 "Make the named menu item be unselectable.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
447 PATH is a list of strings which identify the position of the menu item in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\"
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
449 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (enable-menu-item-1 path nil nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (defun select-toggle-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 "Make the named toggle- or radio-style menu item be in the `selected' state.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
455 PATH is a list of strings which identify the position of the menu item in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\"
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
457 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 (enable-menu-item-1 path t t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (defun deselect-toggle-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 "Make the named toggle- or radio-style menu item be in the `unselected' state.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
463 PATH is a list of strings which identify the position of the menu item in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 the menu hierarchy. (\"File\" \"Save\") means the menu item called \"Save\"
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
465 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (enable-menu-item-1 path t nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
470 ;;; functions for manipulating whole menus -- adding accelerators, sorting,
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
471 ;;; splitting long menus, etc.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
472
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
473 (defun submenu-generate-accelerator-spec (list &optional omit-chars-list)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
474 "Add auto-generated accelerator specifications to a submenu.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
475 This can be used to add accelerators to the return value of a menu filter
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
476 function. It correctly ignores unselectable items. It will destructively
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
477 modify the list passed to it. If an item already has an auto-generated
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
478 accelerator spec, this will be removed before the new one is added, making
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
479 this function idempotent.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
480
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
481 If OMIT-CHARS-LIST is given, it should be a list of lowercase characters,
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
482 which will not be used as accelerators."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
483 (let ((n 0))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
484 (dolist (item list list)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
485 (cond
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
486 ((or (vectorp item) (consp item))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
487 (incf n)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
488 (setf (elt item 0)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
489 (concat
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
490 (menu-item-generate-accelerator-spec n omit-chars-list)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
491 (menu-item-strip-accelerator-spec (elt item 0)))))))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
492
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
493 (defun menu-item-strip-accelerator-spec (item)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
494 "Strip an auto-generated accelerator spec off of ITEM.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
495 ITEM should be a string. This removes specs added by
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
496 `menu-item-generate-accelerator-spec' and `submenu-generate-accelerator-spec'."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
497 (if (string-match "%_. " item)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
498 (substring item 4)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
499 item))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
500
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
501 (defun menu-item-generate-accelerator-spec (n &optional omit-chars-list)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
502 "Return an accelerator specification for use with auto-generated menus.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
503 This should be concat'd onto the beginning of each menu line. The spec
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
504 allows the Nth line to be selected by the number N. '0' is used for the
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
505 10th line, and 'a' through 'z' are used for the following 26 lines.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
506
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
507 If OMIT-CHARS-LIST is given, it should be a list of lowercase characters,
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
508 which will not be used as accelerators."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
509 (cond ((< n 10) (concat "%_" (int-to-string n) " "))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
510 ((= n 10) "%_0 ")
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
511 ((<= n 36)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
512 (setq n (- n 10))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
513 (let ((m 0))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
514 (while (> n 0)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
515 (setq m (1+ m))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
516 (while (memq (int-to-char (+ m (- (char-to-int ?a) 1)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
517 omit-chars-list)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
518 (setq m (1+ m)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
519 (setq n (1- n)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
520 (if (<= m 26)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
521 (concat
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
522 "%_"
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
523 (char-to-string (int-to-char (+ m (- (char-to-int ?a) 1))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
524 " ")
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
525 "")))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
526 (t "")))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
527
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
528 (defcustom menu-max-items 25
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
529 "*Maximum number of items in generated menus.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
530 If number of entries in such a menu is larger than this value, split menu
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
531 into submenus of nearly equal length (see `menu-submenu-max-items'). If
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
532 nil, never split menu into submenus."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
533 :group 'menu
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
534 :type '(choice (const :tag "no submenus" nil)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
535 (integer)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
536
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
537 (defcustom menu-submenu-max-items 20
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
538 "*Maximum number of items in submenus when splitting menus.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
539 We split large menus into submenus of this many items, and then balance
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
540 them out as much as possible (otherwise the last submenu may have very few
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
541 items)."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
542 :group 'menu
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
543 :type 'integer)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
544
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
545 (defcustom menu-submenu-name-format "%-12.12s ... %.12s"
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
546 "*Format specification of the submenu name when splitting menus.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
547 Used by `menu-split-long-menu' if the number of entries in a menu is
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
548 larger than `menu-menu-max-items'.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
549 This string should contain one %s for the name of the first entry and
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
550 one %s for the name of the last entry in the submenu.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
551 If the value is a function, it should return the submenu name. The
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
552 function is be called with two arguments, the names of the first and
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
553 the last entry in the menu."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
554 :group 'menu
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
555 :type '(choice (string :tag "Format string")
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
556 (function)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
557
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
558 (defun menu-split-long-menu-and-sort (menu)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
559 "Sort MENU, split according to `menu-max-items' and add accelerator specs.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
560 This is useful for menus generated by filter functions, to make them look
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
561 nice. This is equivalent to
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
562
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
563 \(menu-split-long-menu (menu-sort-menu menu))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
564
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
565 and you can call those functions individually if necessary.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
566 You can also call `submenu-generate-accelerator-spec' yourself to add
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
567 accelerator specs -- this works even if the specs have already been added."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
568 (menu-split-long-menu (menu-sort-menu menu)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
569
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
570 (defun menu-split-long-menu (menu)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
571 "Split MENU according to `menu-max-items' and add accelerator specs.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
572 If MENU already has accelerator specs, they will be removed and new ones
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
573 generated. You should normally use `menu-split-long-menu-and-sort' instead.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
574 The menu should already be sorted to get meaningful results when it is
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
575 split, since the outer menus are of the format `FROM ... TO'."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
576 (let ((len (length menu)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
577 (if (or (null menu-max-items)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
578 (<= len menu-max-items))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
579 (submenu-generate-accelerator-spec menu)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
580 (let* ((outer (/ (+ len (1- menu-submenu-max-items))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
581 menu-submenu-max-items))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
582 (inner (/ (+ len (1- outer)) outer))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
583 (result nil))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
584 (while menu
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
585 (let ((sub nil)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
586 (from (car menu)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
587 (dotimes (foo (min inner len))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
588 (setq sub (cons (car menu) sub)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
589 menu (cdr menu)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
590 (setq len (- len inner))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
591 (let* ((to (car sub))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
592 (ftext (menu-item-strip-accelerator-spec
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
593 (menu-item-text from)))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
594 (ttext (menu-item-strip-accelerator-spec
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
595 (menu-item-text to))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
596 (setq sub (nreverse sub))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
597 (setq result
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
598 (cons (cons (if (stringp menu-submenu-name-format)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
599 (format menu-submenu-name-format
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
600 ftext ttext)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
601 (funcall menu-submenu-name-format
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
602 ftext ttext))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
603 (submenu-generate-accelerator-spec sub))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
604 result)))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
605 (submenu-generate-accelerator-spec (nreverse result))))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
606
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
607 (defun menu-sort-menu (menu)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
608 "Sort MENU alphabetically.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
609 You should normally use `menu-split-long-menu-and-sort' instead."
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
610 (sort menu
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
611 #'(lambda (a b) (< (compare-menu-text
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
612 (menu-item-text a) (menu-item-text b))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
613 0))))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 707
diff changeset
614
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
615
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
616 ;;;;;;; popup menus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
617
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
618 (defvar global-popup-menu nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
619 "The global popup menu. This is present in all modes.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
620 See the function `popup-menu' for a description of menu syntax.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
621
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
622 (defvar mode-popup-menu nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
623 "The mode-specific popup menu. Automatically buffer local.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
624 This is appended to the default items in `global-popup-menu'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
625 See the function `popup-menu' for a description of menu syntax.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
626 (make-variable-buffer-local 'mode-popup-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
627
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
628 (defvar activate-popup-menu-hook nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
629 "Function or functions run before a mode-specific popup menu is made visible.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
630 These functions are called with no arguments, and should interrogate and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
631 modify the value of `global-popup-menu' or `mode-popup-menu' as desired.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
632 Note: this hook is only run if you use `popup-mode-menu' for activating the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
633 global and mode-specific commands; if you have your own binding for button3,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
634 this hook won't be run.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
635
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
636 (defvar last-popup-menu-event nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
637 "The mouse event that invoked the last popup menu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
638 NOTE: This is EXPERIMENTAL and may change at any time.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
639
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
640 (defun popup-mode-menu (&optional event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
641 "Pop up a menu of global and mode-specific commands.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
642 The menu is computed by combining `global-popup-menu' and `mode-popup-menu'
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
643 with any items derived from the `context-menu' property of the extent where the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
644 button was clicked."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
645 (interactive "_e")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
646 (setq last-popup-menu-event
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
647 (or (and event (button-event-p event) event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
648 (let* ((mouse-pos (mouse-position))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
649 (win (car mouse-pos))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
650 (x (cadr mouse-pos))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
651 (y (cddr mouse-pos))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
652 (edges (window-pixel-edges win))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
653 (winx (first edges))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
654 (winy (second edges))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
655 (x (+ x winx))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
656 (y (+ y winy)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
657 (make-event 'button-press
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
658 `(button 3 x ,x y ,y channel ,(window-frame win)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
659 timestamp ,(current-event-timestamp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
660 (cdfw-console win)))))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
661 (run-hooks 'activate-popup-menu-hook)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
662 (let* ((context-window (and event (event-window event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
663 (context-point (and event (event-point event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
664 (context-extents (and context-window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
665 context-point
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
666 (extents-at context-point
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
667 (window-buffer context-window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
668 'context-menu)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
669 (context-menu-items
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
670 (apply 'append (mapcar #'(lambda (extent)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
671 (extent-property extent 'context-menu))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
672 context-extents))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
673 (popup-menu
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
674 (progn
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
675 ;; Merge global-popup-menu and mode-popup-menu
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
676 (and mode-popup-menu (check-menu-syntax mode-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
677 (let* ((mode-title (and (stringp (car mode-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
678 (car mode-popup-menu)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
679 (mode-items (if mode-title (cdr mode-popup-menu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
680 mode-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
681 (global-title (and (stringp (car global-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
682 (car global-popup-menu)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
683 (global-items (if global-title (cdr global-popup-menu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
684 global-popup-menu))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
685 mode-filters)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
686 ;; Strip keywords from local menu for attaching them at the top
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
687 (while (and mode-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
688 (keywordp (car mode-items)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
689 ;; Push both keyword and its argument.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
690 (push (pop mode-items) mode-filters)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
691 (push (pop mode-items) mode-filters))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
692 (setq mode-filters (nreverse mode-filters))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
693 ;; If mode-filters contains a keyword already present in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
694 ;; `global-popup-menu', you will probably lose.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
695 (append (and popup-menu-titles
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
696 (cond (mode-title (list mode-title))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
697 (global-title (list global-title))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
698 (t "")))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
699 mode-filters
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
700 context-menu-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
701 (and context-menu-items mode-items '("---"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
702 mode-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
703 (and (or context-menu-items mode-items)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
704 global-items '("---" "---"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
705 (and global-title (list global-title))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
706 global-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
707 ))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
708
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
709 (while (popup-up-p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
710 (dispatch-event (next-event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
711
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
712 ))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
713
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
714 (defun popup-buffer-menu (event)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
715 "Pop up a copy of the menubar Buffers menu where the mouse is clicked."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
716 (interactive "e")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
717 (let ((window (and (event-over-text-area-p event) (event-window event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
718 (bmenu nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
719 (or window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
720 (error "Pointer must be in a normal window"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
721 (select-window window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
722 (if current-menubar
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
723 (setq bmenu (assoc "%_Buffers" current-menubar)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
724 (if (null bmenu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
725 (setq bmenu (assoc "%_Buffers" default-menubar)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
726 (if (null bmenu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
727 (error "Can't find the Buffers menu"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
728 (popup-menu bmenu)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
729
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
730 (defun popup-menubar-menu (event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
731 "Pop up a copy of menu that also appears in the menubar."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
732 (interactive "e")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
733 (let ((window (and (event-over-text-area-p event) (event-window event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
734 popup-menubar)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
735 (or window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
736 (error "Pointer must be in a normal window"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
737 (select-window window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
738 (and current-menubar (run-hooks 'activate-menubar-hook))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
739 ;; #### Instead of having to copy this just to safely get rid of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
740 ;; any nil what we should really do is fix up the internal menubar
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
741 ;; code to just ignore nil if generating a popup menu
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
742 (setq popup-menubar (delete nil (copy-sequence (or current-menubar
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
743 default-menubar))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
744 (popup-menu (cons "%_Menubar Menu" popup-menubar))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
745 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
746
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
747 (defun menu-call-at-event (form &optional event default-behavior-fallback)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
748 "Call FORM while temporarily setting point to the position in EVENT.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
749 NOTE: This is EXPERIMENTAL and may change at any time.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
750
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
751 FORM is called the way forms in menu specs are: i.e. if a symbol, it's called
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
752 with `call-interactively', otherwise with `eval'. EVENT defaults to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
753 `last-popup-menu-event', making this function especially useful in popup
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
754 menus. The buffer and point are set temporarily within a `save-excursion'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
755 If EVENT is not a mouse event, or was not over a buffer, nothing
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
756 happens unless DEFAULT-BEHAVIOR-FALLBACK is non-nil, in which case the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
757 FORM is called normally."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
758 (or event (setq event last-popup-menu-event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
759 (let ((buf (event-buffer event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
760 (p (event-closest-point event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
761 (cond ((and buf p (> p 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
762 (save-excursion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
763 (set-buffer buf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
764 (goto-char p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
765 (if (symbolp form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
766 (call-interactively form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
767 (eval form))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
768 (default-behavior-fallback
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
769 (if (symbolp form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
770 (call-interactively form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
771 (eval form))))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
772
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
773 (global-set-key 'button3 'popup-mode-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
774 ;; shift button3 and shift button2 are reserved for Hyperbole
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
775 (global-set-key '(meta control button3) 'popup-buffer-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
776 ;; The following command is way too dangerous with Custom.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
777 ;; (global-set-key '(meta shift button3) 'popup-menubar-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
778
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
779 ;; Here's a test of the cool new menu features (from Stig).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
780
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
781 ;;(setq mode-popup-menu
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
782 ;; '("Test Popup Menu"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
783 ;; :filter cdr
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
784 ;; ["this item won't appear because of the menu filter" ding t]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
785 ;; "--:singleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
786 ;; "singleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
787 ;; "--:doubleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
788 ;; "doubleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
789 ;; "--:singleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
790 ;; "singleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
791 ;; "--:doubleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
792 ;; "doubleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
793 ;; "--:noLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
794 ;; "noLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
795 ;; "--:shadowEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
796 ;; "shadowEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
797 ;; "--:shadowEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
798 ;; "shadowEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
799 ;; "--:shadowDoubleEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
800 ;; "shadowDoubleEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
801 ;; "--:shadowDoubleEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
802 ;; "shadowDoubleEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
803 ;; "--:shadowEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
804 ;; "shadowEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
805 ;; "--:shadowEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
806 ;; "shadowEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
807 ;; "--:shadowDoubleEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
808 ;; "shadowDoubleEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
809 ;; "--:shadowDoubleEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
810 ;; "shadowDoubleEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
811 ;; ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
812
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 (defun get-popup-menu-response (menu-desc &optional event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 "Pop up the given menu and wait for a response.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 This blocks until the response is received, and returns the misc-user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 event that encapsulates the response. To execute it, you can do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 (funcall (event-function response) (event-object response))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 If no response was received, nil is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 MENU-DESC and EVENT are as in the call to `popup-menu'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 ;; partially stolen from w3
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
822
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
823 ;; This function is way gross and assumes to much about menu
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
824 ;; processing that is X specific. Under mswindows popup menus behave
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
825 ;; in reasonable ways that you can't obstruct.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (let ((echo-keystrokes 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 new-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 (popup-menu menu-desc event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (catch 'popup-done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 (while t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 (setq new-event (next-command-event new-event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 (cond ((misc-user-event-p new-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 (throw 'popup-done new-event))
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
834 ((button-release-event-p new-event);; don't beep twice
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
835 nil)
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
836 ;; It shows how bogus this function is that the event
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
837 ;; arg could be missing and no-one noticed ...
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
838 ((event-matches-key-specifier-p new-event (quit-char))
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
839 (signal 'quit nil))
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
840 ;; mswindows has no pop-down processing (selection is
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
841 ;; atomic) so doing anything more makes no sense. Since
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
842 ;; popup-up-p is always false under mswindows, this
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
843 ;; function has been ordered to do essentially X-specifc
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
844 ;; processing after this check.
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
845 ((not (popup-up-p))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 (setq unread-command-events (cons new-event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 unread-command-events))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 (throw 'popup-done nil))
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
849 ;; mswindows never gets here
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 (beep)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 (message "please make a choice from the menu.")))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (defun popup-menu-and-execute-in-window (menu-desc event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 "Pop up the given menu and execute its response in EVENT's window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 This blocks until the response is received, temporarily selects
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 EVENT's window, and executes the command specified in the response.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 EVENT can also be a window. See `popup-menu' for the semantics of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 MENU-DESC."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 (let ((response
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 (get-popup-menu-response menu-desc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (and (eventp event) event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 (and (misc-user-event-p response)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 (select-window (if (windowp event) event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (funcall (event-function response)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 (event-object response))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 ;; provide default bindings for menu accelerator map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 (and (boundp 'menu-accelerator-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 (keymapp menu-accelerator-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 (define-key menu-accelerator-map "\e" 'menu-escape)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 (define-key menu-accelerator-map [left] 'menu-left)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (define-key menu-accelerator-map [right] 'menu-right)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 (define-key menu-accelerator-map [up] 'menu-up)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 (define-key menu-accelerator-map [down] 'menu-down)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 (define-key menu-accelerator-map [return] 'menu-select)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
880 (define-key menu-accelerator-map [kp-down] 'menu-down)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
881 (define-key menu-accelerator-map [kp-up] 'menu-down)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
882 (define-key menu-accelerator-map [kp-left] 'menu-left)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
883 (define-key menu-accelerator-map [kp-right] 'menu-right)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
884 (define-key menu-accelerator-map [kp-enter] 'menu-select)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 (define-key menu-accelerator-map "\C-g" 'menu-quit)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 (provide 'menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 ;;; menubar.el ends here