annotate lisp/menubar.el @ 938:0391335b65dc

[xemacs-hg @ 2002-07-31 07:14:49 by michaels] 2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de> Markus Kaltenbach <makalten@informatik.uni-tuebingen.de> Mike Sperber <mike@xemacs.org> configure flag to turn these changes on: --use-kkcc First we added a dumpable flag to lrecord_implementation. It shows, if the object is dumpable and should be processed by the dumper. * lrecord.h (struct lrecord_implementation): added dumpable flag (MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions to the new lrecord_implementation and their calls. Then we changed mark_object, that it no longer needs a mark method for those types that have pdump descritions. * alloc.c: (mark_object): If the object has a description, the new mark algorithm is called, and the object is marked according to its description. Otherwise it uses the mark method like before. These procedures mark objects according to their descriptions. They are modeled on the corresponding pdumper procedures. (mark_with_description): (get_indirect_count): (structure_size): (mark_struct_contents): These procedures still call mark_object, this is needed while there are Lisp_Objects without descriptions left. We added pdump descriptions for many Lisp_Objects: * extents.c: extent_auxiliary_description * database.c: database_description * gui.c: gui_item_description * scrollbar.c: scrollbar_instance_description * toolbar.c: toolbar_button_description * event-stream.c: command_builder_description * mule-charset.c: charset_description * device-msw.c: devmode_description * dialog-msw.c: mswindows_dialog_id_description * eldap.c: ldap_description * postgresql.c: pgconn_description pgresult_description * tooltalk.c: tooltalk_message_description tooltalk_pattern_description * ui-gtk.c: emacs_ffi_description emacs_gtk_object_description * events.c: * events.h: * event-stream.c: * event-Xt.c: * event-gtk.c: * event-tty.c: To write a pdump description for Lisp_Event, we converted every struct in the union event to a Lisp_Object. So we created nine new Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data, Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data, Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data. We also wrote makro selectors and mutators for the fields of the new designed Lisp_Event and added everywhere these new abstractions. We implemented XD_UNION support in (mark_with_description), so we can describe exspecially console/device specific data with XD_UNION. To describe with XD_UNION, we added a field to these objects, which holds the variant type of the object. This field is initialized in the appendant constructor. The variant is an integer, it has also to be described in an description, if XD_UNION is used. XD_UNION is used in following descriptions: * console.c: console_description (get_console_variant): returns the variant (create_console): added variant initialization * console.h (console_variant): the different console types * console-impl.h (struct console): added enum console_variant contype * device.c: device_description (Fmake_device): added variant initialization * device-impl.h (struct device): added enum console_variant devtype * objects.c: image_instance_description font_instance_description (Fmake_color_instance): added variant initialization (Fmake_font_instance): added variant initialization * objects-impl.h (struct Lisp_Color_Instance): added color_instance_type * objects-impl.h (struct Lisp_Font_Instance): added font_instance_type * process.c: process_description (make_process_internal): added variant initialization * process.h (process_variant): the different process types
author michaels
date Wed, 31 Jul 2002 07:14:49 +0000
parents a307f9a2021d
children 9caf26dd924f
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.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Copyright (C) 1995, 1996 Ben Wing.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; General Public License for more details.
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
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; Free Software Foundation, 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
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 ;;; 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
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;; This file is dumped with XEmacs (when menubar support is compiled in).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
33 ;; 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
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 (defgroup menu nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 "Input from the menus."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 :group 'environment)
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 (defvar default-menubar nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 ;; this function is considered "part of the lexicon" by many,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 ;; so we'll leave it here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (defun kill-this-buffer () ; for the menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 "Kill the current buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (kill-buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 (defun set-menubar-dirty-flag ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 "Tell XEmacs that the menubar has to be updated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 NOTE: XEmacs now recognizes when you set a different value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 `current-menubar'. You *only* need to call this function if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 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
55 Note that all the functions that modify a menu call this automatically."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (setq-default current-menubar (default-value 'current-menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 ;; #### shouldn't this perhaps be `copy-tree'?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 (defun set-menubar (menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 "Set the default menubar to be MENUBAR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 See `current-menubar' for a description of the syntax of a menubar."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 (check-menu-syntax menubar t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (setq-default current-menubar (copy-sequence menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 (defun set-buffer-menubar (menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 "Set the buffer-local menubar to be MENUBAR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 See `current-menubar' for a description of the syntax of a menubar."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (check-menu-syntax menubar t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 (make-local-variable 'current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (setq current-menubar (copy-sequence menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (defun check-menu-syntax (menu &optional menubar-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 ;; The C code does syntax checking on the value of `current-menubar',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 ;; 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
75 (if menubar-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (or (stringp (car menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (list "menu name (first element) must be a string" menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 ;;(or (cdr menu) (signal 'error (list "menu is empty" menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (setq menu (cdr menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (let (menuitem item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (while (keywordp (setq item (car menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (or (memq item '(:config :included :filter :accelerator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 (list "menu keyword must be :config, :included, :accelerator or :filter"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 (if (or (not (cdr menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (vectorp (nth 1 menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 (keywordp (nth 1 menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 (signal 'error (list "strange keyword value" item (nth 1 menu))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (setq menu (nthcdr 2 menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (while menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 (setq menuitem (car menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 ((stringp menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (and (string-match "^\\(-+\\|=+\\):\\(.*\\)" menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (setq item (match-string 2 menuitem))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
99 (or (member item '(;; Motif-compatible
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 "singleLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 "doubleLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 "singleDashedLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 "doubleDashedLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 "noLine"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 "shadowEtchedIn"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 "shadowEtchedOut"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 "shadowEtchedInDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 "shadowEtchedOutDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 ;; non-Motif (Lucid menubar widget only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 "shadowDoubleEtchedIn"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 "shadowDoubleEtchedOut"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 "shadowDoubleEtchedInDash"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 "shadowDoubleEtchedOutDash"
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 (signal 'error (list "bogus separator style in menu item" item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 ((null menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (or menubar-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (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
120 ((consp menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 (check-menu-syntax menuitem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 ((vectorp menuitem)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (let ((L (length menuitem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 plistp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (and (< L 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (list "button descriptors must be at least 2 long"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 menuitem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (setq plistp (or (>= L 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (and (> L 2) (keywordp (aref menuitem 2)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (if plistp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (let ((i 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 selp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (while (< i L)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (setq item (aref menuitem i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (cond ((not (memq item '(:active :suffix :keys :style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 :full :included :selected
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 :accelerator)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (list (if (keywordp item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 "unknown menu item keyword"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 "not a keyword")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 item menuitem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 ((eq item :style)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (setq style (aref menuitem (1+ i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (or (memq style '(nil toggle radio button text))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (signal 'error (list "unknown style" style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 menuitem))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 ((eq item :selected) (setq selp t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (setq i (+ i (if (eq item :full) 1 2))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (if (and selp (not (memq style '(toggle button radio))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 ":selected only makes sense with :style toggle, radio, or button"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 menuitem)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 ;; (t (signal 'error (list "unrecognized menu descriptor" menuitem))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (t (message "unrecognized menu descriptor %s" (prin1-to-string menuitem))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (setq menu (cdr menu)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 ;;; menu manipulation functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (defun find-menu-item (menubar item-path-list &optional parent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 "Search MENUBAR for item given by ITEM-PATH-LIST starting from PARENT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 Returns (ITEM . PARENT), where PARENT is the immediate parent of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 the item found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 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
173 If some menu in the ITEM-PATH-LIST does not exist, an error is signalled."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 (check-argument-type 'listp item-path-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 (unless parent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 (setq item-path-list (mapcar 'normalize-menu-item-name item-path-list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (if (not (consp menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (let ((rest menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (when (stringp (car rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 (setq rest (cdr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 (while (keywordp (car rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (setq rest (cddr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (while rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 (if (and (car rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (equal (car item-path-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (normalize-menu-item-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (cond ((vectorp (car rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (aref (car rest) 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 ((stringp (car rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (car rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (caar rest))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 (setq result (car rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 rest nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (setq rest (cdr rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (if (cdr item-path-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 (cond ((consp result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 (find-menu-item (cdr result) (cdr item-path-list) result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (signal 'error (list (gettext "not a submenu") result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (signal 'error (list (gettext "no such submenu")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 (car item-path-list)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (cons result parent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (defun add-menu-item-1 (leaf-p menu-path new-item before in-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 ;; This code looks like it could be cleaned up some more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 ;; Do we really need 6 calls to find-menu-item?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (when before (setq before (normalize-menu-item-name before)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (let* ((item-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (cond ((vectorp new-item) (aref new-item 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 ((consp new-item) (car new-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (menubar (or in-menu current-menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (menu (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (car (find-menu-item menubar menu-path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (item-found (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 ((null item-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 ((not (listp menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 (signal 'error (list (gettext "not a submenu")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 menu-path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 (menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (find-menu-item (cdr menu) (list item-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 (find-menu-item menubar (list item-name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (unless menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (error "`current-menubar' is nil: can't add menus to it."))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (unless menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (let ((rest menu-path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (so-far menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (while rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 ;;; (setq menu (car (find-menu-item (cdr so-far) (list (car rest)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (setq menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (if (eq so-far menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 (car (find-menu-item so-far (list (car rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 (car (find-menu-item (cdr so-far) (list (car rest))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 (unless menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 (let ((rest2 so-far))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 (while (and (cdr rest2) (car (cdr rest2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (setq rest2 (cdr rest2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (setcdr rest2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (nconc (list (setq menu (list (car rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (cdr rest2)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 (setq so-far menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 (setq rest (cdr rest)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 (if (and item-found (car item-found))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 ;; hack the item in place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (if menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 ;; Isn't it very bad form to use nsubstitute for side effects?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (nsubstitute new-item (car item-found) menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (setq current-menubar (nsubstitute new-item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (car item-found)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 current-menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 ;; OK, we have to add the whole thing...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ;; if BEFORE is specified, try to add it there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (unless menu (setq menu current-menubar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (when before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 (setq before (car (find-menu-item menu (list before)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (let ((rest menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (added-before nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (while rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (if (eq before (car (cdr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (setcdr rest (cons new-item (cdr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 (setq rest nil added-before t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (setq rest (cdr rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 (when (not added-before)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 ;; adding before the first item on the menubar itself is harder
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 (if (and (eq menu menubar) (eq before (car menu)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (setq menu (cons new-item menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 current-menubar menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 ;; otherwise, add the item to the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 (nconc menu (list new-item))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 new-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 (defun add-menu-button (menu-path menu-leaf &optional before in-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 "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
284 If the named item exists already, it is changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 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
286 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
287 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 MENU-LEAF is a menubar leaf node. See the documentation of `current-menubar'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 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
290 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
291 present, it will not be moved.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
292 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
293 menu to change."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 ;; Note easymenu.el uses the fact that menu-leaf can be a submenu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 (add-menu-item-1 t menu-path menu-leaf before in-menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 ;; 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
298 ;; drastically to keep it. --Stig
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 (defun add-submenu (menu-path submenu &optional before in-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 "Add a menu to the menubar or one of its submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 If the named menu exists already, it is changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 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
303 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
304 menu. (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 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
306 SUBMENU is the new menu to add.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 See the documentation of `current-menubar' for the syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 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
309 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
310 present, it will not be moved.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
311 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
312 menu to change."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (check-menu-syntax submenu nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (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
315 ;; purespace is no more, so this function is unnecessary
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
316 ;(defun purecopy-menubar (x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
317 ; ;; 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
318 ; ;; 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
319 ; ;; writable.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
320 ; (cond ((vectorp x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
321 ; (let ((i (length x)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
322 ; (while (> i 0)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
323 ; (aset x (1- i) (purecopy (aref x (1- i))))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
324 ; (setq i (1- i))))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
325 ; x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
326 ; ((consp x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
327 ; (let ((rest x))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
328 ; (while rest
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
329 ; (setcar rest (purecopy-menubar (car rest)))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
330 ; (setq rest (cdr rest))))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
331 ; x)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
332 ; (t
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
333 ; (purecopy x))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (defun delete-menu-item (path &optional from-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 "Remove the named menu item from the menu hierarchy.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
337 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
338 in the menu hierarchy. The documentation of `add-submenu' describes
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
339 menu paths.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
340 FROM-MENU, if provided, means use that instead of `current-menubar'
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
341 as the menu to change."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (let* ((pair (condition-case nil (find-menu-item (or from-menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 current-menubar) path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (item (car pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 (parent (or (cdr pair) current-menubar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (if (not item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 ;; the menubar is the only special case, because other menus begin
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 ;; with their name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 (if (eq parent current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (setq current-menubar (delq item parent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 (delq item parent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (defun relabel-menu-item (path new-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 "Change the string of the specified menu item.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
359 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
360 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
361 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 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
364 (check-type new-name string)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (let* ((menubar current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (pair (find-menu-item menubar path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 (item (car pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (menu (cdr pair)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 (or item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (signal 'error (list (if menu (gettext "No such menu item")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 (gettext "No such menu"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 (if (and (consp item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (stringp (car item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 (setcar item new-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 (aset item 0 new-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 ;; 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
383 ;; into the menubar if we didn't want people to use 'em?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 ;; 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
385 ;; rehashed a bit.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
386 ;;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 (defun enable-menu-item-1 (path toggle-p on-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (let (menu item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 (if (and (vectorp path) (> (length path) 2)) ; limited syntax checking...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 (setq item path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 (let* ((menubar current-menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (pair (find-menu-item menubar path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (setq item (car pair)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 menu (cdr pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (or item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (signal 'error (list (if menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 "No such menu item"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 "No such menu")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 path)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (if (consp item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 (error "%S is a menu, not a menu item" path))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 (if (or (> (length item) 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 (and (symbolp (aref item 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (= ?: (aref (symbol-name (aref item 2)) 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 ;; plist-like syntax
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (let ((i 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 (keyword (if toggle-p :selected :active))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 (ok nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (while (< i (length item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (cond ((eq (aref item i) keyword)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (aset item (1+ i) on-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (setq ok t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (setq i (+ i 2)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (cond (ok nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (toggle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (signal 'error (list "not a toggle menu item" item)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 ;; Need to copy the item to extend it, sigh...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (let ((cons (memq item menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 (new-item (vconcat item (list keyword on-p))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 (if cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 (setcar cons (setq item new-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 (if menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (error "couldn't find %S on its parent?" item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 (error "no %S slot to set: %S" keyword item)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 ;; positional syntax
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (if toggle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (signal 'error (list "not a toggle menu item" item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 (aset item 2 on-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (set-menubar-dirty-flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (defun enable-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 "Make the named menu item be selectable.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
436 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
437 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
438 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (enable-menu-item-1 path nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (defun disable-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 "Make the named menu item be unselectable.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
444 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
445 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
446 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (enable-menu-item-1 path nil nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (defun select-toggle-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 "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
452 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
453 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
454 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (enable-menu-item-1 path t t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (defun deselect-toggle-menu-item (path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 "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
460 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
461 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
462 under the toplevel \"File\" menu. (\"Menu\" \"Foo\" \"Item\") means the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 menu item called \"Item\" under the \"Foo\" submenu of \"Menu\"."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (enable-menu-item-1 path t nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
467
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
468 ;;;;;;; popup menus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
469
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
470 (defvar global-popup-menu nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
471 "The global popup menu. This is present in all modes.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
472 See the function `popup-menu' for a description of menu syntax.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
473
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
474 (defvar mode-popup-menu nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
475 "The mode-specific popup menu. Automatically buffer local.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
476 This is appended to the default items in `global-popup-menu'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
477 See the function `popup-menu' for a description of menu syntax.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
478 (make-variable-buffer-local 'mode-popup-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
479
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
480 (defvar activate-popup-menu-hook nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
481 "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
482 These functions are called with no arguments, and should interrogate and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
483 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
484 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
485 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
486 this hook won't be run.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
487
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
488 (defvar last-popup-menu-event nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
489 "The mouse event that invoked the last popup menu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
490 NOTE: This is EXPERIMENTAL and may change at any time.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
491
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
492 (defun popup-mode-menu (&optional event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
493 "Pop up a menu of global and mode-specific commands.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
494 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
495 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
496 button was clicked."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
497 (interactive "_e")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
498 (setq last-popup-menu-event
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
499 (or (and event (button-event-p event) event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
500 (let* ((mouse-pos (mouse-position))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
501 (win (car mouse-pos))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
502 (x (cadr mouse-pos))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
503 (y (cddr mouse-pos))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
504 (edges (window-pixel-edges win))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
505 (winx (first edges))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
506 (winy (second edges))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
507 (x (+ x winx))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
508 (y (+ y winy)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
509 (make-event 'button-press
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
510 `(button 3 x ,x y ,y channel ,(window-frame win)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
511 timestamp ,(current-event-timestamp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
512 (cdfw-console win)))))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
513 (run-hooks 'activate-popup-menu-hook)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
514 (let* ((context-window (and event (event-window event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
515 (context-point (and event (event-point event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
516 (context-extents (and context-window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
517 context-point
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
518 (extents-at context-point
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
519 (window-buffer context-window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
520 'context-menu)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
521 (context-menu-items
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
522 (apply 'append (mapcar #'(lambda (extent)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
523 (extent-property extent 'context-menu))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
524 context-extents))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
525 (popup-menu
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
526 (progn
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
527 ;; Merge global-popup-menu and mode-popup-menu
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
528 (and mode-popup-menu (check-menu-syntax mode-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
529 (let* ((mode-title (and (stringp (car mode-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
530 (car mode-popup-menu)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
531 (mode-items (if mode-title (cdr mode-popup-menu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
532 mode-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
533 (global-title (and (stringp (car global-popup-menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
534 (car global-popup-menu)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
535 (global-items (if global-title (cdr global-popup-menu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
536 global-popup-menu))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
537 mode-filters)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
538 ;; 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
539 (while (and mode-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
540 (keywordp (car mode-items)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
541 ;; Push both keyword and its argument.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
542 (push (pop mode-items) mode-filters)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
543 (push (pop mode-items) mode-filters))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
544 (setq mode-filters (nreverse mode-filters))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
545 ;; If mode-filters contains a keyword already present in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
546 ;; `global-popup-menu', you will probably lose.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
547 (append (and popup-menu-titles
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
548 (cond (mode-title (list mode-title))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
549 (global-title (list global-title))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
550 (t "")))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
551 mode-filters
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
552 context-menu-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
553 (and context-menu-items mode-items '("---"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
554 mode-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
555 (and (or context-menu-items mode-items)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
556 global-items '("---" "---"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
557 (and global-title (list global-title))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
558 global-items
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
559 ))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
560
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
561 (while (popup-up-p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
562 (dispatch-event (next-event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
563
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
564 ))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
565
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
566 (defun popup-buffer-menu (event)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
567 "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
568 (interactive "e")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
569 (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
570 (bmenu nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
571 (or window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
572 (error "Pointer must be in a normal window"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
573 (select-window window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
574 (if current-menubar
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
575 (setq bmenu (assoc "%_Buffers" current-menubar)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
576 (if (null bmenu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
577 (setq bmenu (assoc "%_Buffers" default-menubar)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
578 (if (null bmenu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
579 (error "Can't find the Buffers menu"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
580 (popup-menu bmenu)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
581
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
582 (defun popup-menubar-menu (event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
583 "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
584 (interactive "e")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
585 (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
586 popup-menubar)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
587 (or window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
588 (error "Pointer must be in a normal window"))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
589 (select-window window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
590 (and current-menubar (run-hooks 'activate-menubar-hook))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
591 ;; #### 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
592 ;; 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
593 ;; code to just ignore nil if generating a popup menu
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
594 (setq popup-menubar (delete nil (copy-sequence (or current-menubar
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
595 default-menubar))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
596 (popup-menu (cons "%_Menubar Menu" popup-menubar))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
597 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
598
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
599 (defun menu-call-at-event (form &optional event default-behavior-fallback)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
600 "Call FORM while temporarily setting point to the position in EVENT.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
601 NOTE: This is EXPERIMENTAL and may change at any time.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
602
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
603 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
604 with `call-interactively', otherwise with `eval'. EVENT defaults to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
605 `last-popup-menu-event', making this function especially useful in popup
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
606 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
607 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
608 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
609 FORM is called normally."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
610 (or event (setq event last-popup-menu-event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
611 (let ((buf (event-buffer event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
612 (p (event-closest-point event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
613 (cond ((and buf p (> p 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
614 (save-excursion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
615 (set-buffer buf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
616 (goto-char p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
617 (if (symbolp form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
618 (call-interactively form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
619 (eval form))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
620 (default-behavior-fallback
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
621 (if (symbolp form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
622 (call-interactively form)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
623 (eval form))))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
624
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
625 (global-set-key 'button3 'popup-mode-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
626 ;; shift button3 and shift button2 are reserved for Hyperbole
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
627 (global-set-key '(meta control button3) 'popup-buffer-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
628 ;; The following command is way too dangerous with Custom.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
629 ;; (global-set-key '(meta shift button3) 'popup-menubar-menu)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
630
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
631 ;; 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
632
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
633 ;;(setq mode-popup-menu
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
634 ;; '("Test Popup Menu"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
635 ;; :filter cdr
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
636 ;; ["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
637 ;; "--:singleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
638 ;; "singleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
639 ;; "--:doubleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
640 ;; "doubleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
641 ;; "--:singleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
642 ;; "singleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
643 ;; "--:doubleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
644 ;; "doubleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
645 ;; "--:noLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
646 ;; "noLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
647 ;; "--:shadowEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
648 ;; "shadowEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
649 ;; "--:shadowEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
650 ;; "shadowEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
651 ;; "--:shadowDoubleEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
652 ;; "shadowDoubleEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
653 ;; "--:shadowDoubleEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
654 ;; "shadowDoubleEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
655 ;; "--:shadowEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
656 ;; "shadowEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
657 ;; "--:shadowEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
658 ;; "shadowEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
659 ;; "--:shadowDoubleEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
660 ;; "shadowDoubleEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
661 ;; "--:shadowDoubleEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
662 ;; "shadowDoubleEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
663 ;; ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
664
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 (defun get-popup-menu-response (menu-desc &optional event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 "Pop up the given menu and wait for a response.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 This blocks until the response is received, and returns the misc-user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 event that encapsulates the response. To execute it, you can do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 (funcall (event-function response) (event-object response))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 If no response was received, nil is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 MENU-DESC and EVENT are as in the call to `popup-menu'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 ;; partially stolen from w3
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
674
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
675 ;; 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
676 ;; 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
677 ;; in reasonable ways that you can't obstruct.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 (let ((echo-keystrokes 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 new-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 (popup-menu menu-desc event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 (catch 'popup-done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 (while t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 (setq new-event (next-command-event new-event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 (cond ((misc-user-event-p new-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 (throw 'popup-done new-event))
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
686 ((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
687 nil)
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
688 ;; 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
689 ;; arg could be missing and no-one noticed ...
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
690 ((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
691 (signal 'quit nil))
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
692 ;; mswindows has no pop-down processing (selection is
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
693 ;; 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
694 ;; 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
695 ;; 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
696 ;; processing after this check.
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
697 ((not (popup-up-p))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 (setq unread-command-events (cons new-event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 unread-command-events))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 (throw 'popup-done nil))
707
a307f9a2021d [xemacs-hg @ 2001-12-20 05:49:28 by andyp]
andyp
parents: 502
diff changeset
701 ;; mswindows never gets here
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 (beep)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 (message "please make a choice from the menu.")))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 (defun popup-menu-and-execute-in-window (menu-desc event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 "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
708 This blocks until the response is received, temporarily selects
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 EVENT's window, and executes the command specified in the response.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 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
711 MENU-DESC."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 (let ((response
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 (get-popup-menu-response menu-desc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 (and (eventp event) event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 (and (misc-user-event-p response)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 (select-window (if (windowp event) event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 (funcall (event-function response)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 (event-object response))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 ;; provide default bindings for menu accelerator map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 (and (boundp 'menu-accelerator-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 (keymapp menu-accelerator-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (define-key menu-accelerator-map "\e" 'menu-escape)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 (define-key menu-accelerator-map [left] 'menu-left)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 (define-key menu-accelerator-map [right] 'menu-right)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 (define-key menu-accelerator-map [up] 'menu-up)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 (define-key menu-accelerator-map [down] 'menu-down)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 (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
732 (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
733 (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
734 (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
735 (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
736 (define-key menu-accelerator-map [kp-enter] 'menu-select)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (define-key menu-accelerator-map "\C-g" 'menu-quit)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 (provide 'menubar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 ;;; menubar.el ends here