Mercurial > emacs
annotate src/xmenu.c @ 1880:36ec0bfbb2c2
* informat.el (Info-tagify): Correct the regular expression which
recognizes node names to work properly with Emacs 19 regex.
| author | Jim Blandy <jimb@redhat.com> |
|---|---|
| date | Tue, 16 Feb 1993 00:23:06 +0000 |
| parents | 1463592a6463 |
| children | 63ba4f555b90 |
| 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" |
| 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\ |
|
1821
04fb1d3d6992
JimB's changes since January 18th
Jim Blandy <jimb@redhat.com>
parents:
1437
diff
changeset
|
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 } |
|
1437
36ef55ecb265
* frame.c (make_frame_without_minibuffer, Fwindow_frame): Use
Jim Blandy <jimb@redhat.com>
parents:
1304
diff
changeset
|
140 CHECK_LIVE_WINDOW (window, 0); |
| 118 | 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; | |
|
1828
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
226 { |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
227 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
|
228 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
|
229 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
|
230 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
|
231 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
|
232 |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
233 /* 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
|
234 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
|
235 &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
|
236 &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
|
237 |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
238 /* 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
|
239 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
|
240 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
|
241 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
|
242 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
|
243 &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
|
244 /* 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
|
245 abort (); |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
246 |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
247 selection = xmenu_show (root, XMenu_xpos, XMenu_ypos, names, menus, |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
248 items, number_of_panes, obj_list, title, |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
249 &error_name); |
|
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
250 } |
| 118 | 251 UNBLOCK_INPUT; |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
252 /* fprintf (stderr, "selection = %x\n", selection); */ |
| 118 | 253 if (selection != NUL) |
| 254 { /* selected something */ | |
| 255 XMenu_return = selection; | |
| 256 } | |
| 257 else | |
| 258 { /* nothing selected */ | |
| 259 XMenu_return = Qnil; | |
| 260 } | |
| 261 /* now free up the strings */ | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
262 for (i = 0; i < number_of_panes; i++) |
| 118 | 263 { |
| 264 free (names[i]); | |
| 265 free (obj_list[i]); | |
| 266 } | |
| 267 free (menus); | |
| 268 free (obj_list); | |
| 269 free (names); | |
| 270 free (items); | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
271 /* free (title); */ |
| 118 | 272 if (error_name) error (error_name); |
| 273 return XMenu_return; | |
| 274 } | |
| 275 | |
| 276 struct indices { | |
| 277 int pane; | |
| 278 int line; | |
| 279 }; | |
| 280 | |
| 281 Lisp_Object | |
| 282 xmenu_show (parent, startx, starty, line_list, pane_list, line_cnt, | |
| 283 pane_cnt, item_list, title, error) | |
| 284 Window parent; | |
| 285 int startx, starty; /* upper left corner position BROKEN */ | |
| 286 char **line_list[]; /* list of strings for items */ | |
| 287 char *pane_list[]; /* list of pane titles */ | |
| 288 char *title; | |
| 289 int pane_cnt; /* total number of panes */ | |
| 290 Lisp_Object *item_list[]; /* All items */ | |
| 291 int line_cnt[]; /* Lines in each pane */ | |
| 292 char **error; /* Error returned */ | |
| 293 { | |
| 294 XMenu *GXMenu; | |
| 295 int last, panes, selidx, lpane, status; | |
| 296 int lines, sofar; | |
| 297 Lisp_Object entry; | |
| 298 /* struct indices *datap, *datap_save; */ | |
| 299 char *datap; | |
| 300 int ulx, uly, width, height; | |
| 301 int dispwidth, dispheight; | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
302 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
303 if (pane_cnt == 0) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
304 return 0; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
305 |
| 118 | 306 *error = (char *) 0; /* Initialize error pointer to null */ |
| 307 GXMenu = XMenuCreate (XDISPLAY parent, "emacs"); | |
| 308 if (GXMenu == NUL) | |
| 309 { | |
| 310 *error = "Can't create menu"; | |
| 311 return (0); | |
| 312 } | |
| 313 | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
314 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
|
315 lines += line_cnt[panes], panes++) |
| 118 | 316 ; |
| 317 /* 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
|
318 /* datap = (char *) xmalloc (lines * sizeof (char)); |
| 118 | 319 datap_save = datap;*/ |
| 320 | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
321 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
|
322 sofar += line_cnt[panes], panes++) |
| 118 | 323 { |
| 324 /* create all the necessary panes */ | |
| 325 lpane = XMenuAddPane (XDISPLAY GXMenu, pane_list[panes], TRUE); | |
| 326 if (lpane == XM_FAILURE) | |
| 327 { | |
| 328 XMenuDestroy (XDISPLAY GXMenu); | |
| 329 *error = "Can't create pane"; | |
| 330 return (0); | |
| 331 } | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
332 for (selidx = 0; selidx < line_cnt[panes]; selidx++) |
| 118 | 333 { |
| 334 /* add the selection stuff to the menus */ | |
| 335 /* datap[selidx+sofar].pane = panes; | |
| 336 datap[selidx+sofar].line = selidx; */ | |
| 337 if (XMenuAddSelection (XDISPLAY GXMenu, lpane, 0, | |
| 338 line_list[panes][selidx], TRUE) | |
| 339 == XM_FAILURE) | |
| 340 { | |
| 341 XMenuDestroy (XDISPLAY GXMenu); | |
| 342 /* free (datap); */ | |
| 343 *error = "Can't add selection to menu"; | |
| 344 /* error ("Can't add selection to menu"); */ | |
| 345 return (0); | |
| 346 } | |
| 347 } | |
| 348 } | |
| 349 /* all set and ready to fly */ | |
| 350 XMenuRecompute (XDISPLAY GXMenu); | |
| 351 dispwidth = DisplayWidth (x_current_display, XDefaultScreen (x_current_display)); | |
| 352 dispheight = DisplayHeight (x_current_display, XDefaultScreen (x_current_display)); | |
| 353 startx = min (startx, dispwidth); | |
| 354 starty = min (starty, dispheight); | |
| 355 startx = max (startx, 1); | |
| 356 starty = max (starty, 1); | |
| 357 XMenuLocate (XDISPLAY GXMenu, 0, 0, startx, starty, | |
| 358 &ulx, &uly, &width, &height); | |
| 359 if (ulx+width > dispwidth) | |
| 360 { | |
| 361 startx -= (ulx + width) - dispwidth; | |
| 362 ulx = dispwidth - width; | |
| 363 } | |
| 364 if (uly+height > dispheight) | |
| 365 { | |
| 366 starty -= (uly + height) - dispheight; | |
| 367 uly = dispheight - height; | |
| 368 } | |
| 369 if (ulx < 0) startx -= ulx; | |
| 370 if (uly < 0) starty -= uly; | |
| 371 | |
| 372 XMenuSetFreeze (GXMenu, TRUE); | |
| 373 panes = selidx = 0; | |
| 374 | |
| 375 status = XMenuActivate (XDISPLAY GXMenu, &panes, &selidx, | |
| 376 startx, starty, ButtonReleaseMask, &datap); | |
| 377 switch (status) | |
| 378 { | |
| 379 case XM_SUCCESS: | |
| 380 #ifdef XDEBUG | |
| 381 fprintf (stderr, "pane= %d line = %d\n", panes, selidx); | |
| 382 #endif | |
| 383 entry = item_list[panes][selidx]; | |
| 384 break; | |
| 385 case XM_FAILURE: | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
386 /* free (datap_save); */ |
| 118 | 387 XMenuDestroy (XDISPLAY GXMenu); |
| 388 *error = "Can't activate menu"; | |
| 389 /* error ("Can't activate menu"); */ | |
| 390 case XM_IA_SELECT: | |
| 391 case XM_NO_SELECT: | |
| 392 entry = Qnil; | |
| 393 break; | |
| 394 } | |
| 395 XMenuDestroy (XDISPLAY GXMenu); | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
396 /* free (datap_save);*/ |
| 118 | 397 return (entry); |
| 398 } | |
| 399 | |
| 400 syms_of_xmenu () | |
| 401 { | |
| 402 defsubr (&Sx_popup_menu); | |
| 403 } | |
|
1082
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 /* 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
|
406 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
|
407 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
|
408 Return the number of panes. |
| 118 | 409 |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
410 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
|
411 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
412 int |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
413 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
|
414 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
|
415 char ***panes; /* RETURN pane names */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
416 char ****names; /* RETURN all line names */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
417 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
|
418 Lisp_Object *keymaps; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
419 int nmaps; |
|
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 /* Number of panes we have made. */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
422 int p = 0; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
423 /* 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
|
424 int npanes_allocated = nmaps; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
425 int mapno; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
426 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
427 if (npanes_allocated < 4) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
428 npanes_allocated = 4; |
|
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 /* 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
|
431 *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
|
432 *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
|
433 *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
|
434 *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
|
435 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
436 /* 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
|
437 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
|
438 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
|
439 for (mapno = 0; mapno < nmaps; mapno++) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
440 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
|
441 &p, &npanes_allocated, ""); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
442 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
443 /* Return the number of panes. */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
444 return p; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
445 } |
|
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 /* 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
|
448 It handles one keymap, KEYMAP. |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
449 The other arguments are passed along |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
450 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
|
451 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
452 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
|
453 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
|
454 Lisp_Object keymap; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
455 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
|
456 char ***panes; /* RETURN pane names */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
457 char ****names; /* RETURN all line names */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
458 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
|
459 int *p_ptr; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
460 int *npanes_allocated_ptr; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
461 char *pane_name; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
462 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
463 int i; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
464 Lisp_Object pending_maps; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
465 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
|
466 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
467 pending_maps = Qnil; |
|
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 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
|
470 if (*p_ptr == *npanes_allocated_ptr) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
471 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
472 *npanes_allocated_ptr *= 2; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
473 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
474 *vector |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
475 = (Lisp_Object **) xrealloc (*vector, |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
476 *npanes_allocated_ptr * sizeof (Lisp_Object *)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
477 *panes |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
478 = (char **) xrealloc (*panes, |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
479 *npanes_allocated_ptr * sizeof (char *)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
480 *items |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
481 = (int *) xrealloc (*items, |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
482 *npanes_allocated_ptr * sizeof (int)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
483 *names |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
484 = (char ***) xrealloc (*names, |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
485 *npanes_allocated_ptr * sizeof (char **)); |
|
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 /* 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
|
489 (*panes)[*p_ptr] = pane_name; |
|
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 /* 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
|
492 i = XFASTINT (Flength (keymap)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
493 |
|
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
494 /* Add in lengths of any arrays. */ |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
495 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
|
496 if (XTYPE (XCONS (tail)->car) == Lisp_Vector) |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
497 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
|
498 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
499 /* 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
|
500 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
|
501 (*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
|
502 (*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
|
503 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
504 /* 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
|
505 i = 0; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
506 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
|
507 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
508 /* 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
|
509 make a menu item from it. */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
510 item = XCONS (tail)->car; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
511 if (XTYPE (item) == Lisp_Cons) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
512 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
513 item1 = XCONS (item)->cdr; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
514 if (XTYPE (item1) == Lisp_Cons) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
515 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
516 item2 = XCONS (item1)->car; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
517 if (XTYPE (item2) == Lisp_String) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
518 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
519 Lisp_Object tem; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
520 tem = Fkeymapp (Fcdr (item1)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
521 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
|
522 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
|
523 pending_maps); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
524 else |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
525 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
526 (*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
|
527 /* 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
|
528 (*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
|
529 i++; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
530 } |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
531 } |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
532 } |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
533 } |
|
1213
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
534 else if (XTYPE (item) == Lisp_Vector) |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
535 { |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
536 /* 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
|
537 int len = XVECTOR (item)->size; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
538 int c; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
539 for (c = 0; c < len; c++) |
|
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 Lisp_Object character; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
542 XFASTINT (character) = c; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
543 item1 = XVECTOR (item)->contents[c]; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
544 if (XTYPE (item1) == Lisp_Cons) |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
545 { |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
546 item2 = XCONS (item1)->car; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
547 if (XTYPE (item2) == Lisp_String) |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
548 { |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
549 Lisp_Object tem; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
550 tem = Fkeymapp (Fcdr (item1)); |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
551 if (XSTRING (item2)->data[0] == '@' && !NILP (tem)) |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
552 pending_maps = Fcons (Fcons (Fcdr (item1), item2), |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
553 pending_maps); |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
554 else |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
555 { |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
556 (*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
|
557 /* 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
|
558 (*vector)[*p_ptr][i] = character; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
559 i++; |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
560 } |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
561 } |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
562 } |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
563 } |
|
0901fe62d97b
(single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents:
1210
diff
changeset
|
564 } |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
565 } |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
566 /* 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
|
567 (*items)[*p_ptr] = i; |
|
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 /* 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
|
570 if (i == 0) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
571 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
572 free ((*vector)[*p_ptr]); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
573 free ((*names)[*p_ptr]); |
|
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 /* Otherwise, advance past it. */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
576 else |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
577 (*p_ptr)++; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
578 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
579 /* 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
|
580 while (!NILP (pending_maps)) |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
581 { |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
582 Lisp_Object elt; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
583 elt = Fcar (pending_maps); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
584 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
|
585 p_ptr, npanes_allocated_ptr, |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
586 /* Add 1 to discard the @. */ |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
587 (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
|
588 pending_maps = Fcdr (pending_maps); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
589 } |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
590 } |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
591 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
592 /* 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
|
593 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
|
594 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
|
595 Return the number of panes. |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
596 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
597 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
|
598 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
599 int |
| 118 | 600 list_of_panes (vector, panes, names, items, menu) |
| 601 Lisp_Object ***vector; /* RETURN all menu objects */ | |
| 602 char ***panes; /* RETURN pane names */ | |
| 603 char ****names; /* RETURN all line names */ | |
| 604 int **items; /* RETURN number of items per pane */ | |
| 605 Lisp_Object menu; | |
| 606 { | |
| 607 Lisp_Object tail, item, item1; | |
| 608 int i; | |
| 609 | |
| 610 if (XTYPE (menu) != Lisp_Cons) menu = wrong_type_argument (Qlistp, menu); | |
| 611 | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
612 i = XFASTINT (Flength (menu)); |
| 118 | 613 |
| 614 *vector = (Lisp_Object **) xmalloc (i * sizeof (Lisp_Object *)); | |
| 615 *panes = (char **) xmalloc (i * sizeof (char *)); | |
| 616 *items = (int *) xmalloc (i * sizeof (int)); | |
| 617 *names = (char ***) xmalloc (i * sizeof (char **)); | |
| 618 | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
619 for (i = 0, tail = menu; !NILP (tail); tail = Fcdr (tail), i++) |
| 118 | 620 { |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
621 item = Fcdr (Fcar (tail)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
622 if (XTYPE (item) != Lisp_Cons) (void) wrong_type_argument (Qlistp, item); |
| 118 | 623 #ifdef XDEBUG |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
624 fprintf (stderr, "list_of_panes check tail, i=%d\n", i); |
| 118 | 625 #endif |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
626 item1 = Fcar (Fcar (tail)); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
627 CHECK_STRING (item1, 1); |
| 118 | 628 #ifdef XDEBUG |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
629 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
|
630 XSTRING (item1)->data); |
| 118 | 631 #endif |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
632 (*panes)[i] = (char *) XSTRING (item1)->data; |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
633 (*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
|
634 /* (*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
|
635 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
|
636 ; */ |
| 118 | 637 } |
| 638 return i; | |
| 639 } | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
640 |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
641 /* 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
|
642 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
|
643 Return the number of items. */ |
| 118 | 644 |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
645 int |
| 118 | 646 list_of_items (vector, names, pane) /* get list from emacs and put to vector */ |
| 647 Lisp_Object **vector; /* RETURN menu "objects" */ | |
| 648 char ***names; /* RETURN line names */ | |
| 649 Lisp_Object pane; | |
| 650 { | |
| 651 Lisp_Object tail, item, item1; | |
| 652 int i; | |
| 653 | |
| 654 if (XTYPE (pane) != Lisp_Cons) pane = wrong_type_argument (Qlistp, pane); | |
| 655 | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
656 i = XFASTINT (Flength (pane, 1)); |
| 118 | 657 |
| 658 *vector = (Lisp_Object *) xmalloc (i * sizeof (Lisp_Object)); | |
| 659 *names = (char **) xmalloc (i * sizeof (char *)); | |
| 660 | |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
661 for (i = 0, tail = pane; !NILP (tail); tail = Fcdr (tail), i++) |
| 118 | 662 { |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
663 item = Fcar (tail); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
664 if (XTYPE (item) != Lisp_Cons) (void) wrong_type_argument (Qlistp, item); |
| 118 | 665 #ifdef XDEBUG |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
666 fprintf (stderr, "list_of_items check tail, i=%d\n", i); |
| 118 | 667 #endif |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
668 (*vector)[i] = Fcdr (item); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
669 item1 = Fcar (item); |
|
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
670 CHECK_STRING (item1, 1); |
| 118 | 671 #ifdef XDEBUG |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
672 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
|
673 XSTRING (item1)->data); |
| 118 | 674 #endif |
|
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
675 (*names)[i] = (char *) XSTRING (item1)->data; |
| 118 | 676 } |
| 677 return i; | |
| 678 } |
