Mercurial > emacs
annotate src/xmenu.c @ 2861:6ecacffe7f92
* Makefile.in (.c.o): Make the rule start with a tab, not spaces.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Tue, 18 May 1993 20:35:35 +0000 |
parents | f258c79c9162 |
children | e94a593c3952 |
rev | line source |
---|---|
118 | 1 /* X Communication module for terminals which understand the X protocol. |
1437
36ef55ecb265
* frame.c (make_frame_without_minibuffer, Fwindow_frame): Use
Jim Blandy <jimb@redhat.com>
parents:
1304
diff
changeset
|
2 Copyright (C) 1986, 1988, 1992 Free Software Foundation, Inc. |
118 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
1437
36ef55ecb265
* frame.c (make_frame_without_minibuffer, Fwindow_frame): Use
Jim Blandy <jimb@redhat.com>
parents:
1304
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
118 | 9 any later version. |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
19 | |
20 /* X pop-up deck-of-cards menu facility for gnuemacs. | |
21 * | |
22 * Written by Jon Arnold and Roman Budzianowski | |
23 * Mods and rewrite by Robert Krawitz | |
24 * | |
25 */ | |
26 | |
27 #ifdef XDEBUG | |
28 #include <stdio.h> | |
29 #endif | |
30 | |
31 /* On 4.3 this loses if it comes after xterm.h. */ | |
32 #include <signal.h> | |
33 #include "config.h" | |
34 #include "lisp.h" | |
770 | 35 #include "frame.h" |
118 | 36 #include "window.h" |
1304
93d55019750e
* xmenu.c: #include "keyboard.h".
Jim Blandy <jimb@redhat.com>
parents:
1213
diff
changeset
|
37 #include "keyboard.h" |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
38 #include "blockinput.h" |
118 | 39 |
40 /* This may include sys/types.h, and that somehow loses | |
41 if this is not done before the other system files. */ | |
42 #include "xterm.h" | |
43 | |
44 /* Load sys/types.h if not already loaded. | |
45 In some systems loading it twice is suicidal. */ | |
46 #ifndef makedev | |
47 #include <sys/types.h> | |
48 #endif | |
49 | |
50 #include "dispextern.h" | |
51 | |
52 #ifdef HAVE_X11 | |
53 #include "../oldXMenu/XMenu.h" | |
54 #else | |
55 #include <X/XMenu.h> | |
56 #endif | |
57 | |
58 #define min(x,y) (((x) < (y)) ? (x) : (y)) | |
59 #define max(x,y) (((x) > (y)) ? (x) : (y)) | |
60 | |
61 #define NUL 0 | |
62 | |
63 #ifndef TRUE | |
64 #define TRUE 1 | |
65 #define FALSE 0 | |
66 #endif TRUE | |
67 | |
68 #ifdef HAVE_X11 | |
69 extern Display *x_current_display; | |
70 #else | |
71 #define ButtonReleaseMask ButtonReleased | |
72 #endif /* not HAVE_X11 */ | |
73 | |
2514
6700e25af205
Since Qmenu_enable is used by non-X-specific code, it shouldn't be
Jim Blandy <jimb@redhat.com>
parents:
2439
diff
changeset
|
74 extern Lisp_Object Qmenu_enable; |
118 | 75 Lisp_Object xmenu_show (); |
76 extern int x_error_handler (); | |
77 | |
78 /*************************************************************/ | |
79 | |
80 #if 0 | |
81 /* Ignoring the args is easiest. */ | |
82 xmenu_quit () | |
83 { | |
84 error ("Unknown XMenu error"); | |
85 } | |
86 #endif | |
87 | |
88 DEFUN ("x-popup-menu",Fx_popup_menu, Sx_popup_menu, 1, 2, 0, | |
89 "Pop up a deck-of-cards menu and return user's selection.\n\ | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
90 POSITION is a position specification. This is either a mouse button event\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
91 or a list ((XOFFSET YOFFSET) WINDOW)\n\ |
118 | 92 where XOFFSET and YOFFSET are positions in characters from the top left\n\ |
2147
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
93 corner of WINDOW's frame. (WINDOW may be a frame object instead of a window.)\n\ |
118 | 94 This controls the position of the center of the first line\n\ |
95 in the first pane of the menu, not the top left of the menu as a whole.\n\ | |
96 \n\ | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
97 MENU is a specifier for a menu. For the simplest case, MENU is a keymap.\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
98 The menu items come from key bindings that have a menu string as well as\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
99 a definition; actually, the \"definition\" in such a key binding looks like\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
100 \(STRING . REAL-DEFINITION). To give the menu a title, put a string into\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
101 the keymap as a top-level element.\n\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
102 You can also use a list of keymaps as MENU.\n\ |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
103 Then each keymap makes a separate pane.\n\ |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
104 When MENU is a keymap or a list of keymaps, the return value\n\ |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
105 is a list of events.\n\n\ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
106 Alternatively, you can specify a menu of multiple panes\n\ |
2191
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
107 with a list of the form (TITLE PANE1 PANE2...),\n\ |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
108 where each pane is a list of form (TITLE ITEM1 ITEM2...).\n\ |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
109 Each ITEM is normally a cons cell (STRING . VALUE);\n\ |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
110 but a string can appear as an item--that makes a nonselectable line\n\ |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
111 in the menu.\n\ |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
112 With this form of menu, the return value is VALUE from the chosen item.") |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
113 (position, menu) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
114 Lisp_Object position, menu; |
118 | 115 { |
116 int number_of_panes; | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
117 Lisp_Object XMenu_return, keymap, tem; |
118 | 118 int XMenu_xpos, XMenu_ypos; |
119 char **menus; | |
120 char ***names; | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
121 int **enables; |
118 | 122 Lisp_Object **obj_list; |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
123 Lisp_Object *prefixes; |
118 | 124 int *items; |
125 char *title; | |
126 char *error_name; | |
127 Lisp_Object ltitle, selection; | |
128 int i, j; | |
770 | 129 FRAME_PTR f; |
118 | 130 Lisp_Object x, y, window; |
131 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
132 /* Decode the first argument: find the window and the coordinates. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
133 tem = Fcar (position); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
134 if (XTYPE (tem) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
135 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
136 window = Fcar (Fcdr (position)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
137 x = Fcar (tem); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
138 y = Fcar (Fcdr (tem)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
139 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
140 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
141 { |
2153
42ceb87b43a1
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2147
diff
changeset
|
142 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ |
42ceb87b43a1
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2147
diff
changeset
|
143 window = Fcar (tem); /* POSN_WINDOW (tem) */ |
42ceb87b43a1
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2147
diff
changeset
|
144 tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
145 x = Fcar (tem); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
146 y = Fcdr (tem); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
147 } |
118 | 148 CHECK_NUMBER (x, 0); |
149 CHECK_NUMBER (y, 0); | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
150 |
2147
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
151 if (XTYPE (window) == Lisp_Frame) |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
152 { |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
153 f = XFRAME (window); |
118 | 154 |
2147
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
155 XMenu_xpos = 0; |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
156 XMenu_ypos = 0; |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
157 } |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
158 else if (XTYPE (window) == Lisp_Window) |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
159 { |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
160 CHECK_LIVE_WINDOW (window, 0); |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
161 f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
162 |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
163 XMenu_xpos = FONT_WIDTH (f->display.x->font) * XWINDOW (window)->left; |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
164 XMenu_ypos = FONT_HEIGHT (f->display.x->font) * XWINDOW (window)->top; |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
165 } |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
166 |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
167 XMenu_xpos += FONT_WIDTH (f->display.x->font) * XINT (x); |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
168 XMenu_ypos += FONT_HEIGHT (f->display.x->font) * XINT (y); |
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
169 |
770 | 170 XMenu_xpos += f->display.x->left_pos; |
171 XMenu_ypos += f->display.x->top_pos; | |
118 | 172 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
173 keymap = Fkeymapp (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
174 tem = Qnil; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
175 if (XTYPE (menu) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
176 tem = Fkeymapp (Fcar (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
177 if (!NILP (keymap)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
178 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
179 /* We were given a keymap. Extract menu info from the keymap. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
180 Lisp_Object prompt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
181 keymap = get_keymap (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
182 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
183 /* Search for a string appearing directly as an element of the keymap. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
184 That string is the title of the menu. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
185 prompt = map_prompt (keymap); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
186 if (!NILP (prompt)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
187 title = (char *) XSTRING (prompt)->data; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
188 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
189 /* Extract the detailed info to make one pane. */ |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
190 number_of_panes = keymap_panes (&obj_list, &menus, &names, &enables, |
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
191 &items, &menu, 1); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
192 /* The menu title seems to be ignored, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
193 so put it in the pane title. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
194 if (menus[0] == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
195 menus[0] = title; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
196 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
197 else if (!NILP (tem)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
198 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
199 /* We were given a list of keymaps. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
200 Lisp_Object prompt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
201 int nmaps = XFASTINT (Flength (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
202 Lisp_Object *maps |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
203 = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
204 int i; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
205 title = 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
206 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
207 /* The first keymap that has a prompt string |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
208 supplies the menu title. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
209 for (tem = menu, i = 0; XTYPE (tem) == Lisp_Cons; tem = Fcdr (tem)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
210 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
211 maps[i++] = keymap = get_keymap (Fcar (tem)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
212 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
213 prompt = map_prompt (keymap); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
214 if (title == 0 && !NILP (prompt)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
215 title = (char *) XSTRING (prompt)->data; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
216 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
217 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
218 /* Extract the detailed info to make one pane. */ |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
219 number_of_panes = keymap_panes (&obj_list, &menus, &names, &enables, |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
220 &items, &prefixes, maps, nmaps); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
221 /* The menu title seems to be ignored, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
222 so put it in the pane title. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
223 if (menus[0] == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
224 menus[0] = title; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
225 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
226 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
227 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
228 /* We were given an old-fashioned menu. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
229 ltitle = Fcar (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
230 CHECK_STRING (ltitle, 1); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
231 title = (char *) XSTRING (ltitle)->data; |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
232 prefixes = 0; |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
233 number_of_panes = list_of_panes (&obj_list, &menus, &names, &enables, |
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
234 &items, Fcdr (menu)); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
235 } |
118 | 236 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
237 fprintf (stderr, "Panes = %d\n", number_of_panes); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
238 for (i = 0; i < number_of_panes; i++) |
118 | 239 { |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
240 fprintf (stderr, "Pane %d has lines %d title %s\n", |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
241 i, items[i], menus[i]); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
242 for (j = 0; j < items[i]; j++) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
243 fprintf (stderr, " Item %d %s\n", j, names[i][j]); |
118 | 244 } |
245 #endif | |
246 BLOCK_INPUT; | |
1828
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
247 { |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
248 Window root; |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
249 int root_x, root_y; |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
250 int dummy_int; |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
251 unsigned int dummy_uint; |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
252 Window dummy_window; |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
253 |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
254 /* Figure out which root window F is on. */ |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
255 XGetGeometry (x_current_display, FRAME_X_WINDOW (f), &root, |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
256 &dummy_int, &dummy_int, &dummy_uint, &dummy_uint, |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
257 &dummy_uint, &dummy_uint); |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
258 |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
259 /* Translate the menu co-ordinates within f to menu co-ordinates |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
260 on that root window. */ |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
261 if (! XTranslateCoordinates (x_current_display, |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
262 FRAME_X_WINDOW (f), root, |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
263 XMenu_xpos, XMenu_ypos, &root_x, &root_y, |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
264 &dummy_window)) |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
265 /* But XGetGeometry said root was the root window of f's screen! */ |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
266 abort (); |
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
267 |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
268 selection = xmenu_show (root, XMenu_xpos, XMenu_ypos, names, enables, |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
269 menus, prefixes, items, number_of_panes, obj_list, |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
270 title, &error_name); |
1828
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
271 } |
118 | 272 UNBLOCK_INPUT; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
273 /* fprintf (stderr, "selection = %x\n", selection); */ |
118 | 274 if (selection != NUL) |
275 { /* selected something */ | |
276 XMenu_return = selection; | |
277 } | |
278 else | |
279 { /* nothing selected */ | |
280 XMenu_return = Qnil; | |
281 } | |
282 /* now free up the strings */ | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
283 for (i = 0; i < number_of_panes; i++) |
118 | 284 { |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
285 xfree (names[i]); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
286 xfree (enables[i]); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
287 xfree (obj_list[i]); |
118 | 288 } |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
289 xfree (menus); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
290 xfree (obj_list); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
291 xfree (names); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
292 xfree (enables); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
293 xfree (items); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
294 /* free (title); */ |
118 | 295 if (error_name) error (error_name); |
296 return XMenu_return; | |
297 } | |
298 | |
299 struct indices { | |
300 int pane; | |
301 int line; | |
302 }; | |
303 | |
304 Lisp_Object | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
305 xmenu_show (parent, startx, starty, line_list, enable_list, pane_list, |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
306 prefixes, line_cnt, pane_cnt, item_list, title, error) |
118 | 307 Window parent; |
308 int startx, starty; /* upper left corner position BROKEN */ | |
309 char **line_list[]; /* list of strings for items */ | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
310 int *enable_list[]; /* list of strings for items */ |
118 | 311 char *pane_list[]; /* list of pane titles */ |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
312 Lisp_Object *prefixes; /* Prefix key for each pane */ |
118 | 313 char *title; |
314 int pane_cnt; /* total number of panes */ | |
315 Lisp_Object *item_list[]; /* All items */ | |
316 int line_cnt[]; /* Lines in each pane */ | |
317 char **error; /* Error returned */ | |
318 { | |
319 XMenu *GXMenu; | |
320 int last, panes, selidx, lpane, status; | |
321 int lines, sofar; | |
322 Lisp_Object entry; | |
323 /* struct indices *datap, *datap_save; */ | |
324 char *datap; | |
325 int ulx, uly, width, height; | |
326 int dispwidth, dispheight; | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
327 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
328 if (pane_cnt == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
329 return 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
330 |
2209
7b95f29936cb
(xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents:
2191
diff
changeset
|
331 BLOCK_INPUT; |
118 | 332 *error = (char *) 0; /* Initialize error pointer to null */ |
333 GXMenu = XMenuCreate (XDISPLAY parent, "emacs"); | |
334 if (GXMenu == NUL) | |
335 { | |
336 *error = "Can't create menu"; | |
2209
7b95f29936cb
(xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents:
2191
diff
changeset
|
337 UNBLOCK_INPUT; |
118 | 338 return (0); |
339 } | |
340 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
341 for (panes = 0, lines = 0; panes < pane_cnt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
342 lines += line_cnt[panes], panes++) |
118 | 343 ; |
344 /* datap = (struct indices *) xmalloc (lines * sizeof (struct indices)); */ | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
345 /* datap = (char *) xmalloc (lines * sizeof (char)); |
118 | 346 datap_save = datap;*/ |
347 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
348 for (panes = 0, sofar = 0; panes < pane_cnt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
349 sofar += line_cnt[panes], panes++) |
118 | 350 { |
351 /* create all the necessary panes */ | |
352 lpane = XMenuAddPane (XDISPLAY GXMenu, pane_list[panes], TRUE); | |
353 if (lpane == XM_FAILURE) | |
354 { | |
355 XMenuDestroy (XDISPLAY GXMenu); | |
356 *error = "Can't create pane"; | |
2209
7b95f29936cb
(xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents:
2191
diff
changeset
|
357 UNBLOCK_INPUT; |
118 | 358 return (0); |
359 } | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
360 for (selidx = 0; selidx < line_cnt[panes]; selidx++) |
118 | 361 { |
362 /* add the selection stuff to the menus */ | |
363 /* datap[selidx+sofar].pane = panes; | |
364 datap[selidx+sofar].line = selidx; */ | |
365 if (XMenuAddSelection (XDISPLAY GXMenu, lpane, 0, | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
366 line_list[panes][selidx], |
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
367 enable_list[panes][selidx]) |
118 | 368 == XM_FAILURE) |
369 { | |
370 XMenuDestroy (XDISPLAY GXMenu); | |
371 /* free (datap); */ | |
372 *error = "Can't add selection to menu"; | |
373 /* error ("Can't add selection to menu"); */ | |
2209
7b95f29936cb
(xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents:
2191
diff
changeset
|
374 UNBLOCK_INPUT; |
118 | 375 return (0); |
376 } | |
377 } | |
378 } | |
379 /* all set and ready to fly */ | |
380 XMenuRecompute (XDISPLAY GXMenu); | |
381 dispwidth = DisplayWidth (x_current_display, XDefaultScreen (x_current_display)); | |
382 dispheight = DisplayHeight (x_current_display, XDefaultScreen (x_current_display)); | |
383 startx = min (startx, dispwidth); | |
384 starty = min (starty, dispheight); | |
385 startx = max (startx, 1); | |
386 starty = max (starty, 1); | |
387 XMenuLocate (XDISPLAY GXMenu, 0, 0, startx, starty, | |
388 &ulx, &uly, &width, &height); | |
389 if (ulx+width > dispwidth) | |
390 { | |
391 startx -= (ulx + width) - dispwidth; | |
392 ulx = dispwidth - width; | |
393 } | |
394 if (uly+height > dispheight) | |
395 { | |
396 starty -= (uly + height) - dispheight; | |
397 uly = dispheight - height; | |
398 } | |
399 if (ulx < 0) startx -= ulx; | |
400 if (uly < 0) starty -= uly; | |
401 | |
402 XMenuSetFreeze (GXMenu, TRUE); | |
403 panes = selidx = 0; | |
404 | |
405 status = XMenuActivate (XDISPLAY GXMenu, &panes, &selidx, | |
406 startx, starty, ButtonReleaseMask, &datap); | |
407 switch (status) | |
408 { | |
409 case XM_SUCCESS: | |
410 #ifdef XDEBUG | |
411 fprintf (stderr, "pane= %d line = %d\n", panes, selidx); | |
412 #endif | |
413 entry = item_list[panes][selidx]; | |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
414 if (prefixes != 0) |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
415 { |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
416 entry = Fcons (entry, Qnil); |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
417 if (!NILP (prefixes[panes])) |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
418 entry = Fcons (prefixes[panes], entry); |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
419 } |
118 | 420 break; |
421 case XM_FAILURE: | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
422 /* free (datap_save); */ |
118 | 423 XMenuDestroy (XDISPLAY GXMenu); |
424 *error = "Can't activate menu"; | |
425 /* error ("Can't activate menu"); */ | |
426 case XM_IA_SELECT: | |
427 case XM_NO_SELECT: | |
428 entry = Qnil; | |
429 break; | |
430 } | |
431 XMenuDestroy (XDISPLAY GXMenu); | |
2209
7b95f29936cb
(xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents:
2191
diff
changeset
|
432 UNBLOCK_INPUT; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
433 /* free (datap_save);*/ |
118 | 434 return (entry); |
435 } | |
436 | |
437 syms_of_xmenu () | |
438 { | |
439 defsubr (&Sx_popup_menu); | |
440 } | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
441 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
442 /* Construct the vectors that describe a menu |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
443 and store them in *VECTOR, *PANES, *NAMES, *ENABLES and *ITEMS. |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
444 Each of those four values is a vector indexed by pane number. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
445 Return the number of panes. |
118 | 446 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
447 KEYMAPS is a vector of keymaps. NMAPS gives the length of KEYMAPS. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
448 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
449 int |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
450 keymap_panes (vector, panes, names, enables, items, prefixes, keymaps, nmaps) |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
451 Lisp_Object ***vector; /* RETURN all menu objects */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
452 char ***panes; /* RETURN pane names */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
453 char ****names; /* RETURN all line names */ |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
454 int ***enables; /* RETURN enable-flags of lines */ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
455 int **items; /* RETURN number of items per pane */ |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
456 Lisp_Object **prefixes; /* RETURN vector of prefix keys, per pane */ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
457 Lisp_Object *keymaps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
458 int nmaps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
459 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
460 /* Number of panes we have made. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
461 int p = 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
462 /* Number of panes we have space for. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
463 int npanes_allocated = nmaps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
464 int mapno; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
465 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
466 if (npanes_allocated < 4) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
467 npanes_allocated = 4; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
468 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
469 /* Make space for an estimated number of panes. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
470 *vector = (Lisp_Object **) xmalloc (npanes_allocated * sizeof (Lisp_Object *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
471 *panes = (char **) xmalloc (npanes_allocated * sizeof (char *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
472 *items = (int *) xmalloc (npanes_allocated * sizeof (int)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
473 *names = (char ***) xmalloc (npanes_allocated * sizeof (char **)); |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
474 *enables = (int **) xmalloc (npanes_allocated * sizeof (int *)); |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
475 *prefixes = (Lisp_Object *) xmalloc (npanes_allocated * sizeof (Lisp_Object)); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
476 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
477 /* Loop over the given keymaps, making a pane for each map. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
478 But don't make a pane that is empty--ignore that map instead. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
479 P is the number of panes we have made so far. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
480 for (mapno = 0; mapno < nmaps; mapno++) |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
481 single_keymap_panes (keymaps[mapno], panes, vector, names, enables, items, |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
482 prefixes, &p, &npanes_allocated, ""); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
483 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
484 /* Return the number of panes. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
485 return p; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
486 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
487 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
488 /* This is a recursive subroutine of the previous function. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
489 It handles one keymap, KEYMAP. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
490 The other arguments are passed along |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
491 or point to local variables of the previous function. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
492 |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
493 single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes, |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
494 p_ptr, npanes_allocated_ptr, pane_name) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
495 Lisp_Object keymap; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
496 Lisp_Object ***vector; /* RETURN all menu objects */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
497 char ***panes; /* RETURN pane names */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
498 char ****names; /* RETURN all line names */ |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
499 int ***enables; /* RETURN enable flags of lines */ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
500 int **items; /* RETURN number of items per pane */ |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
501 Lisp_Object **prefixes; /* RETURN vector of prefix keys, per pane */ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
502 int *p_ptr; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
503 int *npanes_allocated_ptr; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
504 char *pane_name; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
505 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
506 int i; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
507 Lisp_Object pending_maps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
508 Lisp_Object tail, item, item1, item2, table; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
509 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
510 pending_maps = Qnil; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
511 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
512 /* Make sure we have room for another pane. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
513 if (*p_ptr == *npanes_allocated_ptr) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
514 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
515 *npanes_allocated_ptr *= 2; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
516 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
517 *vector |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
518 = (Lisp_Object **) xrealloc (*vector, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
519 *npanes_allocated_ptr * sizeof (Lisp_Object *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
520 *panes |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
521 = (char **) xrealloc (*panes, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
522 *npanes_allocated_ptr * sizeof (char *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
523 *items |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
524 = (int *) xrealloc (*items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
525 *npanes_allocated_ptr * sizeof (int)); |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
526 *prefixes |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
527 = (Lisp_Object *) xrealloc (*prefixes, |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
528 (*npanes_allocated_ptr |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
529 * sizeof (Lisp_Object))); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
530 *names |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
531 = (char ***) xrealloc (*names, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
532 *npanes_allocated_ptr * sizeof (char **)); |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
533 *enables |
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
534 = (int **) xrealloc (*enables, |
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
535 *npanes_allocated_ptr * sizeof (int *)); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
536 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
537 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
538 /* When a menu comes from keymaps, don't give names to the panes. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
539 (*panes)[*p_ptr] = pane_name; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
540 |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
541 /* Normally put nil as pane's prefix key. |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
542 Caller will override this if appropriate. */ |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
543 (*prefixes)[*p_ptr] = Qnil; |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
544 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
545 /* Get the length of the list level of the keymap. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
546 i = XFASTINT (Flength (keymap)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
547 |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
548 /* Add in lengths of any arrays. */ |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
549 for (tail = keymap; XTYPE (tail) == Lisp_Cons; tail = XCONS (tail)->cdr) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
550 if (XTYPE (XCONS (tail)->car) == Lisp_Vector) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
551 i += XVECTOR (XCONS (tail)->car)->size; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
552 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
553 /* Create vectors for the names and values of the items in the pane. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
554 I is an upper bound for the number of items. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
555 (*vector)[*p_ptr] = (Lisp_Object *) xmalloc (i * sizeof (Lisp_Object)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
556 (*names)[*p_ptr] = (char **) xmalloc (i * sizeof (char *)); |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
557 (*enables)[*p_ptr] = (int *) xmalloc (i * sizeof (int)); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
558 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
559 /* I is now the index of the next unused slots. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
560 i = 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
561 for (tail = keymap; XTYPE (tail) == Lisp_Cons; tail = XCONS (tail)->cdr) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
562 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
563 /* Look at each key binding, and if it has a menu string, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
564 make a menu item from it. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
565 item = XCONS (tail)->car; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
566 if (XTYPE (item) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
567 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
568 item1 = XCONS (item)->cdr; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
569 if (XTYPE (item1) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
570 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
571 item2 = XCONS (item1)->car; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
572 if (XTYPE (item2) == Lisp_String) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
573 { |
2135
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
574 Lisp_Object def, tem; |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
575 Lisp_Object enabled; |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
576 |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
577 def = Fcdr (item1); |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
578 enabled = Qt; |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
579 if (XTYPE (def) == Lisp_Symbol) |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
580 { |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
581 /* No property, or nil, means enable. |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
582 Otherwise, enable if value is not nil. */ |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
583 tem = Fget (def, Qmenu_enable); |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
584 if (!NILP (tem)) |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
585 enabled = Feval (tem); |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
586 } |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
587 tem = Fkeymapp (def); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
588 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
589 pending_maps = Fcons (Fcons (def, Fcons (item2, XCONS (item)->car)), |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
590 pending_maps); |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
591 else |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
592 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
593 (*names)[*p_ptr][i] = (char *) XSTRING (item2)->data; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
594 /* The menu item "value" is the key bound here. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
595 (*vector)[*p_ptr][i] = XCONS (item)->car; |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
596 (*enables)[*p_ptr][i] |
2191
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
597 = (NILP (def) ? -1 : !NILP (enabled) ? 1 : 0); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
598 i++; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
599 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
600 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
601 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
602 } |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
603 else if (XTYPE (item) == Lisp_Vector) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
604 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
605 /* Loop over the char values represented in the vector. */ |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
606 int len = XVECTOR (item)->size; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
607 int c; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
608 for (c = 0; c < len; c++) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
609 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
610 Lisp_Object character; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
611 XFASTINT (character) = c; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
612 item1 = XVECTOR (item)->contents[c]; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
613 if (XTYPE (item1) == Lisp_Cons) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
614 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
615 item2 = XCONS (item1)->car; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
616 if (XTYPE (item2) == Lisp_String) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
617 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
618 Lisp_Object tem; |
2135
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
619 Lisp_Object def; |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
620 Lisp_Object enabled; |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
621 |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
622 def = Fcdr (item1); |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
623 enabled = Qt; |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
624 if (XTYPE (def) == Lisp_Symbol) |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
625 { |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
626 tem = Fget (def, Qmenu_enable); |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
627 /* No property, or nil, means enable. |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
628 Otherwise, enable if value is not nil. */ |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
629 if (!NILP (tem)) |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
630 enabled = Feval (tem); |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
631 } |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
632 |
0634d08c28d1
(syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents:
1933
diff
changeset
|
633 tem = Fkeymapp (def); |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
634 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
635 pending_maps = Fcons (Fcons (def, Fcons (item2, character)), |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
636 pending_maps); |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
637 else |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
638 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
639 (*names)[*p_ptr][i] = (char *) XSTRING (item2)->data; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
640 /* The menu item "value" is the key bound here. */ |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
641 (*vector)[*p_ptr][i] = character; |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
642 (*enables)[*p_ptr][i] |
2191
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
643 = (NILP (def) ? -1 : !NILP (enabled) ? 1 : 0); |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
644 i++; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
645 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
646 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
647 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
648 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
649 } |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
650 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
651 /* Record the number of items in the pane. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
652 (*items)[*p_ptr] = i; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
653 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
654 /* If we just made an empty pane, get rid of it. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
655 if (i == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
656 { |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
657 xfree ((*vector)[*p_ptr]); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
658 xfree ((*names)[*p_ptr]); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
659 xfree ((*enables)[*p_ptr]); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
660 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
661 /* Otherwise, advance past it. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
662 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
663 (*p_ptr)++; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
664 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
665 /* Process now any submenus which want to be panes at this level. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
666 while (!NILP (pending_maps)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
667 { |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
668 Lisp_Object elt, eltcdr; |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
669 int panenum = *p_ptr; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
670 elt = Fcar (pending_maps); |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
671 eltcdr = XCONS (elt)->cdr; |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
672 single_keymap_panes (Fcar (elt), panes, vector, names, enables, items, |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
673 prefixes, p_ptr, npanes_allocated_ptr, |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
674 /* Add 1 to discard the @. */ |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
675 (char *) XSTRING (XCONS (eltcdr)->car)->data + 1); |
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
676 (*prefixes)[panenum] = XCONS (eltcdr)->cdr; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
677 pending_maps = Fcdr (pending_maps); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
678 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
679 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
680 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
681 /* Construct the vectors that describe a menu |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
682 and store them in *VECTOR, *PANES, *NAMES, *ENABLES and *ITEMS. |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
683 Each of those four values is a vector indexed by pane number. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
684 Return the number of panes. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
685 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
686 MENU is the argument that was given to Fx_popup_menu. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
687 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
688 int |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
689 list_of_panes (vector, panes, names, enables, items, menu) |
118 | 690 Lisp_Object ***vector; /* RETURN all menu objects */ |
691 char ***panes; /* RETURN pane names */ | |
692 char ****names; /* RETURN all line names */ | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
693 int ***enables; /* RETURN enable flags of lines */ |
118 | 694 int **items; /* RETURN number of items per pane */ |
695 Lisp_Object menu; | |
696 { | |
697 Lisp_Object tail, item, item1; | |
698 int i; | |
699 | |
700 if (XTYPE (menu) != Lisp_Cons) menu = wrong_type_argument (Qlistp, menu); | |
701 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
702 i = XFASTINT (Flength (menu)); |
118 | 703 |
704 *vector = (Lisp_Object **) xmalloc (i * sizeof (Lisp_Object *)); | |
705 *panes = (char **) xmalloc (i * sizeof (char *)); | |
706 *items = (int *) xmalloc (i * sizeof (int)); | |
707 *names = (char ***) xmalloc (i * sizeof (char **)); | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
708 *enables = (int **) xmalloc (i * sizeof (int *)); |
118 | 709 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
710 for (i = 0, tail = menu; !NILP (tail); tail = Fcdr (tail), i++) |
118 | 711 { |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
712 item = Fcdr (Fcar (tail)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
713 if (XTYPE (item) != Lisp_Cons) (void) wrong_type_argument (Qlistp, item); |
118 | 714 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
715 fprintf (stderr, "list_of_panes check tail, i=%d\n", i); |
118 | 716 #endif |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
717 item1 = Fcar (Fcar (tail)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
718 CHECK_STRING (item1, 1); |
118 | 719 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
720 fprintf (stderr, "list_of_panes check pane, i=%d%s\n", i, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
721 XSTRING (item1)->data); |
118 | 722 #endif |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
723 (*panes)[i] = (char *) XSTRING (item1)->data; |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
724 (*items)[i] = list_of_items ((*vector)+i, (*names)+i, (*enables)+i, item); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
725 /* (*panes)[i] = (char *) xmalloc ((XSTRING (item1)->size)+1); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
726 bcopy (XSTRING (item1)->data, (*panes)[i], XSTRING (item1)->size + 1) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
727 ; */ |
118 | 728 } |
729 return i; | |
730 } | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
731 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
732 /* Construct the lists of values and names for a single pane, from the |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
733 alist PANE. Put them in *VECTOR and *NAMES. Put the enable flags |
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
734 int *ENABLES. Return the number of items. */ |
118 | 735 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
736 int |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
737 list_of_items (vector, names, enables, pane) |
118 | 738 Lisp_Object **vector; /* RETURN menu "objects" */ |
739 char ***names; /* RETURN line names */ | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
740 int **enables; /* RETURN enable flags of lines */ |
118 | 741 Lisp_Object pane; |
742 { | |
743 Lisp_Object tail, item, item1; | |
744 int i; | |
745 | |
746 if (XTYPE (pane) != Lisp_Cons) pane = wrong_type_argument (Qlistp, pane); | |
747 | |
1933
63ba4f555b90
* minibuf.c (Fdisplay_completion_list): Pass the proper number of
Jim Blandy <jimb@redhat.com>
parents:
1828
diff
changeset
|
748 i = XFASTINT (Flength (pane)); |
118 | 749 |
750 *vector = (Lisp_Object *) xmalloc (i * sizeof (Lisp_Object)); | |
751 *names = (char **) xmalloc (i * sizeof (char *)); | |
2160
0639c52f017c
(xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents:
2153
diff
changeset
|
752 *enables = (int *) xmalloc (i * sizeof (int)); |
118 | 753 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
754 for (i = 0, tail = pane; !NILP (tail); tail = Fcdr (tail), i++) |
118 | 755 { |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
756 item = Fcar (tail); |
2191
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
757 if (STRINGP (item)) |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
758 { |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
759 (*vector)[i] = Qnil; |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
760 (*names)[i] = (char *) XSTRING (item)->data; |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
761 (*enables)[i] = -1; |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
762 } |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
763 else |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
764 { |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
765 CHECK_CONS (item, 0); |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
766 (*vector)[i] = Fcdr (item); |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
767 item1 = Fcar (item); |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
768 CHECK_STRING (item1, 1); |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
769 (*names)[i] = (char *) XSTRING (item1)->data; |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
770 (*enables)[i] = 1; |
12480fa04422
(list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents:
2160
diff
changeset
|
771 } |
118 | 772 } |
773 return i; | |
774 } |