Mercurial > emacs
annotate src/xmenu.c @ 1347:ac3a893b9bb9
(Fcall_interactively): Pass 2nd arg to Fother_buffer.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 06 Oct 1992 00:03:11 +0000 |
parents | 93d55019750e |
children | 36ef55ecb265 |
rev | line source |
---|---|
118 | 1 /* X Communication module for terminals which understand the X protocol. |
2 Copyright (C) 1986, 1988 Free Software Foundation, Inc. | |
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 | |
8 the Free Software Foundation; either version 1, or (at your option) | |
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" |
118 | 38 |
39 /* This may include sys/types.h, and that somehow loses | |
40 if this is not done before the other system files. */ | |
41 #include "xterm.h" | |
42 | |
43 /* Load sys/types.h if not already loaded. | |
44 In some systems loading it twice is suicidal. */ | |
45 #ifndef makedev | |
46 #include <sys/types.h> | |
47 #endif | |
48 | |
49 #include "dispextern.h" | |
50 | |
51 #ifdef HAVE_X11 | |
52 #include "../oldXMenu/XMenu.h" | |
53 #else | |
54 #include <X/XMenu.h> | |
55 #endif | |
56 | |
57 #define min(x,y) (((x) < (y)) ? (x) : (y)) | |
58 #define max(x,y) (((x) > (y)) ? (x) : (y)) | |
59 | |
60 #define NUL 0 | |
61 | |
62 #ifndef TRUE | |
63 #define TRUE 1 | |
64 #define FALSE 0 | |
65 #endif TRUE | |
66 | |
67 #ifdef HAVE_X11 | |
68 extern Display *x_current_display; | |
69 #else | |
70 #define ButtonReleaseMask ButtonReleased | |
71 #endif /* not HAVE_X11 */ | |
72 | |
73 Lisp_Object xmenu_show (); | |
74 extern int x_error_handler (); | |
75 | |
76 /*************************************************************/ | |
77 | |
78 #if 0 | |
79 /* Ignoring the args is easiest. */ | |
80 xmenu_quit () | |
81 { | |
82 error ("Unknown XMenu error"); | |
83 } | |
84 #endif | |
85 | |
86 DEFUN ("x-popup-menu",Fx_popup_menu, Sx_popup_menu, 1, 2, 0, | |
87 "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
|
88 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
|
89 or a list ((XOFFSET YOFFSET) WINDOW)\n\ |
118 | 90 where XOFFSET and YOFFSET are positions in characters from the top left\n\ |
770 | 91 corner of WINDOW's frame. A mouse-event list will serve for this.\n\ |
118 | 92 This controls the position of the center of the first line\n\ |
93 in the first pane of the menu, not the top left of the menu as a whole.\n\ | |
94 \n\ | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
95 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
|
96 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
|
97 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
|
98 \(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
|
99 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
|
100 You can also use a list of keymaps as MENU.\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
101 Then each keymap makes a separate pane.\n\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
102 Alternatively, you can specify a menu of multiple panes\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
103 with a list of the form\n\ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
104 \(TITLE PANE1 PANE2...), where each pane is a list of form\n\ |
118 | 105 \(TITLE (LINE ITEM)...). Each line should be a string, and item should\n\ |
106 be the return value for that line (i.e. if it is selected.") | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
107 (position, menu) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
108 Lisp_Object position, menu; |
118 | 109 { |
110 int number_of_panes; | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
111 Lisp_Object XMenu_return, keymap, tem; |
118 | 112 int XMenu_xpos, XMenu_ypos; |
113 char **menus; | |
114 char ***names; | |
115 Lisp_Object **obj_list; | |
116 int *items; | |
117 char *title; | |
118 char *error_name; | |
119 Lisp_Object ltitle, selection; | |
120 int i, j; | |
770 | 121 FRAME_PTR f; |
118 | 122 Lisp_Object x, y, window; |
123 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
124 /* 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
|
125 tem = Fcar (position); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
126 if (XTYPE (tem) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
127 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
128 window = Fcar (Fcdr (position)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
129 x = Fcar (tem); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
130 y = Fcar (Fcdr (tem)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
131 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
132 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
133 { |
1304
93d55019750e
* xmenu.c: #include "keyboard.h".
Jim Blandy <jimb@redhat.com>
parents:
1213
diff
changeset
|
134 tem = EVENT_START (position); |
93d55019750e
* xmenu.c: #include "keyboard.h".
Jim Blandy <jimb@redhat.com>
parents:
1213
diff
changeset
|
135 window = POSN_WINDOW (tem); |
93d55019750e
* xmenu.c: #include "keyboard.h".
Jim Blandy <jimb@redhat.com>
parents:
1213
diff
changeset
|
136 tem = POSN_WINDOW_POSN (tem); |
1082
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 = Fcdr (tem); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
139 } |
118 | 140 CHECK_WINDOW (window, 0); |
141 CHECK_NUMBER (x, 0); | |
142 CHECK_NUMBER (y, 0); | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
143 |
770 | 144 f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
118 | 145 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
146 XMenu_xpos |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
147 = FONT_WIDTH (f->display.x->font) * (XINT (x) + XWINDOW (window)->left); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
148 XMenu_ypos |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
149 = FONT_HEIGHT (f->display.x->font) * (XINT (y) + XWINDOW (window)->top); |
770 | 150 XMenu_xpos += f->display.x->left_pos; |
151 XMenu_ypos += f->display.x->top_pos; | |
118 | 152 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
153 keymap = Fkeymapp (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
154 tem = Qnil; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
155 if (XTYPE (menu) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
156 tem = Fkeymapp (Fcar (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
157 if (!NILP (keymap)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
158 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
159 /* 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
|
160 Lisp_Object prompt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
161 keymap = get_keymap (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
162 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
163 /* 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
|
164 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
|
165 prompt = map_prompt (keymap); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
166 if (!NILP (prompt)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
167 title = (char *) XSTRING (prompt)->data; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
168 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
169 /* Extract the detailed info to make one pane. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
170 number_of_panes = keymap_panes (&obj_list, &menus, &names, &items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
171 &menu, 1); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
172 /* 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
|
173 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
|
174 if (menus[0] == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
175 menus[0] = title; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
176 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
177 else if (!NILP (tem)) |
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 list of keymaps. */ |
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 int nmaps = XFASTINT (Flength (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
182 Lisp_Object *maps |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
183 = (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
|
184 int i; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
185 title = 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
186 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
187 /* 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
|
188 supplies the menu title. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
189 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
|
190 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
191 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
|
192 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
193 prompt = map_prompt (keymap); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
194 if (title == 0 && !NILP (prompt)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
195 title = (char *) XSTRING (prompt)->data; |
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 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
198 /* Extract the detailed info to make one pane. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
199 number_of_panes = keymap_panes (&obj_list, &menus, &names, &items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
200 maps, nmaps); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
201 /* 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
|
202 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
|
203 if (menus[0] == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
204 menus[0] = title; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
205 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
206 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
207 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
208 /* 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
|
209 ltitle = Fcar (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
210 CHECK_STRING (ltitle, 1); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
211 title = (char *) XSTRING (ltitle)->data; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
212 number_of_panes = list_of_panes (&obj_list, &menus, &names, &items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
213 Fcdr (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
214 } |
118 | 215 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
216 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
|
217 for (i = 0; i < number_of_panes; i++) |
118 | 218 { |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
219 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
|
220 i, items[i], menus[i]); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
221 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
|
222 fprintf (stderr, " Item %d %s\n", j, names[i][j]); |
118 | 223 } |
224 #endif | |
225 BLOCK_INPUT; | |
226 selection = xmenu_show (ROOT_WINDOW, XMenu_xpos, XMenu_ypos, names, menus, | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
227 items, number_of_panes, obj_list, title, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
228 &error_name); |
118 | 229 UNBLOCK_INPUT; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
230 /* fprintf (stderr, "selection = %x\n", selection); */ |
118 | 231 if (selection != NUL) |
232 { /* selected something */ | |
233 XMenu_return = selection; | |
234 } | |
235 else | |
236 { /* nothing selected */ | |
237 XMenu_return = Qnil; | |
238 } | |
239 /* now free up the strings */ | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
240 for (i = 0; i < number_of_panes; i++) |
118 | 241 { |
242 free (names[i]); | |
243 free (obj_list[i]); | |
244 } | |
245 free (menus); | |
246 free (obj_list); | |
247 free (names); | |
248 free (items); | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
249 /* free (title); */ |
118 | 250 if (error_name) error (error_name); |
251 return XMenu_return; | |
252 } | |
253 | |
254 struct indices { | |
255 int pane; | |
256 int line; | |
257 }; | |
258 | |
259 Lisp_Object | |
260 xmenu_show (parent, startx, starty, line_list, pane_list, line_cnt, | |
261 pane_cnt, item_list, title, error) | |
262 Window parent; | |
263 int startx, starty; /* upper left corner position BROKEN */ | |
264 char **line_list[]; /* list of strings for items */ | |
265 char *pane_list[]; /* list of pane titles */ | |
266 char *title; | |
267 int pane_cnt; /* total number of panes */ | |
268 Lisp_Object *item_list[]; /* All items */ | |
269 int line_cnt[]; /* Lines in each pane */ | |
270 char **error; /* Error returned */ | |
271 { | |
272 XMenu *GXMenu; | |
273 int last, panes, selidx, lpane, status; | |
274 int lines, sofar; | |
275 Lisp_Object entry; | |
276 /* struct indices *datap, *datap_save; */ | |
277 char *datap; | |
278 int ulx, uly, width, height; | |
279 int dispwidth, dispheight; | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
280 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
281 if (pane_cnt == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
282 return 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
283 |
118 | 284 *error = (char *) 0; /* Initialize error pointer to null */ |
285 GXMenu = XMenuCreate (XDISPLAY parent, "emacs"); | |
286 if (GXMenu == NUL) | |
287 { | |
288 *error = "Can't create menu"; | |
289 return (0); | |
290 } | |
291 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
292 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
|
293 lines += line_cnt[panes], panes++) |
118 | 294 ; |
295 /* 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
|
296 /* datap = (char *) xmalloc (lines * sizeof (char)); |
118 | 297 datap_save = datap;*/ |
298 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
299 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
|
300 sofar += line_cnt[panes], panes++) |
118 | 301 { |
302 /* create all the necessary panes */ | |
303 lpane = XMenuAddPane (XDISPLAY GXMenu, pane_list[panes], TRUE); | |
304 if (lpane == XM_FAILURE) | |
305 { | |
306 XMenuDestroy (XDISPLAY GXMenu); | |
307 *error = "Can't create pane"; | |
308 return (0); | |
309 } | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
310 for (selidx = 0; selidx < line_cnt[panes]; selidx++) |
118 | 311 { |
312 /* add the selection stuff to the menus */ | |
313 /* datap[selidx+sofar].pane = panes; | |
314 datap[selidx+sofar].line = selidx; */ | |
315 if (XMenuAddSelection (XDISPLAY GXMenu, lpane, 0, | |
316 line_list[panes][selidx], TRUE) | |
317 == XM_FAILURE) | |
318 { | |
319 XMenuDestroy (XDISPLAY GXMenu); | |
320 /* free (datap); */ | |
321 *error = "Can't add selection to menu"; | |
322 /* error ("Can't add selection to menu"); */ | |
323 return (0); | |
324 } | |
325 } | |
326 } | |
327 /* all set and ready to fly */ | |
328 XMenuRecompute (XDISPLAY GXMenu); | |
329 dispwidth = DisplayWidth (x_current_display, XDefaultScreen (x_current_display)); | |
330 dispheight = DisplayHeight (x_current_display, XDefaultScreen (x_current_display)); | |
331 startx = min (startx, dispwidth); | |
332 starty = min (starty, dispheight); | |
333 startx = max (startx, 1); | |
334 starty = max (starty, 1); | |
335 XMenuLocate (XDISPLAY GXMenu, 0, 0, startx, starty, | |
336 &ulx, &uly, &width, &height); | |
337 if (ulx+width > dispwidth) | |
338 { | |
339 startx -= (ulx + width) - dispwidth; | |
340 ulx = dispwidth - width; | |
341 } | |
342 if (uly+height > dispheight) | |
343 { | |
344 starty -= (uly + height) - dispheight; | |
345 uly = dispheight - height; | |
346 } | |
347 if (ulx < 0) startx -= ulx; | |
348 if (uly < 0) starty -= uly; | |
349 | |
350 XMenuSetFreeze (GXMenu, TRUE); | |
351 panes = selidx = 0; | |
352 | |
353 status = XMenuActivate (XDISPLAY GXMenu, &panes, &selidx, | |
354 startx, starty, ButtonReleaseMask, &datap); | |
355 switch (status) | |
356 { | |
357 case XM_SUCCESS: | |
358 #ifdef XDEBUG | |
359 fprintf (stderr, "pane= %d line = %d\n", panes, selidx); | |
360 #endif | |
361 entry = item_list[panes][selidx]; | |
362 break; | |
363 case XM_FAILURE: | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
364 /* free (datap_save); */ |
118 | 365 XMenuDestroy (XDISPLAY GXMenu); |
366 *error = "Can't activate menu"; | |
367 /* error ("Can't activate menu"); */ | |
368 case XM_IA_SELECT: | |
369 case XM_NO_SELECT: | |
370 entry = Qnil; | |
371 break; | |
372 } | |
373 XMenuDestroy (XDISPLAY GXMenu); | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
374 /* free (datap_save);*/ |
118 | 375 return (entry); |
376 } | |
377 | |
378 syms_of_xmenu () | |
379 { | |
380 defsubr (&Sx_popup_menu); | |
381 } | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
382 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
383 /* Construct the vectors that describe a menu |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
384 and store them in *VECTOR, *PANES, *NAMES and *ITEMS. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
385 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
|
386 Return the number of panes. |
118 | 387 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
388 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
|
389 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
390 int |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
391 keymap_panes (vector, panes, names, items, keymaps, nmaps) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
392 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
|
393 char ***panes; /* RETURN pane names */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
394 char ****names; /* RETURN all line names */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
395 int **items; /* RETURN number of items per pane */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
396 Lisp_Object *keymaps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
397 int nmaps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
398 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
399 /* Number of panes we have made. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
400 int p = 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
401 /* 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
|
402 int npanes_allocated = nmaps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
403 int mapno; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
404 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
405 if (npanes_allocated < 4) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
406 npanes_allocated = 4; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
407 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
408 /* 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
|
409 *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
|
410 *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
|
411 *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
|
412 *names = (char ***) xmalloc (npanes_allocated * sizeof (char **)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
413 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
414 /* 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
|
415 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
|
416 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
|
417 for (mapno = 0; mapno < nmaps; mapno++) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
418 single_keymap_panes (keymaps[mapno], panes, vector, names, items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
419 &p, &npanes_allocated, ""); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
420 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
421 /* Return the number of panes. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
422 return p; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
423 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
424 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
425 /* 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
|
426 It handles one keymap, KEYMAP. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
427 The other arguments are passed along |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
428 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
|
429 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
430 single_keymap_panes (keymap, panes, vector, names, items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
431 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
|
432 Lisp_Object keymap; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
433 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
|
434 char ***panes; /* RETURN pane names */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
435 char ****names; /* RETURN all line names */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
436 int **items; /* RETURN number of items per pane */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
437 int *p_ptr; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
438 int *npanes_allocated_ptr; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
439 char *pane_name; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
440 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
441 int i; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
442 Lisp_Object pending_maps; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
443 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
|
444 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
445 pending_maps = Qnil; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
446 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
447 /* 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
|
448 if (*p_ptr == *npanes_allocated_ptr) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
449 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
450 *npanes_allocated_ptr *= 2; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
451 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
452 *vector |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
453 = (Lisp_Object **) xrealloc (*vector, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
454 *npanes_allocated_ptr * sizeof (Lisp_Object *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
455 *panes |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
456 = (char **) xrealloc (*panes, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
457 *npanes_allocated_ptr * sizeof (char *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
458 *items |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
459 = (int *) xrealloc (*items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
460 *npanes_allocated_ptr * sizeof (int)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
461 *names |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
462 = (char ***) xrealloc (*names, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
463 *npanes_allocated_ptr * sizeof (char **)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
464 } |
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 /* 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
|
467 (*panes)[*p_ptr] = pane_name; |
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 /* 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
|
470 i = XFASTINT (Flength (keymap)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
471 |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
472 /* Add in lengths of any arrays. */ |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
473 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
|
474 if (XTYPE (XCONS (tail)->car) == Lisp_Vector) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
475 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
|
476 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
477 /* 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
|
478 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
|
479 (*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
|
480 (*names)[*p_ptr] = (char **) xmalloc (i * sizeof (char *)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
481 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
482 /* 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
|
483 i = 0; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
484 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
|
485 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
486 /* 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
|
487 make a menu item from it. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
488 item = XCONS (tail)->car; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
489 if (XTYPE (item) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
490 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
491 item1 = XCONS (item)->cdr; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
492 if (XTYPE (item1) == Lisp_Cons) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
493 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
494 item2 = XCONS (item1)->car; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
495 if (XTYPE (item2) == Lisp_String) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
496 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
497 Lisp_Object tem; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
498 tem = Fkeymapp (Fcdr (item1)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
499 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
500 pending_maps = Fcons (Fcons (Fcdr (item1), item2), |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
501 pending_maps); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
502 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
503 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
504 (*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
|
505 /* 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
|
506 (*vector)[*p_ptr][i] = XCONS (item)->car; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
507 i++; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
508 } |
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 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
511 } |
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
512 else if (XTYPE (item) == Lisp_Vector) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
513 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
514 /* 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
|
515 int len = XVECTOR (item)->size; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
516 int c; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
517 for (c = 0; c < len; c++) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
518 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
519 Lisp_Object character; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
520 XFASTINT (character) = c; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
521 item1 = XVECTOR (item)->contents[c]; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
522 if (XTYPE (item1) == Lisp_Cons) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
523 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
524 item2 = XCONS (item1)->car; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
525 if (XTYPE (item2) == Lisp_String) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
526 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
527 Lisp_Object tem; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
528 tem = Fkeymapp (Fcdr (item1)); |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
529 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
530 pending_maps = Fcons (Fcons (Fcdr (item1), item2), |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
531 pending_maps); |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
532 else |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
533 { |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
534 (*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
|
535 /* 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
|
536 (*vector)[*p_ptr][i] = character; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
537 i++; |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
538 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
539 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
540 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
541 } |
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
542 } |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
543 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
544 /* 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
|
545 (*items)[*p_ptr] = i; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
546 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
547 /* 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
|
548 if (i == 0) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
549 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
550 free ((*vector)[*p_ptr]); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
551 free ((*names)[*p_ptr]); |
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 /* Otherwise, advance past it. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
554 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
555 (*p_ptr)++; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
556 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
557 /* 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
|
558 while (!NILP (pending_maps)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
559 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
560 Lisp_Object elt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
561 elt = Fcar (pending_maps); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
562 single_keymap_panes (Fcar (elt), panes, vector, names, items, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
563 p_ptr, npanes_allocated_ptr, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
564 /* Add 1 to discard the @. */ |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
565 (char *) XSTRING (XCONS (elt)->cdr)->data + 1); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
566 pending_maps = Fcdr (pending_maps); |
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 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
569 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
570 /* Construct the vectors that describe a menu |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
571 and store them in *VECTOR, *PANES, *NAMES and *ITEMS. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
572 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
|
573 Return the number of panes. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
574 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
575 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
|
576 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
577 int |
118 | 578 list_of_panes (vector, panes, names, items, menu) |
579 Lisp_Object ***vector; /* RETURN all menu objects */ | |
580 char ***panes; /* RETURN pane names */ | |
581 char ****names; /* RETURN all line names */ | |
582 int **items; /* RETURN number of items per pane */ | |
583 Lisp_Object menu; | |
584 { | |
585 Lisp_Object tail, item, item1; | |
586 int i; | |
587 | |
588 if (XTYPE (menu) != Lisp_Cons) menu = wrong_type_argument (Qlistp, menu); | |
589 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
590 i = XFASTINT (Flength (menu)); |
118 | 591 |
592 *vector = (Lisp_Object **) xmalloc (i * sizeof (Lisp_Object *)); | |
593 *panes = (char **) xmalloc (i * sizeof (char *)); | |
594 *items = (int *) xmalloc (i * sizeof (int)); | |
595 *names = (char ***) xmalloc (i * sizeof (char **)); | |
596 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
597 for (i = 0, tail = menu; !NILP (tail); tail = Fcdr (tail), i++) |
118 | 598 { |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
599 item = Fcdr (Fcar (tail)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
600 if (XTYPE (item) != Lisp_Cons) (void) wrong_type_argument (Qlistp, item); |
118 | 601 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
602 fprintf (stderr, "list_of_panes check tail, i=%d\n", i); |
118 | 603 #endif |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
604 item1 = Fcar (Fcar (tail)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
605 CHECK_STRING (item1, 1); |
118 | 606 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
607 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
|
608 XSTRING (item1)->data); |
118 | 609 #endif |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
610 (*panes)[i] = (char *) XSTRING (item1)->data; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
611 (*items)[i] = list_of_items ((*vector)+i, (*names)+i, item); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
612 /* (*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
|
613 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
|
614 ; */ |
118 | 615 } |
616 return i; | |
617 } | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
618 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
619 /* Construct the lists of values and names for a single pane, from the |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
620 alist PANE. Put them in *VECTOR and *NAMES. |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
621 Return the number of items. */ |
118 | 622 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
623 int |
118 | 624 list_of_items (vector, names, pane) /* get list from emacs and put to vector */ |
625 Lisp_Object **vector; /* RETURN menu "objects" */ | |
626 char ***names; /* RETURN line names */ | |
627 Lisp_Object pane; | |
628 { | |
629 Lisp_Object tail, item, item1; | |
630 int i; | |
631 | |
632 if (XTYPE (pane) != Lisp_Cons) pane = wrong_type_argument (Qlistp, pane); | |
633 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
634 i = XFASTINT (Flength (pane, 1)); |
118 | 635 |
636 *vector = (Lisp_Object *) xmalloc (i * sizeof (Lisp_Object)); | |
637 *names = (char **) xmalloc (i * sizeof (char *)); | |
638 | |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
639 for (i = 0, tail = pane; !NILP (tail); tail = Fcdr (tail), i++) |
118 | 640 { |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
641 item = Fcar (tail); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
642 if (XTYPE (item) != Lisp_Cons) (void) wrong_type_argument (Qlistp, item); |
118 | 643 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
644 fprintf (stderr, "list_of_items check tail, i=%d\n", i); |
118 | 645 #endif |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
646 (*vector)[i] = Fcdr (item); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
647 item1 = Fcar (item); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
648 CHECK_STRING (item1, 1); |
118 | 649 #ifdef XDEBUG |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
650 fprintf (stderr, "list_of_items check item, i=%d%s\n", i, |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
651 XSTRING (item1)->data); |
118 | 652 #endif |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
653 (*names)[i] = (char *) XSTRING (item1)->data; |
118 | 654 } |
655 return i; | |
656 } |