annotate src/xmenu.c @ 6018:51d9a0c72a29

(single_keymap_panes): Properly skip help-string if any. Rename item2 to item_string. GCPRO some things. (menu_item_equiv_key): Use either VECTORP or STRINGP, not both.
author Richard M. Stallman <rms@gnu.org>
date Mon, 21 Feb 1994 06:46:09 +0000
parents 4cd71c48281f
children 662b9cd767fe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* X Communication module for terminals which understand the X protocol.
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
2 Copyright (C) 1986, 1988, 1993, 1994 Free Software Foundation, Inc.
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
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
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 any later version.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU General Public License for more details.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20 /* X pop-up deck-of-cards menu facility for gnuemacs.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21 *
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 * Written by Jon Arnold and Roman Budzianowski
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 * Mods and rewrite by Robert Krawitz
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 *
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
27 /* Modified by Fred Pierresteguy on December 93
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
28 to make the popup menus and menubar use the Xt. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
29
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 #include <stdio.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 /* On 4.3 this loses if it comes after xterm.h. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 #include <signal.h>
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4627
diff changeset
34 #include <config.h>
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 #include "lisp.h"
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
36 #include "termhooks.h"
770
4de9c9a62bda entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
37 #include "frame.h"
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 #include "window.h"
1304
93d55019750e * xmenu.c: #include "keyboard.h".
Jim Blandy <jimb@redhat.com>
parents: 1213
diff changeset
39 #include "keyboard.h"
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
40 #include "blockinput.h"
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 /* This may include sys/types.h, and that somehow loses
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 if this is not done before the other system files. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 #include "xterm.h"
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 /* Load sys/types.h if not already loaded.
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 In some systems loading it twice is suicidal. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 #ifndef makedev
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 #include <sys/types.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 #endif
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 #include "dispextern.h"
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 #ifdef HAVE_X11
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 #include "../oldXMenu/XMenu.h"
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 #else
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 #include <X/XMenu.h>
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 #endif
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
60 #ifdef USE_X_TOOLKIT
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
61 #include <X11/Xlib.h>
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
62 #include <X11/IntrinsicP.h>
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
63 #include <X11/CoreP.h>
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
64 #include <X11/StringDefs.h>
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
65 #include <X11/Xaw/Paned.h>
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
66 #include "../lwlib/lwlib.h"
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
67 #include "../lwlib/xlwmenuP.h"
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
68 #endif /* USE_X_TOOLKIT */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
69
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 #define min(x,y) (((x) < (y)) ? (x) : (y))
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 #define max(x,y) (((x) > (y)) ? (x) : (y))
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 #define NUL 0
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 #ifndef TRUE
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 #define TRUE 1
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 #define FALSE 0
3270
0c9a88fe24c9 * sysdep.c (sys_siglist): Comment out #endif trailer.
Jim Blandy <jimb@redhat.com>
parents: 2961
diff changeset
78 #endif /* TRUE */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 #ifdef HAVE_X11
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 extern Display *x_current_display;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 #else
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 #define ButtonReleaseMask ButtonReleased
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 #endif /* not HAVE_X11 */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85
2514
6700e25af205 Since Qmenu_enable is used by non-X-specific code, it shouldn't be
Jim Blandy <jimb@redhat.com>
parents: 2439
diff changeset
86 extern Lisp_Object Qmenu_enable;
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
87 extern Lisp_Object Qmenu_bar;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 Lisp_Object xmenu_show ();
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 extern int x_error_handler ();
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
90 #ifdef USE_X_TOOLKIT
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
91 static widget_value *set_menu_items ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
92 static int string_width ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
93 static void free_menu_items ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
94 #endif
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
95
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
96 /* we need a unique id for each popup menu and dialog box */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
97 unsigned int popup_id_tick;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 /*************************************************************/
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101 #if 0
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 /* Ignoring the args is easiest. */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 xmenu_quit ()
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 error ("Unknown XMenu error");
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 #endif
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
109
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110 DEFUN ("x-popup-menu",Fx_popup_menu, Sx_popup_menu, 1, 2, 0,
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 "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
112 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
113 or a list ((XOFFSET YOFFSET) WINDOW)\n\
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 where XOFFSET and YOFFSET are positions in characters from the top left\n\
2147
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
115 corner of WINDOW's frame. (WINDOW may be a frame object instead of a window.)\n\
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 This controls the position of the center of the first line\n\
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 in the first pane of the menu, not the top left of the menu as a whole.\n\
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 \n\
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
119 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
120 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
121 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
122 \(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
123 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
124 You can also use a list of keymaps as MENU.\n\
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
125 Then each keymap makes a separate pane.\n\
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
126 When MENU is a keymap or a list of keymaps, the return value\n\
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
127 is a list of events.\n\n\
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
128 Alternatively, you can specify a menu of multiple panes\n\
2191
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
129 with a list of the form (TITLE PANE1 PANE2...),\n\
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
130 where each pane is a list of form (TITLE ITEM1 ITEM2...).\n\
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
131 Each ITEM is normally a cons cell (STRING . VALUE);\n\
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
132 but a string can appear as an item--that makes a nonselectable line\n\
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
133 in the menu.\n\
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
134 With this form of menu, the return value is VALUE from the chosen item.")
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
135 (position, menu)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
136 Lisp_Object position, menu;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 {
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
138 int number_of_panes, panes;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
139 Lisp_Object XMenu_return, keymap, tem;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 int XMenu_xpos, XMenu_ypos;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 char **menus;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 char ***names;
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
143 int **enables;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 Lisp_Object **obj_list;
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
145 Lisp_Object *prefixes;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 int *items;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 char *title;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148 char *error_name;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
149 Lisp_Object ltitle, selection;
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
150 int i, j, menubarp = 0;
770
4de9c9a62bda entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
151 FRAME_PTR f;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
152 Lisp_Object x, y, window;
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
153 #ifdef USE_X_TOOLKIT
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
154 widget_value *val, *vw = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
155 #endif /* USE_X_TOOLKIT */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156
5949
f394f25efb3c (Fx_popup_menu): Likewise.
Karl Heuer <kwzh@gnu.org>
parents: 5897
diff changeset
157 check_x ();
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
158 /* 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
159 tem = Fcar (position);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
160 if (XTYPE (tem) == Lisp_Cons)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
161 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
162 window = Fcar (Fcdr (position));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
163 x = Fcar (tem);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
164 y = Fcar (Fcdr (tem));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
165 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
166 else
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
167 {
2153
42ceb87b43a1 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2147
diff changeset
168 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */
42ceb87b43a1 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2147
diff changeset
169 window = Fcar (tem); /* POSN_WINDOW (tem) */
42ceb87b43a1 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2147
diff changeset
170 tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
171 x = Fcar (tem);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
172 y = Fcdr (tem);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
173 }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 CHECK_NUMBER (x, 0);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 CHECK_NUMBER (y, 0);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
176
2147
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
177 if (XTYPE (window) == Lisp_Frame)
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
178 {
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
179 f = XFRAME (window);
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
180
2147
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
181 XMenu_xpos = 0;
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
182 XMenu_ypos = 0;
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
183 }
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
184 else if (XTYPE (window) == Lisp_Window)
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
185 {
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
186 CHECK_LIVE_WINDOW (window, 0);
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
187 f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
188
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
189 XMenu_xpos = FONT_WIDTH (f->display.x->font)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
190 * XWINDOW (window)->left;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
191 XMenu_ypos = FONT_HEIGHT (f->display.x->font)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
192 * XWINDOW (window)->top;
2147
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
193 }
3501
33a309357161 (Fx_popup_menu): Error if we don't get a window or a frame somehow.
Richard M. Stallman <rms@gnu.org>
parents: 3270
diff changeset
194 else
33a309357161 (Fx_popup_menu): Error if we don't get a window or a frame somehow.
Richard M. Stallman <rms@gnu.org>
parents: 3270
diff changeset
195 /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME,
33a309357161 (Fx_popup_menu): Error if we don't get a window or a frame somehow.
Richard M. Stallman <rms@gnu.org>
parents: 3270
diff changeset
196 but I don't want to make one now. */
33a309357161 (Fx_popup_menu): Error if we don't get a window or a frame somehow.
Richard M. Stallman <rms@gnu.org>
parents: 3270
diff changeset
197 CHECK_WINDOW (window, 0);
2147
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
198
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
199 #ifdef USE_X_TOOLKIT
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
200 tem = Fcar (Fcdr (Fcar (Fcdr (position))));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
201 if (XTYPE (Fcar (position)) != Lisp_Cons
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
202 && CONSP (tem)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
203 && EQ (Fcar (tem), Qmenu_bar))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
204 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
205 /* We are in the menubar */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
206 XlwMenuWidget mw;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
207 int w1 = 0, w2;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
208
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
209 mw = (XlwMenuWidget)f->display.x->menubar_widget;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
210 menubarp = 1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
211 for (vw = mw->menu.old_stack [0]->contents; vw; vw = vw->next)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
212 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
213 w2 = w1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
214 w1 += string_width (mw, vw->name)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
215 + 2 * (mw->menu.horizontal_spacing +
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
216 mw->menu.shadow_thickness);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
217 if (XINT (x) < w1)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
218 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
219 XMenu_xpos = w2 + 4;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
220 XMenu_ypos = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
221 break;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
222 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
223 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
224 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
225 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
226 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
227 XMenu_xpos += FONT_WIDTH (f->display.x->font) * XINT (x);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
228 XMenu_ypos += FONT_HEIGHT (f->display.x->font) * XINT (y);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
229 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
230
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
231 BLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
232 XMenu_xpos += (f->display.x->widget->core.x
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
233 + f->display.x->widget->core.border_width);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
234 XMenu_ypos += (f->display.x->widget->core.y
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
235 + f->display.x->widget->core.border_width
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
236 + f->display.x->menubar_widget->core.height);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
237 UNBLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
238
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
239 val = set_menu_items (menu, &prefixes, &panes, &names,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
240 &enables, &menus, &items, &number_of_panes, &obj_list,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
241 &title, &error_name);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
242 selection = xmenu_show (f, val, XMenu_xpos, XMenu_ypos,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
243 menubarp, vw);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
244
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
245 free_menu_items (names, enables, menus, items, number_of_panes, obj_list,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
246 title, error_name);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
247
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
248 if (selection != NUL)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
249 { /* selected something */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
250 XMenu_return = selection;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
251 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
252 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
253 { /* nothing selected */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
254 XMenu_return = Qnil;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
255 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
256
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
257 return XMenu_return;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
258
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
259 #else /* not USE_X_TOOLKIT */
4627
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
260 #ifdef HAVE_X11
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
261 {
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
262 Window child;
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
263 int win_x = 0, win_y = 0;
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
264
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
265 /* Find the position of the outside upper-left corner of
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
266 the inner window, with respect to the outer window. */
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
267 if (f->display.x->parent_desc != ROOT_WINDOW)
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
268 {
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
269 BLOCK_INPUT;
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
270 XTranslateCoordinates (x_current_display,
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
271
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
272 /* From-window, to-window. */
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
273 f->display.x->window_desc,
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
274 f->display.x->parent_desc,
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
275
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
276 /* From-position, to-position. */
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
277 0, 0, &win_x, &win_y,
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
278
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
279 /* Child of window. */
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
280 &child);
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
281 UNBLOCK_INPUT;
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
282 XMenu_xpos += win_x;
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
283 XMenu_ypos += win_y;
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
284 }
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
285 }
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
286 #endif /* HAVE_X11 */
4627
340c18d50337 (Fx_popup_menu): Adjust coords so they are relative to the inner window.
Richard M. Stallman <rms@gnu.org>
parents: 3747
diff changeset
287
2147
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
288 XMenu_xpos += FONT_WIDTH (f->display.x->font) * XINT (x);
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
289 XMenu_ypos += FONT_HEIGHT (f->display.x->font) * XINT (y);
1b6e54507323 (Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents: 2135
diff changeset
290
770
4de9c9a62bda entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
291 XMenu_xpos += f->display.x->left_pos;
4de9c9a62bda entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
292 XMenu_ypos += f->display.x->top_pos;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
294
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
295 keymap = Fkeymapp (menu);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
296 tem = Qnil;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
297 if (XTYPE (menu) == Lisp_Cons)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
298 tem = Fkeymapp (Fcar (menu));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
299 if (!NILP (keymap))
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
300 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
301 /* 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
302 Lisp_Object prompt;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
303 keymap = get_keymap (menu);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
304
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
305 /* 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
306 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
307 prompt = map_prompt (keymap);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
308 if (!NILP (prompt))
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
309 title = (char *) XSTRING (prompt)->data;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
310
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
311 /* Extract the detailed info to make one pane. */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
312 number_of_panes = keymap_panes (&obj_list, &menus, &names, &enables,
3747
6506b2fd475a (xmenu_show): Store 0 in *ERROR at the beginning.
Richard M. Stallman <rms@gnu.org>
parents: 3501
diff changeset
313 &items, &prefixes, &menu, 1);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
314 /* 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
315 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
316 if (menus[0] == 0)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
317 menus[0] = title;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
318 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
319 else if (!NILP (tem))
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
320 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
321 /* 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
322 Lisp_Object prompt;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
323 int nmaps = XFASTINT (Flength (menu));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
324 Lisp_Object *maps
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
325 = (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
326 int i;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
327 title = 0;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
328
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
329 /* 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
330 supplies the menu title. */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
331 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
332 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
333 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
334
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
335 prompt = map_prompt (keymap);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
336 if (title == 0 && !NILP (prompt))
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
337 title = (char *) XSTRING (prompt)->data;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
338 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
339
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
340 /* Extract the detailed info to make one pane. */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
341 number_of_panes = keymap_panes (&obj_list, &menus, &names, &enables,
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
342 &items, &prefixes, maps, nmaps);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
343 /* 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
344 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
345 if (menus[0] == 0)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
346 menus[0] = title;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
347 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
348 else
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
349 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
350 /* 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
351 ltitle = Fcar (menu);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
352 CHECK_STRING (ltitle, 1);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
353 title = (char *) XSTRING (ltitle)->data;
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
354 prefixes = 0;
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
355 number_of_panes = list_of_panes (&obj_list, &menus, &names, &enables,
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
356 &items, Fcdr (menu));
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
357 }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358 #ifdef XDEBUG
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
359 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
360 for (i = 0; i < number_of_panes; i++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 {
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
362 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
363 i, items[i], menus[i]);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
364 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
365 fprintf (stderr, " Item %d %s\n", j, names[i][j]);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 #endif
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
368
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 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
370 {
1463592a6463 * xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents: 1821
diff changeset
371 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
372 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
373 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
374 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
375 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
376
1463592a6463 * xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents: 1821
diff changeset
377 /* 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
378 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
379 &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
380 &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
381
1463592a6463 * xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents: 1821
diff changeset
382 /* 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
383 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
384 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
385 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
386 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
387 &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
388 /* 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
389 abort ();
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
390 selection = xmenu_show (root, XMenu_xpos, XMenu_ypos, names, enables,
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
391 menus, prefixes, items, number_of_panes, obj_list,
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
392 title, &error_name);
1828
1463592a6463 * xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents: 1821
diff changeset
393 }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 UNBLOCK_INPUT;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
395 /* fprintf (stderr, "selection = %x\n", selection); */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 if (selection != NUL)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 { /* selected something */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 XMenu_return = selection;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400 else
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 { /* nothing selected */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 XMenu_return = Qnil;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 /* now free up the strings */
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
405 for (i = 0; i < number_of_panes; i++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406 {
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
407 xfree (names[i]);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
408 xfree (enables[i]);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
409 xfree (obj_list[i]);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
410 }
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
411 xfree (menus);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
412 xfree (obj_list);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
413 xfree (names);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
414 xfree (enables);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
415 xfree (items);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
416 /* free (title); */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
417 if (error_name) error (error_name);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
418 return XMenu_return;
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
419 #endif /* not USE_X_TOOLKIT */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
420 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
421
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
422 #ifdef USE_X_TOOLKIT
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
423
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
424 static void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
425 dispatch_dummy_expose (w, x, y)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
426 Widget w;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
427 int x;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
428 int y;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
429 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
430 XExposeEvent dummy;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
431
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
432 dummy.type = Expose;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
433 dummy.window = XtWindow (w);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
434 dummy.count = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
435 dummy.serial = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
436 dummy.send_event = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
437 dummy.display = XtDisplay (w);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
438 dummy.x = x;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
439 dummy.y = y;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
440
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
441 XtDispatchEvent (&dummy);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
442 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
443
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
444 static int
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
445 string_width (mw, s)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
446 XlwMenuWidget mw;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
447 char* s;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
448 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
449 XCharStruct xcs;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
450 int drop;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
451
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
452 XTextExtents (mw->menu.font, s, strlen (s), &drop, &drop, &drop, &xcs);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
453 return xcs.width;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
454 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
455
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
456 static int
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
457 event_is_in_menu_item (mw, event, name, string_w)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
458 XlwMenuWidget mw;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
459 struct input_event *event;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
460 char *name;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
461 int *string_w;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
462 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
463 *string_w += string_width (mw, name)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
464 + 2 * (mw->menu.horizontal_spacing + mw->menu.shadow_thickness);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
465 return (XINT (event->x) < *string_w);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
466 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
467
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
468
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
469 Lisp_Object
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
470 map_event_to_object (event, f)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
471 struct input_event *event;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
472 FRAME_PTR f;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
473 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
474 int i,j, string_w;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
475 window_state* ws;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
476 XlwMenuWidget mw = (XlwMenuWidget) f->display.x->menubar_widget;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
477 widget_value *val;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
478
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
479
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
480 string_w = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
481 /* Find the window */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
482 for (val = mw->menu.old_stack [0]->contents; val; val = val->next)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
483 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
484 ws = &mw->menu.windows [0];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
485 if (ws && event_is_in_menu_item (mw, event, val->name, &string_w))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
486 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
487 Lisp_Object items;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
488 items = FRAME_MENU_BAR_ITEMS (f);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
489 for (; CONSP (items); items = XCONS (items)->cdr)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
490 if (!strcmp (val->name,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
491 XSTRING (Fcar (Fcdr (Fcar (items))))->data))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
492 return items;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
493 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
494 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
495 return Qnil;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
496 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
497
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
498 static widget_value *
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
499 set_menu_items (menu, prefixes, panes, names, enables, menus,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
500 items, number_of_panes, obj_list, title, error_name)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
501 Lisp_Object menu;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
502 Lisp_Object **prefixes;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
503 int *panes;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
504 char ***names[];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
505 int ***enables;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
506 char ***menus;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
507 int **items;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
508 int *number_of_panes;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
509 Lisp_Object ***obj_list;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
510 char **title;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
511 char **error_name;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
512 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
513 Lisp_Object keymap, tem;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
514 Lisp_Object ltitle, selection;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
515 int i, j;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
516 widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
517 int last, selidx, lpane, status;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
518 int lines, sofar;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
519
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
520 keymap = Fkeymapp (menu);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
521 tem = Qnil;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
522
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
523 if (XTYPE (menu) == Lisp_Cons)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
524 tem = Fkeymapp (Fcar (menu));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
525 if (!NILP (keymap))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
526 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
527 /* We were given a keymap. Extract menu info from the keymap. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
528 Lisp_Object prompt;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
529 keymap = get_keymap (menu);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
530
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
531 /* Search for a string appearing directly as an element of the keymap.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
532 That string is the title of the menu. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
533 prompt = map_prompt (keymap);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
534 if (!NILP (prompt))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
535 *title = (char *) XSTRING (prompt)->data;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
536
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
537 /* Extract the detailed info to make one pane. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
538 *number_of_panes = keymap_panes (obj_list, menus, names, enables,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
539 items, prefixes, menu, 1);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
540 /* The menu title seems to be ignored,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
541 so put it in the pane title. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
542 if ((*menus)[0] == 0)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
543 (*menus)[0] = *title;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
544 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
545 else if (!NILP (tem))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
546 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
547 /* We were given a list of keymaps. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
548 Lisp_Object prompt;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
549 int nmaps = XFASTINT (Flength (menu));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
550 Lisp_Object *maps
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
551 = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
552 int i;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
553 *title = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
554
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
555 /* The first keymap that has a prompt string
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
556 supplies the menu title. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
557 for (tem = menu, i = 0; XTYPE (tem) == Lisp_Cons; tem = Fcdr (tem))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
558 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
559 maps[i++] = keymap = get_keymap (Fcar (tem));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
560
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
561 prompt = map_prompt (keymap);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
562 if (*title == 0 && !NILP (prompt))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
563 *title = (char *) XSTRING (prompt)->data;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
564 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
565
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
566 /* Extract the detailed info to make one pane. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
567 *number_of_panes = keymap_panes (obj_list, menus, names, enables,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
568 items, prefixes, maps, nmaps);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
569 /* The menu title seems to be ignored,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
570 so put it in the pane title. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
571 if ((*menus)[0] == 0)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
572 (*menus)[0] = *title;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
573 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
574 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
575 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
576 /* We were given an old-fashioned menu. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
577 ltitle = Fcar (menu);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
578 CHECK_STRING (ltitle, 1);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
579 *title = (char *) XSTRING (ltitle)->data;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
580 *prefixes = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
581 *number_of_panes = list_of_panes (obj_list, menus, names, enables,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
582 items, Fcdr (menu));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
583 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
584
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
585 *error_name = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
586 if (*number_of_panes == 0)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
587 return 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
588
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
589 *error_name = (char *) 0; /* Initialize error pointer to null */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
590
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
591 wv = malloc_widget_value ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
592 wv->name = "menu";
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
593 wv->value = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
594 wv->enabled = 1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
595 first_wv = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
596
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
597 for (*panes = 0, lines = 0; *panes < *number_of_panes;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
598 lines += (*items)[*panes], (*panes)++)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
599 ;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
600 /* datap = (struct indices *) xmalloc (lines * sizeof (struct indices)); */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
601 /* datap = (char *) xmalloc (lines * sizeof (char));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
602 datap_save = datap;*/
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
603
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
604 for (*panes = 0, sofar = 0; *panes < *number_of_panes;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
605 sofar += (*items)[*panes], (*panes)++)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
606 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
607 if (strcmp((*menus)[*panes], ""))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
608 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
609 wv = malloc_widget_value ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
610 if (save_wv)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
611 save_wv->next = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
612 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
613 first_wv->contents = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
614 wv->name = (*menus)[*panes];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
615 wv->value = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
616 wv->enabled = 1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
617 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
618 prev_wv = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
619 save_wv = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
620
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
621 for (selidx = 0; selidx < (*items)[*panes]; selidx++)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
622 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
623 wv = malloc_widget_value ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
624 if (prev_wv)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
625 prev_wv->next = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
626 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
627 save_wv->contents = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
628 wv->name = (*names)[*panes][selidx];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
629 wv->value = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
630 selection = (*obj_list)[*panes][selidx];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
631 if (*prefixes != 0)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
632 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
633 selection = Fcons (selection, Qnil);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
634 if (!NILP ((*prefixes)[*panes]))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
635 selection = Fcons ((*prefixes)[*panes], selection);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
636 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
637 wv->call_data = LISP_TO_VOID(selection);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
638 wv->enabled = (*enables)[*panes][selidx];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
639 prev_wv = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
640 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
641 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
642
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
643 return (first_wv);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
644 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
645
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
646 static void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
647 free_menu_items (names, enables, menus, items, number_of_panes,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
648 obj_list, title, error_name)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
649 char **names[];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
650 int *enables[];
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
651 char **menus;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
652 int *items;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
653 int number_of_panes;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
654 Lisp_Object **obj_list;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
655 char *title;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
656 char *error_name;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
657 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
658 int i;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
659 /* now free up the strings */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
660 for (i = 0; i < number_of_panes; i++)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
661 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
662 xfree (names[i]);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
663 xfree (enables[i]);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
664 xfree (obj_list[i]);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
665 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
666 xfree (menus);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
667 xfree (obj_list);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
668 xfree (names);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
669 xfree (enables);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
670 xfree (items);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
671 /* free (title); */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
672 if (error_name) error (error_name);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
674 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
675
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
676 static Lisp_Object menu_item_selection;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
677
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
678 static void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
679 popup_selection_callback (widget, id, client_data)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
680 Widget widget;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
681 LWLIB_ID id;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
682 XtPointer client_data;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
683 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
684 VOID_TO_LISP (menu_item_selection, client_data);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
685 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
686
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
687 static void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
688 popup_down_callback (widget, id, client_data)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
689 Widget widget;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
690 LWLIB_ID id;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
691 XtPointer client_data;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
692 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
693 BLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
694 lw_destroy_all_widgets (id);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
695 UNBLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
696 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
697
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
698 /* This recursively calls free_widget_value() on the tree of widgets.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
699 It must free all data that was malloc'ed for these widget_values.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
700 Currently, emacs only allocates new storage for the `key' slot.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
701 All other slots are pointers into the data of Lisp_Strings, and
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
702 must be left alone.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
703 */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
704 void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
705 free_menubar_widget_value_tree (wv)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
706 widget_value *wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
707 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
708 if (! wv) return;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
709 if (wv->key) xfree (wv->key);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
710
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
711 wv->name = wv->value = wv->key = (char *) 0xDEADBEEF;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
712
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
713 if (wv->contents && (wv->contents != (widget_value*)1))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
714 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
715 free_menubar_widget_value_tree (wv->contents);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
716 wv->contents = (widget_value *) 0xDEADBEEF;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
717 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
718 if (wv->next)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
719 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
720 free_menubar_widget_value_tree (wv->next);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
721 wv->next = (widget_value *) 0xDEADBEEF;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
722 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
723 BLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
724 free_widget_value (wv);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
725 UNBLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
726 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
727
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
728 static void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
729 update_one_frame_psheets (f)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
730 FRAME_PTR f;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
731 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
732 struct x_display *x = f->display.x;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
733
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
734 int menubar_changed;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
735
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
736 menubar_changed = (x->menubar_widget
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
737 && !XtIsManaged (x->menubar_widget));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
738
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
739 if (! (menubar_changed))
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
740 return;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
741
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
742 BLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
743 XawPanedSetRefigureMode (x->column_widget, 0);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
744
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
745 /* the order in which children are managed is the top to
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
746 bottom order in which they are displayed in the paned window.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
747 First, remove the text-area widget.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
748 */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
749 XtUnmanageChild (x->edit_widget);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
750
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
751 /* remove the menubar that is there now, and put up the menubar that
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
752 should be there.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
753 */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
754 if (menubar_changed)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
755 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
756 XtManageChild (x->menubar_widget);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
757 XtMapWidget (x->menubar_widget);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
758 XtVaSetValues (x->menubar_widget, XtNmappedWhenManaged, 1, 0);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
759 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
760
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
761
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
762 /* Re-manage the text-area widget */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
763 XtManageChild (x->edit_widget);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
764
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
765 /* and now thrash the sizes */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
766 XawPanedSetRefigureMode (x->column_widget, 1);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
767 UNBLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
768 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
769
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
770 void
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
771 set_frame_menubar (f)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
772 FRAME_PTR f;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
773 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
774 Widget menubar_widget = f->display.x->menubar_widget;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
775 int id = (int) f;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
776 Lisp_Object tail;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
777 widget_value *wv, *save_wv, *first_wv, *prev_wv = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
778
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
779 BLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
780
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
781 wv = malloc_widget_value ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
782 wv->name = "menubar";
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
783 wv->value = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
784 wv->enabled = 1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
785 save_wv = first_wv = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
786
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
787
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
788 for (tail = FRAME_MENU_BAR_ITEMS (f); CONSP (tail); tail = XCONS (tail)->cdr)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
789 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
790 Lisp_Object string;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
791
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
792 string = Fcar (Fcdr (Fcar (tail)));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
793
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
794 wv = malloc_widget_value ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
795 if (prev_wv)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
796 prev_wv->next = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
797 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
798 save_wv->contents = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
799 wv->name = XSTRING (string)->data;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
800 wv->value = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
801 wv->enabled = 1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
802 prev_wv = wv;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
803 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
804
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
805 if (menubar_widget)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
806 lw_modify_all_widgets (id, first_wv, False);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
807 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
808 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
809 menubar_widget = lw_create_widget ("menubar", "menubar",
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
810 id, first_wv,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
811 f->display.x->column_widget,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
812 0, 0,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
813 0, 0);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
814 f->display.x->menubar_widget = menubar_widget;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
815 XtVaSetValues (menubar_widget,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
816 XtNshowGrip, 0,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
817 XtNresizeToPreferred, 1,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
818 XtNallowResize, 1,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
819 0);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
820 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
821
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
822 free_menubar_widget_value_tree (first_wv);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
823
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
824 update_one_frame_psheets (f);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
825
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
826 UNBLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
827 }
5897
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
828
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
829 void
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
830 free_frame_menubar (f)
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
831 FRAME_PTR f;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
832 {
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
833 Widget menubar_widget;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
834 int id;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
835
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
836 menubar_widget = f->display.x->menubar_widget;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
837 id = (int) f;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
838
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
839 if (menubar_widget)
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
840 {
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
841 BLOCK_INPUT;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
842 lw_destroy_all_widgets (id);
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
843 UNBLOCK_INPUT;
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
844 }
5a68abc8f1f9 (free_frame_menubar) [USE_X_TOOLKIT]. New function to destroy the X Widget
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5896
diff changeset
845 }
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
846 #endif /* USE_X_TOOLKIT */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
847
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
848 struct indices {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
849 int pane;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
850 int line;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
851 };
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
853 extern void process_expose_from_menu ();
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
854
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
855 #ifdef USE_X_TOOLKIT
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
856 extern XtAppContext Xt_app_con;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
857
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
858 Lisp_Object
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
859 xmenu_show (f, val, x, y, menubarp, vw)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
860 FRAME_PTR f;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
861 widget_value *val;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
862 int x;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
863 int y;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
864 int menubarp;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
865 widget_value *vw;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
866 {
5865
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
867 int menu_id, item_length;
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
868 Lisp_Object selection;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
869 Widget menu;
5865
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
870 XlwMenuWidget menuw = (XlwMenuWidget) f->display.x->menubar_widget;
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
871
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
872 /*
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
873 * Define and allocate a foreign event queue to hold events
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
874 * that don't belong to XMenu. These events are later restored
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
875 * to the X event queue.
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
876 */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
877 typedef struct _xmeventque
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
878 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
879 XEvent event;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
880 struct _xmeventque *next;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
881 } XMEventQue;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
882
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
883 XMEventQue *feq = NULL; /* Foreign event queue. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
884 XMEventQue *feq_tmp; /* Foreign event queue temporary. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
885
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
886 BLOCK_INPUT;
5896
b20145eafe0c (xmenu_show) [USE_X_TOOLKIT]: return Qnil when val is null.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5881
diff changeset
887 if (val == 0) return Qnil;
b20145eafe0c (xmenu_show) [USE_X_TOOLKIT]: return Qnil when val is null.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5881
diff changeset
888
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
889 menu_id = ++popup_id_tick;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
890 menu = lw_create_widget ("popup", val->name, menu_id, val,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
891 f->display.x->widget, 1, 0,
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
892 popup_selection_callback, popup_down_callback);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
893 free_menubar_widget_value_tree (val);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
894
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
895 /* reset the selection */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
896 menu_item_selection = Qnil;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
897
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
898 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
899 XButtonPressedEvent dummy;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
900 XlwMenuWidget mw;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
901
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
902 mw = ((XlwMenuWidget)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
903 ((CompositeWidget)menu)->composite.children[0]);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
904
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
905 dummy.type = ButtonPress;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
906 dummy.serial = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
907 dummy.send_event = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
908 dummy.display = XtDisplay (menu);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
909 dummy.window = XtWindow (XtParent (menu));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
910 dummy.time = CurrentTime;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
911 dummy.button = 0;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
912 dummy.x_root = x;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
913 dummy.y_root = y;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
914
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
915 if (menubarp)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
916 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
917 vw->call_data = (XtPointer) 1;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
918 dispatch_dummy_expose (f->display.x->menubar_widget, x, y);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
919 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
920
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
921
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
922 /* We activate directly the lucid implementation */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
923 pop_up_menu (mw, &dummy);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
924 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
925
5865
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
926 if (menubarp)
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
927 {
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
928 item_length = (x + string_width (menuw, vw->name)
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
929 + (2 * (menuw->menu.horizontal_spacing
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
930 + menuw->menu.shadow_thickness))
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
931 - 4);
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
932 }
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
933
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
934 /* Enters XEvent loop */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
935 while (1)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
936 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
937
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
938 XEvent event;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
939 XtAppNextEvent (Xt_app_con, &event);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
940 if (event.type == ButtonRelease)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
941 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
942 XtDispatchEvent (&event);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
943 break;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
944 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
945 else
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
946 if (event.type == Expose)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
947 process_expose_from_menu (event);
5865
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
948 else
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
949 if (event.type == MotionNotify
5881
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
950 && menubarp
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
951 && ((event.xmotion.y_root
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
952 >= (f->display.x->widget->core.y
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
953 + f->display.x->widget->core.border_width))
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
954 && (event.xmotion.y_root
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
955 < (f->display.x->widget->core.y
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
956 + f->display.x->widget->core.border_width
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
957 + f->display.x->menubar_widget->core.height)))
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
958 && ((event.xmotion.x_root
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
959 >= (f->display.x->widget->core.x
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
960 + f->display.x->widget->core.border_width))
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
961 && (event.xmotion.x_root
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
962 < (f->display.x->widget->core.x
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
963 + f->display.x->widget->core.border_width
678a8470e4d1 (xmenu_show) [USE_X_TOOLKIT]: Test event.xmotion.x_root in the MotionNotify
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5865
diff changeset
964 + f->display.x->widget->core.width)))
5865
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
965 && (event.xmotion.x_root >= item_length
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
966 || event.xmotion.x_root < (x - 4)))
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
967 {
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
968 BLOCK_INPUT;
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
969 XtUngrabPointer ((Widget)
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
970 ((XlwMenuWidget)
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
971 ((CompositeWidget)menu)->composite.children[0]),
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
972 event.xbutton.time);
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
973 lw_destroy_all_widgets (menu_id);
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
974 UNBLOCK_INPUT;
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
975
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
976 event.type = ButtonPress;
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
977 event.xbutton.time = CurrentTime;
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
978 event.xbutton.button = Button1;
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
979 event.xbutton.window = XtWindow (f->display.x->menubar_widget);
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
980 event.xbutton.x = (event.xbutton.x_root
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
981 - (f->display.x->widget->core.x
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
982 + f->display.x->widget->core.border_width));
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
983 XPutBackEvent (XDISPLAY &event);
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
984 break;
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
985 }
8dc616f310e8 (xmenu_show ) [USE_X_TOOLKIT]: Implement a Motif behavior for the menubar. Now,
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5809
diff changeset
986
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
987 XtDispatchEvent (&event);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
988 feq_tmp = (XMEventQue *) malloc (sizeof (XMEventQue));
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
989
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
990 if (feq_tmp == NULL)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
991 return(Qnil);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
992
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
993 feq_tmp->event = event;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
994 feq_tmp->next = feq;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
995 feq = feq_tmp;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
996 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
997
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
998 if (menubarp)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
999 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1000 vw->call_data = (XtPointer) 0;
5775
07a36e38e514 (xmenu_show) [USE_X_TOOLKIT]: Remove the #if 0 directives and reverse one to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents: 5673
diff changeset
1001 dispatch_dummy_expose (f->display.x->menubar_widget, x, y);
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1002 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1003
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1004 /* Return any foreign events that were queued to the X event queue. */
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1005 while (feq != NULL)
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1006 {
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1007 feq_tmp = feq;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1008 XPutBackEvent (XDISPLAY &feq_tmp->event);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1009 feq = feq_tmp->next;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1010 free ((char *)feq_tmp);
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1011 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1012
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1013 UNBLOCK_INPUT;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1014
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1015 return menu_item_selection;
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1016 }
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1017
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1018 #else /* not USE_X_TOOLKIT */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1019 xmenu_show (parent, startx, starty, line_list, enable_list, pane_list,
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1020 prefixes, line_cnt, pane_cnt, item_list, title, error)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021 Window parent;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 int startx, starty; /* upper left corner position BROKEN */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 char **line_list[]; /* list of strings for items */
5602
a8f081e90aee Comment change.
Paul Reilly <pmr@pajato.com>
parents: 4696
diff changeset
1024 int *enable_list[]; /* enable flags of lines */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1025 char *pane_list[]; /* list of pane titles */
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1026 Lisp_Object *prefixes; /* Prefix key for each pane */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1027 char *title;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1028 int pane_cnt; /* total number of panes */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1029 Lisp_Object *item_list[]; /* All items */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1030 int line_cnt[]; /* Lines in each pane */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1031 char **error; /* Error returned */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033 XMenu *GXMenu;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034 int last, panes, selidx, lpane, status;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035 int lines, sofar;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1036 Lisp_Object entry;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 /* struct indices *datap, *datap_save; */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1038 char *datap;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1039 int ulx, uly, width, height;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1040 int dispwidth, dispheight;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1041
3747
6506b2fd475a (xmenu_show): Store 0 in *ERROR at the beginning.
Richard M. Stallman <rms@gnu.org>
parents: 3501
diff changeset
1042 *error = 0;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1043 if (pane_cnt == 0)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1044 return 0;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1045
2209
7b95f29936cb (xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents: 2191
diff changeset
1046 BLOCK_INPUT;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1047 *error = (char *) 0; /* Initialize error pointer to null */
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1048
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1049 GXMenu = XMenuCreate (XDISPLAY parent, "emacs");
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1050 if (GXMenu == NUL)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1051 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1052 *error = "Can't create menu";
2209
7b95f29936cb (xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents: 2191
diff changeset
1053 UNBLOCK_INPUT;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1054 return (0);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1055 }
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1056
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1057 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
1058 lines += line_cnt[panes], panes++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1059 ;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1060 /* 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
1061 /* datap = (char *) xmalloc (lines * sizeof (char));
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1062 datap_save = datap;*/
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1063
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1064 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
1065 sofar += line_cnt[panes], panes++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1066 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1067 /* create all the necessary panes */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1068 lpane = XMenuAddPane (XDISPLAY GXMenu, pane_list[panes], TRUE);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1069 if (lpane == XM_FAILURE)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1071 XMenuDestroy (XDISPLAY GXMenu);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072 *error = "Can't create pane";
2209
7b95f29936cb (xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents: 2191
diff changeset
1073 UNBLOCK_INPUT;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1074 return (0);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1075 }
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1076
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1077 for (selidx = 0; selidx < line_cnt[panes]; selidx++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1078 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1079 /* add the selection stuff to the menus */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1080 /* datap[selidx+sofar].pane = panes;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1081 datap[selidx+sofar].line = selidx; */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1082 if (XMenuAddSelection (XDISPLAY GXMenu, lpane, 0,
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1083 line_list[panes][selidx],
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1084 enable_list[panes][selidx])
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1085 == XM_FAILURE)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1086 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1087 XMenuDestroy (XDISPLAY GXMenu);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1088 /* free (datap); */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1089 *error = "Can't add selection to menu";
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1090 /* error ("Can't add selection to menu"); */
2209
7b95f29936cb (xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents: 2191
diff changeset
1091 UNBLOCK_INPUT;
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1092 return (0);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1093 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1094 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1095 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1096 /* all set and ready to fly */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1097 XMenuRecompute (XDISPLAY GXMenu);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1098 dispwidth = DisplayWidth (x_current_display, XDefaultScreen (x_current_display));
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1099 dispheight = DisplayHeight (x_current_display, XDefaultScreen (x_current_display));
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1100 startx = min (startx, dispwidth);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1101 starty = min (starty, dispheight);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1102 startx = max (startx, 1);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1103 starty = max (starty, 1);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1104 XMenuLocate (XDISPLAY GXMenu, 0, 0, startx, starty,
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1105 &ulx, &uly, &width, &height);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1106 if (ulx+width > dispwidth)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1107 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1108 startx -= (ulx + width) - dispwidth;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1109 ulx = dispwidth - width;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1110 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1111 if (uly+height > dispheight)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1112 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1113 starty -= (uly + height) - dispheight;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1114 uly = dispheight - height;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1115 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1116 if (ulx < 0) startx -= ulx;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1117 if (uly < 0) starty -= uly;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1119 XMenuSetFreeze (GXMenu, TRUE);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1120 panes = selidx = 0;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1121
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1122 status = XMenuActivate (XDISPLAY GXMenu, &panes, &selidx,
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1123 startx, starty, ButtonReleaseMask, &datap);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1124 switch (status)
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1125 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1126 case XM_SUCCESS:
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1127 #ifdef XDEBUG
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1128 fprintf (stderr, "pane= %d line = %d\n", panes, selidx);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1129 #endif
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1130 entry = item_list[panes][selidx];
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1131 if (prefixes != 0)
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1132 {
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1133 entry = Fcons (entry, Qnil);
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1134 if (!NILP (prefixes[panes]))
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1135 entry = Fcons (prefixes[panes], entry);
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1136 }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1137 break;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1138 case XM_FAILURE:
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1139 /* free (datap_save); */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1140 XMenuDestroy (XDISPLAY GXMenu);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1141 *error = "Can't activate menu";
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1142 /* error ("Can't activate menu"); */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1143 case XM_IA_SELECT:
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1144 case XM_NO_SELECT:
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1145 entry = Qnil;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1146 break;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1147 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1148 XMenuDestroy (XDISPLAY GXMenu);
2209
7b95f29936cb (xmenu_show): Do BLOCK_INPUT; unblock just before returning.
Richard M. Stallman <rms@gnu.org>
parents: 2191
diff changeset
1149 UNBLOCK_INPUT;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1150 /* free (datap_save);*/
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1151 return (entry);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1152 }
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1153 #endif /* not USE_X_TOOLKIT */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1154
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1155 syms_of_xmenu ()
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1156 {
5673
7035bc81858b Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents: 5602
diff changeset
1157 popup_id_tick = (1<<16);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1158 defsubr (&Sx_popup_menu);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1159 }
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1160
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1161 /* Figure out the current keyboard equivalent of a menu item ITEM1.
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1162 Store the equivalent key sequence in *SAVEDKEY_PTR
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1163 and the textual description (to use in the menu display) in *DESCRIP_PTR.
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1164 Also cache them in the item itself.
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1165 Return the real definition to execute. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1166
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1167 static Lisp_Object
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1168 menu_item_equiv_key (item1, savedkey_ptr, descrip_ptr)
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1169 Lisp_Object item1;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1170 Lisp_Object *savedkey_ptr, *descrip_ptr;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1171 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1172 /* This is what is left after the menu item name. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1173 Lisp_Object overdef;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1174 /* This is the real definition--the function to run. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1175 Lisp_Object def;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1176 /* These are the saved equivalent keyboard key sequence
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1177 and its key-description. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1178 Lisp_Object savedkey, descrip;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1179 Lisp_Object def1;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1180 int changed = 0;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1181
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1182 overdef = def = Fcdr (item1);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1183
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1184 /* Get out the saved equivalent-keyboard-key info. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1185 savedkey = descrip = Qnil;
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1186 if (CONSP (overdef) && VECTORP (XCONS (overdef)->car))
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1187 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1188 savedkey = XCONS (overdef)->car;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1189 def = XCONS (def)->cdr;
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1190 if (CONSP (def) && STRINGP (XCONS (def)->car))
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1191 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1192 descrip = XCONS (def)->car;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1193 def = XCONS (def)->cdr;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1194 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1195 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1196
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1197 /* Is it still valid? */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1198 def1 = Qnil;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1199 if (!NILP (savedkey))
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1200 def1 = Fkey_binding (savedkey, Qnil);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1201 /* If not, update it. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1202 if (! EQ (def1, def))
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1203 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1204 changed = 1;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1205 descrip = Qnil;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1206 savedkey = Fwhere_is_internal (def, Qnil, Qt, Qnil);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1207 if (VECTORP (savedkey)
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1208 && EQ (XVECTOR (savedkey)->contents[0], Qmenu_bar))
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1209 savedkey = Qnil;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1210 if (!NILP (savedkey))
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1211 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1212 descrip = Fkey_description (savedkey);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1213 descrip = concat2 (make_string (" (", 3), descrip);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1214 descrip = concat2 (descrip, make_string (")", 1));
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1215 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1216 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1217
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1218 /* Store back the recorded keyboard key sequence
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1219 if we changed it. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1220 if (!NILP (savedkey)
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1221 && CONSP (overdef) && VECTORP (XCONS (overdef)->car))
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1222 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1223 if (changed)
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1224 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1225 XCONS (overdef)->car = savedkey;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1226 def1 = XCONS (overdef)->cdr;
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1227 if (CONSP (def1) && STRINGP (XCONS (def1)->car))
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1228 XCONS (def1)->car = descrip;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1229 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1230 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1231 /* If we had none but need one now, add it. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1232 else if (!NILP (savedkey))
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1233 XCONS (item1)->cdr
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1234 = overdef = Fcons (savedkey, Fcons (descrip, def));
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1235 /* If we had one but no longer should have one, delete it. */
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1236 else if (CONSP (overdef) && VECTORP (XCONS (overdef)->car))
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1237 {
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1238 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr;
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1239 if (CONSP (overdef) && STRINGP (XCONS (overdef)->car))
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1240 XCONS (item1)->cdr = overdef = XCONS (overdef)->cdr;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1241 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1242
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1243 *savedkey_ptr = savedkey;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1244 *descrip_ptr = descrip;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1245 return def;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1246 }
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1247
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1248 /* Construct the vectors that describe a menu
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1249 and store them in *VECTOR, *PANES, *NAMES, *ENABLES and *ITEMS.
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1250 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
1251 Return the number of panes.
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1252
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1253 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
1254
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1255 int
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1256 keymap_panes (vector, panes, names, enables, items, prefixes, keymaps, nmaps)
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1257 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
1258 char ***panes; /* RETURN pane names */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1259 char ****names; /* RETURN all line names */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1260 int ***enables; /* RETURN enable-flags of lines */
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1261 int **items; /* RETURN number of items per pane */
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1262 Lisp_Object **prefixes; /* RETURN vector of prefix keys, per pane */
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1263 Lisp_Object *keymaps;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1264 int nmaps;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1265 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1266 /* Number of panes we have made. */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1267 int p = 0;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1268 /* 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
1269 int npanes_allocated = nmaps;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1270 int mapno;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1271
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1272 if (npanes_allocated < 4)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1273 npanes_allocated = 4;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1274
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1275 /* 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
1276 *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
1277 *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
1278 *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
1279 *names = (char ***) xmalloc (npanes_allocated * sizeof (char **));
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1280 *enables = (int **) xmalloc (npanes_allocated * sizeof (int *));
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1281 *prefixes = (Lisp_Object *) xmalloc (npanes_allocated * sizeof (Lisp_Object));
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1282
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1283 /* 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
1284 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
1285 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
1286 for (mapno = 0; mapno < nmaps; mapno++)
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1287 single_keymap_panes (keymaps[mapno], panes, vector, names, enables, items,
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1288 prefixes, &p, &npanes_allocated, "");
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1289
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1290 /* Return the number of panes. */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1291 return p;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1292 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1293
5809
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1294 /* This is used as the handler when calling internal_condition_case_1. */
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1295
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1296 static Lisp_Object
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1297 single_keymap_panes_1 (arg)
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1298 Lisp_Object arg;
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1299 {
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1300 return Qnil;
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1301 }
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1302
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1303 /* This is a recursive subroutine of keymap_panes.
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1304 It handles one keymap, KEYMAP.
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1305 The other arguments are passed along
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1306 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
1307
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1308 single_keymap_panes (keymap, panes, vector, names, enables, items, prefixes,
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1309 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
1310 Lisp_Object keymap;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1311 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
1312 char ***panes; /* RETURN pane names */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1313 char ****names; /* RETURN all line names */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1314 int ***enables; /* RETURN enable flags of lines */
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1315 int **items; /* RETURN number of items per pane */
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1316 Lisp_Object **prefixes; /* RETURN vector of prefix keys, per pane */
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1317 int *p_ptr;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1318 int *npanes_allocated_ptr;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1319 char *pane_name;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1320 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1321 int i;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1322 Lisp_Object pending_maps;
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1323 Lisp_Object tail, item, item1, item_string, table;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1324 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1325
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1326 pending_maps = Qnil;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1327
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1328 /* 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
1329 if (*p_ptr == *npanes_allocated_ptr)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1330 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1331 *npanes_allocated_ptr *= 2;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1332
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1333 *vector
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1334 = (Lisp_Object **) xrealloc (*vector,
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1335 *npanes_allocated_ptr * sizeof (Lisp_Object *));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1336 *panes
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1337 = (char **) xrealloc (*panes,
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1338 *npanes_allocated_ptr * sizeof (char *));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1339 *items
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1340 = (int *) xrealloc (*items,
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1341 *npanes_allocated_ptr * sizeof (int));
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1342 *prefixes
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1343 = (Lisp_Object *) xrealloc (*prefixes,
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1344 (*npanes_allocated_ptr
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1345 * sizeof (Lisp_Object)));
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1346 *names
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1347 = (char ***) xrealloc (*names,
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1348 *npanes_allocated_ptr * sizeof (char **));
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1349 *enables
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1350 = (int **) xrealloc (*enables,
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1351 *npanes_allocated_ptr * sizeof (int *));
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1352 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1353
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1354 /* 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
1355 (*panes)[*p_ptr] = pane_name;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1356
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1357 /* Normally put nil as pane's prefix key.
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1358 Caller will override this if appropriate. */
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1359 (*prefixes)[*p_ptr] = Qnil;
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1360
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1361 /* 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
1362 i = XFASTINT (Flength (keymap));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1363
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1364 /* Add in lengths of any arrays. */
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1365 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
1366 if (XTYPE (XCONS (tail)->car) == Lisp_Vector)
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1367 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
1368
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1369 /* 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
1370 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
1371 (*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
1372 (*names)[*p_ptr] = (char **) xmalloc (i * sizeof (char *));
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1373 (*enables)[*p_ptr] = (int *) xmalloc (i * sizeof (int));
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1374
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1375 /* 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
1376 i = 0;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1377 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
1378 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1379 /* 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
1380 make a menu item from it. */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1381 item = XCONS (tail)->car;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1382 if (XTYPE (item) == Lisp_Cons)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1383 {
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1384 item1 = XCONS (item)->cdr;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1385 if (XTYPE (item1) == Lisp_Cons)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1386 {
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1387 item_string = XCONS (item1)->car;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1388 if (XTYPE (item_string) == Lisp_String)
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1389 {
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1390 /* This is the real definition--the function to run. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1391 Lisp_Object def;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1392 /* These are the saved equivalent keyboard key sequence
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1393 and its key-description. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1394 Lisp_Object savedkey, descrip;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1395 Lisp_Object tem, enabled;
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1396
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1397 /* If a help string follows the item string,
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1398 skip it. */
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1399 if (CONSP (XCONS (item1)->cdr)
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1400 && STRINGP (XCONS (XCONS (item1)->cdr)->car))
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1401 item1 = XCONS (item1)->cdr;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1402
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1403 def = menu_item_equiv_key (item1, &savedkey, &descrip);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1404
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1405 enabled = Qt;
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1406 if (XTYPE (def) == Lisp_Symbol)
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1407 {
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1408 /* No property, or nil, means enable.
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1409 Otherwise, enable if value is not nil. */
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1410 tem = Fget (def, Qmenu_enable);
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1411 /* GCPRO because we will call eval.
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1412 Protecting KEYMAP preserves everything we use;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1413 aside from that, must protect whatever might be
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1414 a string. */
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1415 GCPRO3 (keymap, def, descrip, item_string);
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1416 if (!NILP (tem))
5809
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1417 /* (condition-case nil (eval tem)
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1418 (error nil)) */
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1419 enabled = internal_condition_case_1 (Feval, tem,
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1420 Qerror,
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1421 single_keymap_panes_1);
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1422 UNGCPRO;
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1423 }
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1424 tem = Fkeymapp (def);
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1425 if (XSTRING (item_string)->data[0] == '@' && !NILP (tem))
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1426 pending_maps = Fcons (Fcons (def, Fcons (item_string, XCONS (item)->car)),
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1427 pending_maps);
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1428 else
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1429 {
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1430 Lisp_Object concat;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1431 if (!NILP (descrip))
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1432 concat = concat2 (item_string, descrip);
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1433 else
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1434 concat = item_string;
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1435 (*names)[*p_ptr][i] = (char *) XSTRING (concat)->data;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1436 /* 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
1437 (*vector)[*p_ptr][i] = XCONS (item)->car;
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1438 (*enables)[*p_ptr][i]
2191
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1439 = (NILP (def) ? -1 : !NILP (enabled) ? 1 : 0);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1440 i++;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1441 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1442 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1443 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1444 }
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1445 else if (XTYPE (item) == Lisp_Vector)
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1446 {
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1447 /* 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
1448 int len = XVECTOR (item)->size;
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1449 int c;
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1450 for (c = 0; c < len; c++)
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1451 {
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1452 Lisp_Object character;
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1453 XFASTINT (character) = c;
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1454 item1 = XVECTOR (item)->contents[c];
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1455 if (XTYPE (item1) == Lisp_Cons)
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1456 {
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1457 item_string = XCONS (item1)->car;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1458 if (XTYPE (item_string) == Lisp_String)
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1459 {
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1460 Lisp_Object def;
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1461
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1462 /* These are the saved equivalent keyboard key sequence
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1463 and its key-description. */
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1464 Lisp_Object savedkey, descrip;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1465 Lisp_Object tem, enabled;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1466
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1467 /* If a help string follows the item string,
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1468 skip it. */
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1469 if (CONSP (XCONS (item1)->cdr)
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1470 && STRINGP (XCONS (XCONS (item1)->cdr)->car))
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1471 item1 = XCONS (item1)->cdr;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1472
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1473 def = menu_item_equiv_key (item1, &savedkey, &descrip);
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1474
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1475 enabled = Qt;
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1476 if (XTYPE (def) == Lisp_Symbol)
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1477 {
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1478 tem = Fget (def, Qmenu_enable);
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1479 /* GCPRO because we will call eval.
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1480 Protecting KEYMAP preserves everything we use;
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1481 aside from that, must protect whatever might be
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1482 a string. */
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1483 GCPRO3 (keymap, def, descrip, item_string);
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1484 /* No property, or nil, means enable.
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1485 Otherwise, enable if value is not nil. */
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1486 if (!NILP (tem))
5809
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1487 /* (condition-case nil (eval tem)
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1488 (error nil)) */
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1489 enabled = internal_condition_case_1 (Feval, tem,
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1490 Qerror,
1493700a3d78 (single_keymap_panes): Use internal_condition_case_1.
Richard M. Stallman <rms@gnu.org>
parents: 5775
diff changeset
1491 single_keymap_panes_1);
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1492 UNGCPRO;
2135
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1493 }
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1494
0634d08c28d1 (syms_of_xmenu): Set up Qmenu_enable.
Richard M. Stallman <rms@gnu.org>
parents: 1933
diff changeset
1495 tem = Fkeymapp (def);
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1496 if (XSTRING (item_string)->data[0] == '@' && !NILP (tem))
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1497 pending_maps = Fcons (Fcons (def, Fcons (item_string, character)),
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1498 pending_maps);
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1499 else
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1500 {
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1501 Lisp_Object concat;
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1502 if (!NILP (descrip))
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1503 concat = concat2 (item_string, descrip);
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1504 else
6018
51d9a0c72a29 (single_keymap_panes): Properly skip help-string if any.
Richard M. Stallman <rms@gnu.org>
parents: 6007
diff changeset
1505 concat = item_string;
6007
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1506 (*names)[*p_ptr][i]
4cd71c48281f Find and display keyboard equivalents of menu items.
Richard M. Stallman <rms@gnu.org>
parents: 5992
diff changeset
1507 = (char *) XSTRING (concat)->data;
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1508 /* 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
1509 (*vector)[*p_ptr][i] = character;
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1510 (*enables)[*p_ptr][i]
2191
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1511 = (NILP (def) ? -1 : !NILP (enabled) ? 1 : 0);
1213
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1512 i++;
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1513 }
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1514 }
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1515 }
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1516 }
0901fe62d97b (single_keymap_panes): Handle vectors properly.
Richard M. Stallman <rms@gnu.org>
parents: 1210
diff changeset
1517 }
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1518 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1519 /* 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
1520 (*items)[*p_ptr] = i;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1521
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1522 /* 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
1523 if (i == 0)
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1524 {
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
1525 xfree ((*vector)[*p_ptr]);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
1526 xfree ((*names)[*p_ptr]);
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 2209
diff changeset
1527 xfree ((*enables)[*p_ptr]);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1528 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1529 /* Otherwise, advance past it. */
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1530 else
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1531 (*p_ptr)++;
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1532
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1533 /* 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
1534 while (!NILP (pending_maps))
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1535 {
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1536 Lisp_Object elt, eltcdr;
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1537 int panenum = *p_ptr;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1538 elt = Fcar (pending_maps);
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1539 eltcdr = XCONS (elt)->cdr;
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1540 single_keymap_panes (Fcar (elt), panes, vector, names, enables, items,
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1541 prefixes, p_ptr, npanes_allocated_ptr,
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1542 /* Add 1 to discard the @. */
2747
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1543 (char *) XSTRING (XCONS (eltcdr)->car)->data + 1);
f258c79c9162 (Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents: 2514
diff changeset
1544 (*prefixes)[panenum] = XCONS (eltcdr)->cdr;
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1545 pending_maps = Fcdr (pending_maps);
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1546 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1547 }
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1548
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1549 /* Construct the vectors that describe a menu
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1550 and store them in *VECTOR, *PANES, *NAMES, *ENABLES and *ITEMS.
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1551 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
1552 Return the number of panes.
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1553
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1554 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
1555
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1556 int
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1557 list_of_panes (vector, panes, names, enables, items, menu)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1558 Lisp_Object ***vector; /* RETURN all menu objects */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1559 char ***panes; /* RETURN pane names */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1560 char ****names; /* RETURN all line names */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1561 int ***enables; /* RETURN enable flags of lines */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1562 int **items; /* RETURN number of items per pane */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1563 Lisp_Object menu;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1564 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1565 Lisp_Object tail, item, item1;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1566 int i;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1567
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1568 if (XTYPE (menu) != Lisp_Cons) menu = wrong_type_argument (Qlistp, menu);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1569
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1570 i = XFASTINT (Flength (menu));
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1571
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1572 *vector = (Lisp_Object **) xmalloc (i * sizeof (Lisp_Object *));
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1573 *panes = (char **) xmalloc (i * sizeof (char *));
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1574 *items = (int *) xmalloc (i * sizeof (int));
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1575 *names = (char ***) xmalloc (i * sizeof (char **));
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1576 *enables = (int **) xmalloc (i * sizeof (int *));
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1577
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1578 for (i = 0, tail = menu; !NILP (tail); tail = Fcdr (tail), i++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1579 {
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1580 item = Fcdr (Fcar (tail));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1581 if (XTYPE (item) != Lisp_Cons) (void) wrong_type_argument (Qlistp, item);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1582 #ifdef XDEBUG
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1583 fprintf (stderr, "list_of_panes check tail, i=%d\n", i);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1584 #endif
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1585 item1 = Fcar (Fcar (tail));
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1586 CHECK_STRING (item1, 1);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1587 #ifdef XDEBUG
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1588 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
1589 XSTRING (item1)->data);
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1590 #endif
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1591 (*panes)[i] = (char *) XSTRING (item1)->data;
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1592 (*items)[i] = list_of_items ((*vector)+i, (*names)+i, (*enables)+i, item);
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1593 /* (*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
1594 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
1595 ; */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1596 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1597 return i;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1598 }
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1599
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1600 /* Construct the lists of values and names for a single pane, from the
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1601 alist PANE. Put them in *VECTOR and *NAMES. Put the enable flags
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1602 int *ENABLES. Return the number of items. */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1603
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1604 int
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1605 list_of_items (vector, names, enables, pane)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1606 Lisp_Object **vector; /* RETURN menu "objects" */
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1607 char ***names; /* RETURN line names */
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1608 int **enables; /* RETURN enable flags of lines */
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1609 Lisp_Object pane;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1610 {
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1611 Lisp_Object tail, item, item1;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1612 int i;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1613
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1614 if (XTYPE (pane) != Lisp_Cons) pane = wrong_type_argument (Qlistp, pane);
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1615
1933
63ba4f555b90 * minibuf.c (Fdisplay_completion_list): Pass the proper number of
Jim Blandy <jimb@redhat.com>
parents: 1828
diff changeset
1616 i = XFASTINT (Flength (pane));
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1617
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1618 *vector = (Lisp_Object *) xmalloc (i * sizeof (Lisp_Object));
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1619 *names = (char **) xmalloc (i * sizeof (char *));
2160
0639c52f017c (xmenu_show): New arg enable_list.
Richard M. Stallman <rms@gnu.org>
parents: 2153
diff changeset
1620 *enables = (int *) xmalloc (i * sizeof (int));
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1621
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1622 for (i = 0, tail = pane; !NILP (tail); tail = Fcdr (tail), i++)
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1623 {
1082
d24afc1bef38 (xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents: 975
diff changeset
1624 item = Fcar (tail);
2191
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1625 if (STRINGP (item))
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1626 {
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1627 (*vector)[i] = Qnil;
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1628 (*names)[i] = (char *) XSTRING (item)->data;
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1629 (*enables)[i] = -1;
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1630 }
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1631 else
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1632 {
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1633 CHECK_CONS (item, 0);
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1634 (*vector)[i] = Fcdr (item);
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1635 item1 = Fcar (item);
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1636 CHECK_STRING (item1, 1);
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1637 (*names)[i] = (char *) XSTRING (item1)->data;
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1638 (*enables)[i] = 1;
12480fa04422 (list_of_items): Allow strings among the alist items;
Richard M. Stallman <rms@gnu.org>
parents: 2160
diff changeset
1639 }
118
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1640 }
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1641 return i;
49342840ba00 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1642 }