Mercurial > emacs
annotate src/xmenu.c @ 25503:bbb032f48e20
(struct it): Change the size of the member `ctl_chars'.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 03 Sep 1999 01:28:42 +0000 |
parents | 824b89fca192 |
children | 9154af188477 |
rev | line source |
---|---|
118 | 1 /* X Communication module for terminals which understand the X protocol. |
15795 | 2 Copyright (C) 1986, 1988, 1993, 1994, 1996 Free Software Foundation, Inc. |
118 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
1437
36ef55ecb265
* frame.c (make_frame_without_minibuffer, Fwindow_frame): Use
Jim Blandy <jimb@redhat.com>
parents:
1304
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
118 | 9 any later version. |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
118 | 20 |
21 /* X pop-up deck-of-cards menu facility for gnuemacs. | |
22 * | |
23 * Written by Jon Arnold and Roman Budzianowski | |
24 * Mods and rewrite by Robert Krawitz | |
25 * | |
26 */ | |
27 | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
28 /* 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
|
29 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
|
30 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
31 /* Rewritten for clarity and GC protection by rms in Feb 94. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
32 |
118 | 33 /* On 4.3 this loses if it comes after xterm.h. */ |
34 #include <signal.h> | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4627
diff
changeset
|
35 #include <config.h> |
25322 | 36 #ifdef HAVE_STDLIB_H |
37 #include <stdlib.h> | |
38 #endif | |
7900
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7871
diff
changeset
|
39 |
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7871
diff
changeset
|
40 #include <stdio.h> |
118 | 41 #include "lisp.h" |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
42 #include "termhooks.h" |
770 | 43 #include "frame.h" |
118 | 44 #include "window.h" |
1304
93d55019750e
* xmenu.c: #include "keyboard.h".
Jim Blandy <jimb@redhat.com>
parents:
1213
diff
changeset
|
45 #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
|
46 #include "blockinput.h" |
12661 | 47 #include "buffer.h" |
118 | 48 |
10502
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
49 #ifdef MSDOS |
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
50 #include "msdos.h" |
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
51 #endif |
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
52 |
9572 | 53 #ifdef HAVE_X_WINDOWS |
118 | 54 /* This may include sys/types.h, and that somehow loses |
55 if this is not done before the other system files. */ | |
56 #include "xterm.h" | |
9572 | 57 #endif |
118 | 58 |
59 /* Load sys/types.h if not already loaded. | |
60 In some systems loading it twice is suicidal. */ | |
61 #ifndef makedev | |
62 #include <sys/types.h> | |
63 #endif | |
64 | |
65 #include "dispextern.h" | |
66 | |
9572 | 67 #ifdef HAVE_X_WINDOWS |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
68 #undef HAVE_MULTILINGUAL_MENU |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
69 #ifdef USE_X_TOOLKIT |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
70 #include <X11/Xlib.h> |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
71 #include <X11/IntrinsicP.h> |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
72 #include <X11/CoreP.h> |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
73 #include <X11/StringDefs.h> |
8414
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
74 #include <X11/Shell.h> |
13489
ddf90bfd3744
Don't include Xaw/Paned.h unless USE_LUCID is defined.
Richard M. Stallman <rms@gnu.org>
parents:
13071
diff
changeset
|
75 #ifdef USE_LUCID |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
76 #include <X11/Xaw/Paned.h> |
13489
ddf90bfd3744
Don't include Xaw/Paned.h unless USE_LUCID is defined.
Richard M. Stallman <rms@gnu.org>
parents:
13071
diff
changeset
|
77 #endif /* USE_LUCID */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
78 #include "../lwlib/lwlib.h" |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
79 #else /* not USE_X_TOOLKIT */ |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
80 #include "../oldXMenu/XMenu.h" |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
81 #endif /* not USE_X_TOOLKIT */ |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
82 #endif /* HAVE_X_WINDOWS */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
83 |
24993 | 84 #ifdef USE_MOTIF |
85 #include <Xm/Xm.h> /* for LESSTIF_VERSION */ | |
86 #endif | |
87 | |
118 | 88 #define min(x,y) (((x) < (y)) ? (x) : (y)) |
89 #define max(x,y) (((x) > (y)) ? (x) : (y)) | |
90 | |
91 #ifndef TRUE | |
92 #define TRUE 1 | |
93 #define FALSE 0 | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
94 #endif /* no TRUE */ |
118 | 95 |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
96 Lisp_Object Vmenu_updating_frame; |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
97 |
12625
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
98 Lisp_Object Qdebug_on_next_call; |
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
99 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
100 extern Lisp_Object Qmenu_bar; |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
101 extern Lisp_Object Qmouse_click, Qevent_kind; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
102 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
103 extern Lisp_Object QCtoggle, QCradio; |
12298
7c4b729e4b21
(menu_item_equiv_key): Do reconsider a command that had
Richard M. Stallman <rms@gnu.org>
parents:
12196
diff
changeset
|
104 |
12661 | 105 extern Lisp_Object Voverriding_local_map; |
106 extern Lisp_Object Voverriding_local_map_menu_flag; | |
107 | |
108 extern Lisp_Object Qoverriding_local_map, Qoverriding_terminal_local_map; | |
109 | |
110 extern Lisp_Object Qmenu_bar_update_hook; | |
111 | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
112 #ifdef USE_X_TOOLKIT |
12661 | 113 extern void set_frame_menubar (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
114 extern void process_expose_from_menu (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
115 extern XtAppContext Xt_app_con; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
116 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
117 static Lisp_Object xdialog_show (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
118 void popup_get_selection (); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
119 #endif |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
120 |
24993 | 121 #ifdef USE_X_TOOLKIT |
122 | |
123 /* Define HAVE_BOXES if meus can handle radio and toggle buttons. */ | |
124 | |
125 #define HAVE_BOXES 1 | |
126 #endif | |
127 | |
128 static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, | |
129 Lisp_Object, Lisp_Object, Lisp_Object, | |
130 Lisp_Object)); | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
131 static Lisp_Object xmenu_show (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
132 static void keymap_panes (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
133 static void single_keymap_panes (); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
134 static void single_menu_item (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
135 static void list_of_panes (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
136 static void list_of_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
137 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
138 /* This holds a Lisp vector that holds the results of decoding |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
139 the keymaps or alist-of-alists that specify a menu. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
140 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
141 It describes the panes and items within the panes. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
142 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
143 Each pane is described by 3 elements in the vector: |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
144 t, the pane name, the pane's prefix key. |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
145 Then follow the pane's items, with 5 elements per item: |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
146 the item string, the enable flag, the item's value, |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
147 the definition, and the equivalent keyboard key's description string. |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
148 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
149 In some cases, multiple levels of menus may be described. |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
150 A single vector slot containing nil indicates the start of a submenu. |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
151 A single vector slot containing lambda indicates the end of a submenu. |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
152 The submenu follows a menu item which is the way to reach the submenu. |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
153 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
154 A single vector slot containing quote indicates that the |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
155 following items should appear on the right of a dialog box. |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
156 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
157 Using a Lisp vector to hold this information while we decode it |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
158 takes care of protecting all the data from GC. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
159 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
160 #define MENU_ITEMS_PANE_NAME 1 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
161 #define MENU_ITEMS_PANE_PREFIX 2 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
162 #define MENU_ITEMS_PANE_LENGTH 3 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
163 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
164 #define MENU_ITEMS_ITEM_NAME 0 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
165 #define MENU_ITEMS_ITEM_ENABLE 1 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
166 #define MENU_ITEMS_ITEM_VALUE 2 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
167 #define MENU_ITEMS_ITEM_EQUIV_KEY 3 |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
168 #define MENU_ITEMS_ITEM_DEFINITION 4 |
24993 | 169 #define MENU_ITEMS_ITEM_TYPE 5 |
170 #define MENU_ITEMS_ITEM_SELECTED 6 | |
171 #define MENU_ITEMS_ITEM_LENGTH 7 | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
172 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
173 static Lisp_Object menu_items; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
174 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
175 /* Number of slots currently allocated in menu_items. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
176 static int menu_items_allocated; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
177 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
178 /* This is the index in menu_items of the first empty slot. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
179 static int menu_items_used; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
180 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
181 /* The number of panes currently recorded in menu_items, |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
182 excluding those within submenus. */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
183 static int menu_items_n_panes; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
184 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
185 /* Current depth within submenus. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
186 static int menu_items_submenu_depth; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
187 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
188 /* Flag which when set indicates a dialog or menu has been posted by |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
189 Xt on behalf of one of the widget sets. */ |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
190 static int popup_activated_flag; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
191 |
12661 | 192 static int next_menubar_widget_id; |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
193 |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
194 /* This is set nonzero after the user activates the menu bar, and set |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
195 to zero again after the menu bars are redisplayed by prepare_menu_bar. |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
196 While it is nonzero, all calls to set_frame_menubar go deep. |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
197 |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
198 I don't understand why this is needed, but it does seem to be |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
199 needed on Motif, according to Marcus Daniels <marcus@sysc.pdx.edu>. */ |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
200 |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
201 int pending_menu_activation; |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
202 |
12661 | 203 #ifdef USE_X_TOOLKIT |
204 | |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
205 /* Return the frame whose ->output_data.x->id equals ID, or 0 if none. */ |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
206 |
12661 | 207 static struct frame * |
208 menubar_id_to_frame (id) | |
209 LWLIB_ID id; | |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
210 { |
12661 | 211 Lisp_Object tail, frame; |
212 FRAME_PTR f; | |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
213 |
12661 | 214 for (tail = Vframe_list; GC_CONSP (tail); tail = XCONS (tail)->cdr) |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
215 { |
12661 | 216 frame = XCONS (tail)->car; |
217 if (!GC_FRAMEP (frame)) | |
218 continue; | |
219 f = XFRAME (frame); | |
12672 | 220 if (f->output_data.nothing == 1) |
12661 | 221 continue; |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
222 if (f->output_data.x->id == id) |
12661 | 223 return f; |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
224 } |
12661 | 225 return 0; |
226 } | |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
227 |
12661 | 228 #endif |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
229 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
230 /* Initialize the menu_items structure if we haven't already done so. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
231 Also mark it as currently empty. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
232 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
233 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
234 init_menu_items () |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
235 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
236 if (NILP (menu_items)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
237 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
238 menu_items_allocated = 60; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
239 menu_items = Fmake_vector (make_number (menu_items_allocated), Qnil); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
240 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
241 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
242 menu_items_used = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
243 menu_items_n_panes = 0; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
244 menu_items_submenu_depth = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
245 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
246 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
247 /* Call at the end of generating the data in menu_items. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
248 This fills in the number of items in the last pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
249 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
250 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
251 finish_menu_items () |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
252 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
253 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
254 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
255 /* Call when finished using the data for the current menu |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
256 in menu_items. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
257 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
258 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
259 discard_menu_items () |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
260 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
261 /* Free the structure if it is especially large. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
262 Otherwise, hold on to it, to save time. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
263 if (menu_items_allocated > 200) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
264 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
265 menu_items = Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
266 menu_items_allocated = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
267 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
268 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
269 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
270 /* Make the menu_items vector twice as large. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
271 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
272 static void |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
273 grow_menu_items () |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
274 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
275 Lisp_Object old; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
276 int old_size = menu_items_allocated; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
277 old = menu_items; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
278 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
279 menu_items_allocated *= 2; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
280 menu_items = Fmake_vector (make_number (menu_items_allocated), Qnil); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
281 bcopy (XVECTOR (old)->contents, XVECTOR (menu_items)->contents, |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
282 old_size * sizeof (Lisp_Object)); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
283 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
284 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
285 /* Begin a submenu. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
286 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
287 static void |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
288 push_submenu_start () |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
289 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
290 if (menu_items_used + 1 > menu_items_allocated) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
291 grow_menu_items (); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
292 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
293 XVECTOR (menu_items)->contents[menu_items_used++] = Qnil; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
294 menu_items_submenu_depth++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
295 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
296 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
297 /* End a submenu. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
298 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
299 static void |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
300 push_submenu_end () |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
301 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
302 if (menu_items_used + 1 > menu_items_allocated) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
303 grow_menu_items (); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
304 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
305 XVECTOR (menu_items)->contents[menu_items_used++] = Qlambda; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
306 menu_items_submenu_depth--; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
307 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
308 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
309 /* Indicate boundary between left and right. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
310 |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
311 static void |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
312 push_left_right_boundary () |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
313 { |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
314 if (menu_items_used + 1 > menu_items_allocated) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
315 grow_menu_items (); |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
316 |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
317 XVECTOR (menu_items)->contents[menu_items_used++] = Qquote; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
318 } |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
319 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
320 /* Start a new menu pane in menu_items.. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
321 NAME is the pane name. PREFIX_VEC is a prefix key for this pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
322 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
323 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
324 push_menu_pane (name, prefix_vec) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
325 Lisp_Object name, prefix_vec; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
326 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
327 if (menu_items_used + MENU_ITEMS_PANE_LENGTH > menu_items_allocated) |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
328 grow_menu_items (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
329 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
330 if (menu_items_submenu_depth == 0) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
331 menu_items_n_panes++; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
332 XVECTOR (menu_items)->contents[menu_items_used++] = Qt; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
333 XVECTOR (menu_items)->contents[menu_items_used++] = name; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
334 XVECTOR (menu_items)->contents[menu_items_used++] = prefix_vec; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
335 } |
118 | 336 |
24993 | 337 /* Push one menu item into the current pane. NAME is the string to |
338 display. ENABLE if non-nil means this item can be selected. KEY | |
339 is the key generated by choosing this item, or nil if this item | |
340 doesn't really have a definition. DEF is the definition of this | |
341 item. EQUIV is the textual description of the keyboard equivalent | |
342 for this item (or nil if none). TYPE is the type of this menu | |
343 item, one of nil, `toggle' or `radio'. */ | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
344 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
345 static void |
24993 | 346 push_menu_item (name, enable, key, def, equiv, type, selected) |
347 Lisp_Object name, enable, key, def, equiv, type, selected; | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
348 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
349 if (menu_items_used + MENU_ITEMS_ITEM_LENGTH > menu_items_allocated) |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
350 grow_menu_items (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
351 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
352 XVECTOR (menu_items)->contents[menu_items_used++] = name; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
353 XVECTOR (menu_items)->contents[menu_items_used++] = enable; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
354 XVECTOR (menu_items)->contents[menu_items_used++] = key; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
355 XVECTOR (menu_items)->contents[menu_items_used++] = equiv; |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
356 XVECTOR (menu_items)->contents[menu_items_used++] = def; |
24993 | 357 XVECTOR (menu_items)->contents[menu_items_used++] = type; |
358 XVECTOR (menu_items)->contents[menu_items_used++] = selected; | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
359 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
360 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
361 /* Look through KEYMAPS, a vector of keymaps that is NMAPS long, |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
362 and generate menu panes for them in menu_items. |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
363 If NOTREAL is nonzero, |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
364 don't bother really computing whether an item is enabled. */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
365 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
366 static void |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
367 keymap_panes (keymaps, nmaps, notreal) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
368 Lisp_Object *keymaps; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
369 int nmaps; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
370 int notreal; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
371 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
372 int mapno; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
373 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
374 init_menu_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
375 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
376 /* Loop over the given keymaps, making a pane for each map. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
377 But don't make a pane that is empty--ignore that map instead. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
378 P is the number of panes we have made so far. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
379 for (mapno = 0; mapno < nmaps; mapno++) |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
380 single_keymap_panes (keymaps[mapno], Qnil, Qnil, notreal, 10); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
381 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
382 finish_menu_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
383 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
384 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
385 /* This is a recursive subroutine of keymap_panes. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
386 It handles one keymap, KEYMAP. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
387 The other arguments are passed along |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
388 or point to local variables of the previous function. |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
389 If NOTREAL is nonzero, only check for equivalent key bindings, don't |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
390 evaluate expressions in menu items and don't make any menu. |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
391 |
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
392 If we encounter submenus deeper than MAXDEPTH levels, ignore them. */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
393 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
394 static void |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
395 single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
396 Lisp_Object keymap; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
397 Lisp_Object pane_name; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
398 Lisp_Object prefix; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
399 int notreal; |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
400 int maxdepth; |
118 | 401 { |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
402 Lisp_Object pending_maps = Qnil; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
403 Lisp_Object tail, item; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
404 struct gcpro gcpro1, gcpro2; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
405 int notbuttons = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
406 |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
407 if (maxdepth <= 0) |
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
408 return; |
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
409 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
410 push_menu_pane (pane_name, prefix); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
411 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
412 #ifndef HAVE_BOXES |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
413 /* Remember index for first item in this pane so we can go back and |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
414 add a prefix when (if) we see the first button. After that, notbuttons |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
415 is set to 0, to mark that we have seen a button and all non button |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
416 items need a prefix. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
417 notbuttons = menu_items_used; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
418 #endif |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
419 |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
420 for (tail = keymap; CONSP (tail); tail = XCONS (tail)->cdr) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
421 { |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
422 GCPRO2 (keymap, pending_maps); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
423 /* Look at each key binding, and if it is a menu item add it |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
424 to this menu. */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
425 item = XCONS (tail)->car; |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
426 if (CONSP (item)) |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
427 single_menu_item (XCONS (item)->car, XCONS (item)->cdr, |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
428 &pending_maps, notreal, maxdepth, ¬buttons); |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
429 else if (VECTORP (item)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
430 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
431 /* Loop over the char values represented in the vector. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
432 int len = XVECTOR (item)->size; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
433 int c; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
434 for (c = 0; c < len; c++) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
435 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
436 Lisp_Object character; |
9341
e5ecfda9e730
(single_keymap_panes, Fx_popup_menu): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9339
diff
changeset
|
437 XSETFASTINT (character, c); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
438 single_menu_item (character, XVECTOR (item)->contents[c], |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
439 &pending_maps, notreal, maxdepth, ¬buttons); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
440 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
441 } |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
442 UNGCPRO; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
443 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
444 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
445 /* Process now any submenus which want to be panes at this level. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
446 while (!NILP (pending_maps)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
447 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
448 Lisp_Object elt, eltcdr, string; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
449 elt = Fcar (pending_maps); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
450 eltcdr = XCONS (elt)->cdr; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
451 string = XCONS (eltcdr)->car; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
452 /* We no longer discard the @ from the beginning of the string here. |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
453 Instead, we do this in xmenu_show. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
454 single_keymap_panes (Fcar (elt), string, |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
455 XCONS (eltcdr)->cdr, notreal, maxdepth - 1); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
456 pending_maps = Fcdr (pending_maps); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
457 } |
118 | 458 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
459 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
460 /* This is a subroutine of single_keymap_panes that handles one |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
461 keymap entry. |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
462 KEY is a key in a keymap and ITEM is its binding. |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
463 PENDING_MAPS_PTR points to a list of keymaps waiting to be made into |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
464 separate panes. |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
465 If NOTREAL is nonzero, only check for equivalent key bindings, don't |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
466 evaluate expressions in menu items and don't make any menu. |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
467 If we encounter submenus deeper than MAXDEPTH levels, ignore them. |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
468 NOTBUTTONS_PTR is only used when simulating toggle boxes and radio |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
469 buttons. It points to variable notbuttons in single_keymap_panes, |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
470 which keeps track of if we have seen a button in this menu or not. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
471 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
472 static void |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
473 single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth, |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
474 notbuttons_ptr) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
475 Lisp_Object key, item; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
476 Lisp_Object *pending_maps_ptr; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
477 int maxdepth, notreal; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
478 int *notbuttons_ptr; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
479 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
480 Lisp_Object def, map, item_string, enabled; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
481 struct gcpro gcpro1, gcpro2; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
482 int res; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
483 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
484 /* Parse the menu item and leave the result in item_properties. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
485 GCPRO2 (key, item); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
486 res = parse_menu_item (item, notreal, 0); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
487 UNGCPRO; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
488 if (!res) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
489 return; /* Not a menu item. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
490 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
491 map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP]; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
492 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
493 if (notreal) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
494 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
495 /* We don't want to make a menu, just traverse the keymaps to |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
496 precompute equivalent key bindings. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
497 if (!NILP (map)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
498 single_keymap_panes (map, Qnil, key, 1, maxdepth - 1); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
499 return; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
500 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
501 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
502 enabled = XVECTOR (item_properties)->contents[ITEM_PROPERTY_ENABLE]; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
503 item_string = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME]; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
504 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
505 if (!NILP (map) && XSTRING (item_string)->data[0] == '@') |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
506 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
507 if (!NILP (enabled)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
508 /* An enabled separate pane. Remember this to handle it later. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
509 *pending_maps_ptr = Fcons (Fcons (map, Fcons (item_string, key)), |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
510 *pending_maps_ptr); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
511 return; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
512 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
513 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
514 #ifndef HAVE_BOXES |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
515 /* Simulate radio buttons and toggle boxes by putting a prefix in |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
516 front of them. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
517 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
518 Lisp_Object prefix = Qnil; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
519 Lisp_Object type = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE]; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
520 if (!NILP (type)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
521 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
522 Lisp_Object selected |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
523 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED]; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
524 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
525 if (*notbuttons_ptr) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
526 /* The first button. Line up previous items in this menu. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
527 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
528 int index = *notbuttons_ptr; /* Index for first item this menu. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
529 int submenu = 0; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
530 Lisp_Object tem; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
531 while (index < menu_items_used) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
532 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
533 tem |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
534 = XVECTOR (menu_items)->contents[index + MENU_ITEMS_ITEM_NAME]; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
535 if (NILP (tem)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
536 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
537 index++; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
538 submenu++; /* Skip sub menu. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
539 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
540 else if (EQ (tem, Qlambda)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
541 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
542 index++; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
543 submenu--; /* End sub menu. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
544 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
545 else if (EQ (tem, Qt)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
546 index += 3; /* Skip new pane marker. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
547 else if (EQ (tem, Qquote)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
548 index++; /* Skip a left, right divider. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
549 else |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
550 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
551 if (!submenu && XSTRING (tem)->data[0] != '\0' |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
552 && XSTRING (tem)->data[0] != '-') |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
553 XVECTOR (menu_items)->contents[index + MENU_ITEMS_ITEM_NAME] |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
554 = concat2 (build_string (" "), tem); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
555 index += MENU_ITEMS_ITEM_LENGTH; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
556 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
557 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
558 *notbuttons_ptr = 0; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
559 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
560 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
561 /* Calculate prefix, if any, for this item. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
562 if (EQ (type, QCtoggle)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
563 prefix = build_string (NILP (selected) ? "[ ] " : "[X] "); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
564 else if (EQ (type, QCradio)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
565 prefix = build_string (NILP (selected) ? "( ) " : "(*) "); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
566 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
567 /* Not a button. If we have earlier buttons, then we need a prefix. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
568 else if (!*notbuttons_ptr && XSTRING (item_string)->data[0] != '\0' |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
569 && XSTRING (item_string)->data[0] != '-') |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
570 prefix = build_string (" "); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
571 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
572 if (!NILP (prefix)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
573 item_string = concat2 (prefix, item_string); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
574 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
575 #endif /* not HAVE_BOXES */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
576 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
577 #ifndef USE_X_TOOLKIT |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
578 if (!NILP(map)) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
579 /* Indicate visually that this is a submenu. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
580 item_string = concat2 (item_string, build_string (" >")); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
581 #endif |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
582 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
583 push_menu_item (item_string, enabled, key, |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
584 XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF], |
24993 | 585 XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ], |
586 XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE], | |
587 XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED]); | |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
588 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
589 #ifdef USE_X_TOOLKIT |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
590 /* Display a submenu using the toolkit. */ |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
591 if (! (NILP (map) || NILP (enabled))) |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
592 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
593 push_submenu_start (); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
594 single_keymap_panes (map, Qnil, key, 0, maxdepth - 1); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
595 push_submenu_end (); |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
596 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
597 #endif |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
598 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
599 |
14036 | 600 /* Push all the panes and items of a menu described by the |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
601 alist-of-alists MENU. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
602 This handles old-fashioned calls to x-popup-menu. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
603 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
604 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
605 list_of_panes (menu) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
606 Lisp_Object menu; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
607 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
608 Lisp_Object tail; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
609 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
610 init_menu_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
611 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
612 for (tail = menu; !NILP (tail); tail = Fcdr (tail)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
613 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
614 Lisp_Object elt, pane_name, pane_data; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
615 elt = Fcar (tail); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
616 pane_name = Fcar (elt); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
617 CHECK_STRING (pane_name, 0); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
618 push_menu_pane (pane_name, Qnil); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
619 pane_data = Fcdr (elt); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
620 CHECK_CONS (pane_data, 0); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
621 list_of_items (pane_data); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
622 } |
118 | 623 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
624 finish_menu_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
625 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
626 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
627 /* Push the items in a single pane defined by the alist PANE. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
628 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
629 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
630 list_of_items (pane) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
631 Lisp_Object pane; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
632 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
633 Lisp_Object tail, item, item1; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
634 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
635 for (tail = pane; !NILP (tail); tail = Fcdr (tail)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
636 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
637 item = Fcar (tail); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
638 if (STRINGP (item)) |
24993 | 639 push_menu_item (item, Qnil, Qnil, Qt, Qnil, Qnil, Qnil); |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
640 else if (NILP (item)) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
641 push_left_right_boundary (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
642 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
643 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
644 CHECK_CONS (item, 0); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
645 item1 = Fcar (item); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
646 CHECK_STRING (item1, 1); |
24993 | 647 push_menu_item (item1, Qt, Fcdr (item), Qt, Qnil, Qnil, Qnil); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
648 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
649 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
650 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
651 |
6424
b3d22929b7c1
(Fx_popup_dialog, Fx_popup_menu): Require 2 args.
Richard M. Stallman <rms@gnu.org>
parents:
6406
diff
changeset
|
652 DEFUN ("x-popup-menu", Fx_popup_menu, Sx_popup_menu, 2, 2, 0, |
118 | 653 "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
|
654 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
|
655 or a list ((XOFFSET YOFFSET) WINDOW)\n\ |
7175
5fa65268508b
(Fx_popup_menu): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7129
diff
changeset
|
656 where XOFFSET and YOFFSET are positions in pixels 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
|
657 corner of WINDOW's frame. (WINDOW may be a frame object instead of a window.)\n\ |
118 | 658 This controls the position of the center of the first line\n\ |
659 in the first pane of the menu, not the top left of the menu as a whole.\n\ | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
660 If POSITION is t, it means to use the current mouse position.\n\ |
118 | 661 \n\ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
662 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
|
663 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
|
664 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
|
665 \(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
|
666 the keymap as a top-level element.\n\n\ |
17709
c93b19665c14
(Fx_popup_menu): Do fix.
Richard M. Stallman <rms@gnu.org>
parents:
17554
diff
changeset
|
667 If REAL-DEFINITION is nil, that puts a nonselectable string in the menu.\n\ |
c93b19665c14
(Fx_popup_menu): Do fix.
Richard M. Stallman <rms@gnu.org>
parents:
17554
diff
changeset
|
668 Otherwise, REAL-DEFINITION should be a valid key binding definition.\n\ |
c93b19665c14
(Fx_popup_menu): Do fix.
Richard M. Stallman <rms@gnu.org>
parents:
17554
diff
changeset
|
669 \n\ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
670 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
|
671 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
|
672 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
|
673 is a list of events.\n\n\ |
17709
c93b19665c14
(Fx_popup_menu): Do fix.
Richard M. Stallman <rms@gnu.org>
parents:
17554
diff
changeset
|
674 \n\ |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
675 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
|
676 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
|
677 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
|
678 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
|
679 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
|
680 in the menu.\n\ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
681 With this form of menu, the return value is VALUE from the chosen item.\n\ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
682 \n\ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
683 If POSITION is nil, don't display the menu at all, just precalculate the\n\ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
684 cached information about equivalent key sequences.") |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
685 (position, menu) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
686 Lisp_Object position, menu; |
118 | 687 { |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
688 int number_of_panes, panes; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
689 Lisp_Object keymap, tem; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
690 int xpos, ypos; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
691 Lisp_Object title; |
118 | 692 char *error_name; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
693 Lisp_Object selection; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
694 int i, j; |
770 | 695 FRAME_PTR f; |
118 | 696 Lisp_Object x, y, window; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
697 int keymaps = 0; |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
698 int for_click = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
699 struct gcpro gcpro1; |
118 | 700 |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
701 #ifdef HAVE_MENUS |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
702 if (! NILP (position)) |
2147
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
703 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
704 check_x (); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
705 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
706 /* Decode the first argument: find the window and the coordinates. */ |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
707 if (EQ (position, Qt) |
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
708 || (CONSP (position) && EQ (XCONS (position)->car, Qmenu_bar))) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
709 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
710 /* Use the mouse's current position. */ |
10835
cd9261d8d347
(Fx_popup_menu): Init f from selected_frame
Richard M. Stallman <rms@gnu.org>
parents:
10809
diff
changeset
|
711 FRAME_PTR new_f = selected_frame; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
712 Lisp_Object bar_window; |
21514 | 713 enum scroll_bar_part part; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
714 unsigned long time; |
2147
1b6e54507323
(Fx_popup_menu): Allow a frame instead of a window, in arg.
Richard M. Stallman <rms@gnu.org>
parents:
2135
diff
changeset
|
715 |
7334
fcea4173315d
(Fx_popup_menu): Restore accidentally-deleted call to mouse_position_hook.
Karl Heuer <kwzh@gnu.org>
parents:
7208
diff
changeset
|
716 if (mouse_position_hook) |
11125
dc78213dd2b3
(Fx_popup_menu): Pass 1 for `insist' arg.
Richard M. Stallman <rms@gnu.org>
parents:
10835
diff
changeset
|
717 (*mouse_position_hook) (&new_f, 1, &bar_window, |
dc78213dd2b3
(Fx_popup_menu): Pass 1 for `insist' arg.
Richard M. Stallman <rms@gnu.org>
parents:
10835
diff
changeset
|
718 &part, &x, &y, &time); |
6395
6240067bfe33
(Fx_popup_dialog, Fx_popup_menu): Handle case where
Richard M. Stallman <rms@gnu.org>
parents:
6325
diff
changeset
|
719 if (new_f != 0) |
9339
8a59acc95eea
(Fx_popup_menu, Fx_popup_dialog): Use new accessor macros instead of calling
Karl Heuer <kwzh@gnu.org>
parents:
9336
diff
changeset
|
720 XSETFRAME (window, new_f); |
6395
6240067bfe33
(Fx_popup_dialog, Fx_popup_menu): Handle case where
Richard M. Stallman <rms@gnu.org>
parents:
6325
diff
changeset
|
721 else |
6240067bfe33
(Fx_popup_dialog, Fx_popup_menu): Handle case where
Richard M. Stallman <rms@gnu.org>
parents:
6325
diff
changeset
|
722 { |
6240067bfe33
(Fx_popup_dialog, Fx_popup_menu): Handle case where
Richard M. Stallman <rms@gnu.org>
parents:
6325
diff
changeset
|
723 window = selected_window; |
9341
e5ecfda9e730
(single_keymap_panes, Fx_popup_menu): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9339
diff
changeset
|
724 XSETFASTINT (x, 0); |
e5ecfda9e730
(single_keymap_panes, Fx_popup_menu): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9339
diff
changeset
|
725 XSETFASTINT (y, 0); |
6395
6240067bfe33
(Fx_popup_dialog, Fx_popup_menu): Handle case where
Richard M. Stallman <rms@gnu.org>
parents:
6325
diff
changeset
|
726 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
727 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
728 else |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
729 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
730 tem = Fcar (position); |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
731 if (CONSP (tem)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
732 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
733 window = Fcar (Fcdr (position)); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
734 x = Fcar (tem); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
735 y = Fcar (Fcdr (tem)); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
736 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
737 else |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
738 { |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
739 for_click = 1; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
740 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
741 window = Fcar (tem); /* POSN_WINDOW (tem) */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
742 tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
743 x = Fcar (tem); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
744 y = Fcdr (tem); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
745 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
746 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
747 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
748 CHECK_NUMBER (x, 0); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
749 CHECK_NUMBER (y, 0); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
750 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
751 /* Decode where to put the menu. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
752 |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
753 if (FRAMEP (window)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
754 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
755 f = XFRAME (window); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
756 xpos = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
757 ypos = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
758 } |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
759 else if (WINDOWP (window)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
760 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
761 CHECK_LIVE_WINDOW (window, 0); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
762 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
|
763 |
17364
573189779804
(Fx_popup_menu): Don't use Lisp_Object as integer.
Karl Heuer <kwzh@gnu.org>
parents:
16752
diff
changeset
|
764 xpos = (FONT_WIDTH (f->output_data.x->font) |
573189779804
(Fx_popup_menu): Don't use Lisp_Object as integer.
Karl Heuer <kwzh@gnu.org>
parents:
16752
diff
changeset
|
765 * XFASTINT (XWINDOW (window)->left)); |
573189779804
(Fx_popup_menu): Don't use Lisp_Object as integer.
Karl Heuer <kwzh@gnu.org>
parents:
16752
diff
changeset
|
766 ypos = (f->output_data.x->line_height |
573189779804
(Fx_popup_menu): Don't use Lisp_Object as integer.
Karl Heuer <kwzh@gnu.org>
parents:
16752
diff
changeset
|
767 * XFASTINT (XWINDOW (window)->top)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
768 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
769 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
770 /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME, |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
771 but I don't want to make one now. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
772 CHECK_WINDOW (window, 0); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
773 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
774 xpos += XINT (x); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
775 ypos += XINT (y); |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
776 |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
777 XSETFRAME (Vmenu_updating_frame, f); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
778 } |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
779 Vmenu_updating_frame = Qnil; |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
780 #endif /* HAVE_MENUS */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
781 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
782 title = Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
783 GCPRO1 (title); |
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
|
784 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
785 /* Decode the menu items from what was specified. */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
786 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
787 keymap = Fkeymapp (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
788 tem = Qnil; |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
789 if (CONSP (menu)) |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
790 tem = Fkeymapp (Fcar (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
791 if (!NILP (keymap)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
792 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
793 /* 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
|
794 Lisp_Object prompt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
795 keymap = get_keymap (menu); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
796 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
797 /* Extract the detailed info to make one pane. */ |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
798 keymap_panes (&menu, 1, NILP (position)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
799 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
800 /* 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
|
801 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
|
802 prompt = map_prompt (keymap); |
16411
939831bf2103
(Fx_popup_menu): Give the menu a title when the menu is a single keymap.
Richard M. Stallman <rms@gnu.org>
parents:
15943
diff
changeset
|
803 if (NILP (title) && !NILP (prompt)) |
939831bf2103
(Fx_popup_menu): Give the menu a title when the menu is a single keymap.
Richard M. Stallman <rms@gnu.org>
parents:
15943
diff
changeset
|
804 title = prompt; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
805 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
806 /* Make that be the pane title of the first pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
807 if (!NILP (prompt) && menu_items_n_panes >= 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
808 XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME] = prompt; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
809 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
810 keymaps = 1; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
811 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
812 else if (!NILP (tem)) |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
813 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
814 /* 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
|
815 int nmaps = XFASTINT (Flength (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
816 Lisp_Object *maps |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
817 = (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
|
818 int i; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
819 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
820 title = Qnil; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
821 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
822 /* 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
|
823 supplies the menu title. */ |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
824 for (tem = menu, i = 0; CONSP (tem); tem = Fcdr (tem)) |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
825 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
826 Lisp_Object prompt; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
827 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
828 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
|
829 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
830 prompt = map_prompt (keymap); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
831 if (NILP (title) && !NILP (prompt)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
832 title = prompt; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
833 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
834 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
835 /* Extract the detailed info to make one pane. */ |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
836 keymap_panes (maps, nmaps, NILP (position)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
837 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
838 /* Make the title be the pane title of the first pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
839 if (!NILP (title) && menu_items_n_panes >= 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
840 XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME] = title; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
841 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
842 keymaps = 1; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
843 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
844 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
845 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
846 /* We were given an old-fashioned menu. */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
847 title = Fcar (menu); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
848 CHECK_STRING (title, 1); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
849 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
850 list_of_panes (Fcdr (menu)); |
1828
1463592a6463
* xmenu.c (Fx_popup_menu): Don't forget to turn the frame-relative
Jim Blandy <jimb@redhat.com>
parents:
1821
diff
changeset
|
851 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
852 keymaps = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
853 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
854 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
855 if (NILP (position)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
856 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
857 discard_menu_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
858 UNGCPRO; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
859 return Qnil; |
118 | 860 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
861 |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
862 #ifdef HAVE_MENUS |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
863 /* Display them in a menu. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
864 BLOCK_INPUT; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
865 |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
866 selection = xmenu_show (f, xpos, ypos, for_click, |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
867 keymaps, title, &error_name); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
868 UNBLOCK_INPUT; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
869 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
870 discard_menu_items (); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
871 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
872 UNGCPRO; |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
873 #endif /* HAVE_MENUS */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
874 |
118 | 875 if (error_name) error (error_name); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
876 return selection; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
877 } |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
878 |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
879 #ifdef HAVE_MENUS |
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
880 |
6424
b3d22929b7c1
(Fx_popup_dialog, Fx_popup_menu): Require 2 args.
Richard M. Stallman <rms@gnu.org>
parents:
6406
diff
changeset
|
881 DEFUN ("x-popup-dialog", Fx_popup_dialog, Sx_popup_dialog, 2, 2, 0, |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
882 "Pop up a dialog box and return user's selection.\n\ |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
883 POSITION specifies which frame to use.\n\ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
884 This is normally a mouse button event or a window or frame.\n\ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
885 If POSITION is t, it means to use the frame the mouse is on.\n\ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
886 The dialog box appears in the middle of the specified frame.\n\ |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
887 \n\ |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
888 CONTENTS specifies the alternatives to display in the dialog box.\n\ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
889 It is a list of the form (TITLE ITEM1 ITEM2...).\n\ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
890 Each ITEM is a cons cell (STRING . VALUE).\n\ |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
891 The return value is VALUE from the chosen item.\n\n\ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
892 An ITEM may also be just a string--that makes a nonselectable item.\n\ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
893 An ITEM may also be nil--that means to put all preceding items\n\ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
894 on the left of the dialog box and all following items on the right.\n\ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
895 \(By default, approximately half appear on each side.)") |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
896 (position, contents) |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
897 Lisp_Object position, contents; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
898 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
899 FRAME_PTR f; |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
900 Lisp_Object window; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
901 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
902 check_x (); |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
903 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
904 /* Decode the first argument: find the window or frame to use. */ |
11907
0f03ad1cac1e
(Fx_popup_dialog): Treat (menu-bar) like t, for POSITION.
Karl Heuer <kwzh@gnu.org>
parents:
11898
diff
changeset
|
905 if (EQ (position, Qt) |
0f03ad1cac1e
(Fx_popup_dialog): Treat (menu-bar) like t, for POSITION.
Karl Heuer <kwzh@gnu.org>
parents:
11898
diff
changeset
|
906 || (CONSP (position) && EQ (XCONS (position)->car, Qmenu_bar))) |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
907 { |
6653
14a0a3fe93fd
(Fx_popup_dialog): If POSITION is t, use selected frame.
Richard M. Stallman <rms@gnu.org>
parents:
6625
diff
changeset
|
908 #if 0 /* Using the frame the mouse is on may not be right. */ |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
909 /* Use the mouse's current position. */ |
10835
cd9261d8d347
(Fx_popup_menu): Init f from selected_frame
Richard M. Stallman <rms@gnu.org>
parents:
10809
diff
changeset
|
910 FRAME_PTR new_f = selected_frame; |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
911 Lisp_Object bar_window; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
912 int part; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
913 unsigned long time; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
914 Lisp_Object x, y; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
915 |
11125
dc78213dd2b3
(Fx_popup_menu): Pass 1 for `insist' arg.
Richard M. Stallman <rms@gnu.org>
parents:
10835
diff
changeset
|
916 (*mouse_position_hook) (&new_f, 1, &bar_window, &part, &x, &y, &time); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
917 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
918 if (new_f != 0) |
9339
8a59acc95eea
(Fx_popup_menu, Fx_popup_dialog): Use new accessor macros instead of calling
Karl Heuer <kwzh@gnu.org>
parents:
9336
diff
changeset
|
919 XSETFRAME (window, new_f); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
920 else |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
921 window = selected_window; |
6653
14a0a3fe93fd
(Fx_popup_dialog): If POSITION is t, use selected frame.
Richard M. Stallman <rms@gnu.org>
parents:
6625
diff
changeset
|
922 #endif |
11907
0f03ad1cac1e
(Fx_popup_dialog): Treat (menu-bar) like t, for POSITION.
Karl Heuer <kwzh@gnu.org>
parents:
11898
diff
changeset
|
923 window = selected_window; |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
924 } |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
925 else if (CONSP (position)) |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
926 { |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
927 Lisp_Object tem; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
928 tem = Fcar (position); |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
929 if (CONSP (tem)) |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
930 window = Fcar (Fcdr (position)); |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
931 else |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
932 { |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
933 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
934 window = Fcar (tem); /* POSN_WINDOW (tem) */ |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
935 } |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
936 } |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
937 else if (WINDOWP (position) || FRAMEP (position)) |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
938 window = position; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
939 else |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
940 window = Qnil; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
941 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
942 /* Decode where to put the menu. */ |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
943 |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
944 if (FRAMEP (window)) |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
945 f = XFRAME (window); |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
946 else if (WINDOWP (window)) |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
947 { |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
948 CHECK_LIVE_WINDOW (window, 0); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
949 f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
950 } |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
951 else |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
952 /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME, |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
953 but I don't want to make one now. */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
954 CHECK_WINDOW (window, 0); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
955 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
956 #ifndef USE_X_TOOLKIT |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
957 /* Display a menu with these alternatives |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
958 in the middle of frame F. */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
959 { |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
960 Lisp_Object x, y, frame, newpos; |
9339
8a59acc95eea
(Fx_popup_menu, Fx_popup_dialog): Use new accessor macros instead of calling
Karl Heuer <kwzh@gnu.org>
parents:
9336
diff
changeset
|
961 XSETFRAME (frame, f); |
8a59acc95eea
(Fx_popup_menu, Fx_popup_dialog): Use new accessor macros instead of calling
Karl Heuer <kwzh@gnu.org>
parents:
9336
diff
changeset
|
962 XSETINT (x, x_pixel_width (f) / 2); |
8a59acc95eea
(Fx_popup_menu, Fx_popup_dialog): Use new accessor macros instead of calling
Karl Heuer <kwzh@gnu.org>
parents:
9336
diff
changeset
|
963 XSETINT (y, x_pixel_height (f) / 2); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
964 newpos = Fcons (Fcons (x, Fcons (y, Qnil)), Fcons (frame, Qnil)); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
965 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
966 return Fx_popup_menu (newpos, |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
967 Fcons (Fcar (contents), Fcons (contents, Qnil))); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
968 } |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
969 #else |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
970 { |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
971 Lisp_Object title; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
972 char *error_name; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
973 Lisp_Object selection; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
974 |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
975 /* Decode the dialog items from what was specified. */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
976 title = Fcar (contents); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
977 CHECK_STRING (title, 1); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
978 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
979 list_of_panes (Fcons (contents, Qnil)); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
980 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
981 /* Display them in a dialog box. */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
982 BLOCK_INPUT; |
11502
7ecd4aa33faa
(Fx_popup_dialog): Don't pass menubarp arg to xdialog_show.
Karl Heuer <kwzh@gnu.org>
parents:
11491
diff
changeset
|
983 selection = xdialog_show (f, 0, title, &error_name); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
984 UNBLOCK_INPUT; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
985 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
986 discard_menu_items (); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
987 |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
988 if (error_name) error (error_name); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
989 return selection; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
990 } |
6325
d6817c9c0413
Undo previous change. Instead:
Richard M. Stallman <rms@gnu.org>
parents:
6324
diff
changeset
|
991 #endif |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
992 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
993 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
994 #ifdef USE_X_TOOLKIT |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
995 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
996 /* Loop in Xt until the menu pulldown or dialog popup has been |
13821 | 997 popped down (deactivated). This is used for x-popup-menu |
998 and x-popup-dialog; it is not used for the menu bar any more. | |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
999 |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1000 NOTE: All calls to popup_get_selection should be protected |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1001 with BLOCK_INPUT, UNBLOCK_INPUT wrappers. */ |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1002 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1003 void |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1004 popup_get_selection (initial_event, dpyinfo, id) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1005 XEvent *initial_event; |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1006 struct x_display_info *dpyinfo; |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1007 LWLIB_ID id; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1008 { |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1009 XEvent event; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1010 |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1011 /* Define a queue to save up for later unreading |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1012 all X events that don't pertain to the menu. */ |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1013 struct event_queue |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1014 { |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1015 XEvent event; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1016 struct event_queue *next; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1017 }; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1018 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1019 struct event_queue *queue = NULL; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1020 struct event_queue *queue_tmp; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1021 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1022 if (initial_event) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1023 event = *initial_event; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1024 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1025 XtAppNextEvent (Xt_app_con, &event); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1026 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1027 while (1) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1028 { |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1029 /* Handle expose events for editor frames right away. */ |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1030 if (event.type == Expose) |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1031 process_expose_from_menu (event); |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1032 /* Make sure we don't consider buttons grabbed after menu goes. |
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1033 And make sure to deactivate for any ButtonRelease, |
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1034 even if XtDispatchEvent doesn't do that. */ |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1035 else if (event.type == ButtonRelease |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1036 && dpyinfo->display == event.xbutton.display) |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1037 { |
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1038 dpyinfo->grabbed &= ~(1 << event.xbutton.button); |
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1039 popup_activated_flag = 0; |
15839
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1040 #ifdef USE_MOTIF /* Pretending that the event came from a |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1041 Btn1Down seems the only way to convince Motif to |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1042 activate its callbacks; setting the XmNmenuPost |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1043 isn't working. --marcus@sysc.pdx.edu. */ |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1044 event.xbutton.button = 1; |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1045 #endif |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1046 } |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1047 /* If the user presses a key, deactivate the menu. |
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1048 The user is likely to do that if we get wedged. */ |
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1049 else if (event.type == KeyPress |
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1050 && dpyinfo->display == event.xbutton.display) |
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1051 { |
21268
74fc1642fe30
(popup_get_selection): On receiving a KeyPress event
Andreas Schwab <schwab@suse.de>
parents:
21244
diff
changeset
|
1052 KeySym keysym = XLookupKeysym (&event.xkey, 0); |
74fc1642fe30
(popup_get_selection): On receiving a KeyPress event
Andreas Schwab <schwab@suse.de>
parents:
21244
diff
changeset
|
1053 if (!IsModifierKey (keysym)) |
74fc1642fe30
(popup_get_selection): On receiving a KeyPress event
Andreas Schwab <schwab@suse.de>
parents:
21244
diff
changeset
|
1054 { |
74fc1642fe30
(popup_get_selection): On receiving a KeyPress event
Andreas Schwab <schwab@suse.de>
parents:
21244
diff
changeset
|
1055 popup_activated_flag = 0; |
74fc1642fe30
(popup_get_selection): On receiving a KeyPress event
Andreas Schwab <schwab@suse.de>
parents:
21244
diff
changeset
|
1056 break; |
74fc1642fe30
(popup_get_selection): On receiving a KeyPress event
Andreas Schwab <schwab@suse.de>
parents:
21244
diff
changeset
|
1057 } |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1058 } |
13071
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1059 /* Button presses outside the menu also pop it down. */ |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1060 else if (event.type == ButtonPress |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1061 && event.xany.display == dpyinfo->display |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1062 && x_any_window_to_frame (dpyinfo, event.xany.window)) |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1063 { |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1064 popup_activated_flag = 0; |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1065 break; |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
1066 } |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1067 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1068 /* Queue all events not for this popup, |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1069 except for Expose, which we've already handled, and ButtonRelease. |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1070 Note that the X window is associated with the frame if this |
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1071 is a menu bar popup, but not if it's a dialog box. So we use |
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1072 x_non_menubar_window_to_frame, not x_any_window_to_frame. */ |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1073 if (event.type != Expose |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1074 && !(event.type == ButtonRelease |
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1075 && dpyinfo->display == event.xbutton.display) |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1076 && (event.xany.display != dpyinfo->display |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1077 || x_non_menubar_window_to_frame (dpyinfo, event.xany.window))) |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1078 { |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1079 queue_tmp = (struct event_queue *) malloc (sizeof (struct event_queue)); |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1080 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1081 if (queue_tmp != NULL) |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1082 { |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1083 queue_tmp->event = event; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1084 queue_tmp->next = queue; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1085 queue = queue_tmp; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1086 } |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1087 } |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1088 else |
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1089 XtDispatchEvent (&event); |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1090 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1091 if (!popup_activated ()) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1092 break; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1093 XtAppNextEvent (Xt_app_con, &event); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1094 } |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1095 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1096 /* Unread any events that we got but did not handle. */ |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1097 while (queue != NULL) |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1098 { |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1099 queue_tmp = queue; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1100 XPutBackEvent (queue_tmp->event.xany.display, &queue_tmp->event); |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1101 queue = queue_tmp->next; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1102 free ((char *)queue_tmp); |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1103 /* Cause these events to get read as soon as we UNBLOCK_INPUT. */ |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1104 interrupt_input_pending = 1; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1105 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1106 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1107 |
12661 | 1108 /* Activate the menu bar of frame F. |
1109 This is called from keyboard.c when it gets the | |
1110 menu_bar_activate_event out of the Emacs event queue. | |
1111 | |
1112 To activate the menu bar, we use the X button-press event | |
15710
85d87cd0f655
(x_activate_menubar): Allow any event, not just ButtonPress.
Karl Heuer <kwzh@gnu.org>
parents:
15628
diff
changeset
|
1113 that was saved in saved_menu_event. |
12661 | 1114 That makes the toolkit do its thing. |
1115 | |
1116 But first we recompute the menu bar contents (the whole tree). | |
1117 | |
1118 The reason for saving the button event until here, instead of | |
1119 passing it to the toolkit right away, is that we can safely | |
1120 execute Lisp code. */ | |
1121 | |
21514 | 1122 void |
12661 | 1123 x_activate_menubar (f) |
1124 FRAME_PTR f; | |
1125 { | |
15710
85d87cd0f655
(x_activate_menubar): Allow any event, not just ButtonPress.
Karl Heuer <kwzh@gnu.org>
parents:
15628
diff
changeset
|
1126 if (!f->output_data.x->saved_menu_event->type) |
12661 | 1127 return; |
1128 | |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1129 set_frame_menubar (f, 0, 1); |
12661 | 1130 BLOCK_INPUT; |
15710
85d87cd0f655
(x_activate_menubar): Allow any event, not just ButtonPress.
Karl Heuer <kwzh@gnu.org>
parents:
15628
diff
changeset
|
1131 XtDispatchEvent ((XEvent *) f->output_data.x->saved_menu_event); |
12661 | 1132 UNBLOCK_INPUT; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1133 #ifdef USE_MOTIF |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1134 if (f->output_data.x->saved_menu_event->type == ButtonRelease) |
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1135 pending_menu_activation = 1; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1136 #endif |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1137 |
12661 | 1138 /* Ignore this if we get it a second time. */ |
15710
85d87cd0f655
(x_activate_menubar): Allow any event, not just ButtonPress.
Karl Heuer <kwzh@gnu.org>
parents:
15628
diff
changeset
|
1139 f->output_data.x->saved_menu_event->type = 0; |
12661 | 1140 } |
1141 | |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1142 /* Detect if a dialog or menu has been posted. */ |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1143 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1144 int |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1145 popup_activated () |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1146 { |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1147 return popup_activated_flag; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1148 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1149 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1150 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1151 /* This callback is invoked when the user selects a menubar cascade |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1152 pushbutton, but before the pulldown menu is posted. */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1153 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1154 static void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1155 popup_activate_callback (widget, id, client_data) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1156 Widget widget; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1157 LWLIB_ID id; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1158 XtPointer client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1159 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1160 popup_activated_flag = 1; |
118 | 1161 } |
1162 | |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1163 /* This callback is called from the menu bar pulldown menu |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1164 when the user makes a selection. |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1165 Figure out what the user chose |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1166 and put the appropriate events into the keyboard buffer. */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1167 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1168 static void |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1169 menubar_selection_callback (widget, id, client_data) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1170 Widget widget; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1171 LWLIB_ID id; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1172 XtPointer client_data; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1173 { |
11655
a9f93ce6e1b4
(xmenu_show, menubar_selection_callback): Move declaration
Karl Heuer <kwzh@gnu.org>
parents:
11614
diff
changeset
|
1174 Lisp_Object prefix, entry; |
12661 | 1175 FRAME_PTR f = menubar_id_to_frame (id); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1176 Lisp_Object vector; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1177 Lisp_Object *subprefix_stack; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1178 int submenu_depth = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1179 int i; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1180 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1181 if (!f) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1182 return; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1183 subprefix_stack = (Lisp_Object *) alloca (f->menu_bar_items_used * sizeof (Lisp_Object)); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1184 vector = f->menu_bar_vector; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1185 prefix = Qnil; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1186 i = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1187 while (i < f->menu_bar_items_used) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1188 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1189 if (EQ (XVECTOR (vector)->contents[i], Qnil)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1190 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1191 subprefix_stack[submenu_depth++] = prefix; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1192 prefix = entry; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1193 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1194 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1195 else if (EQ (XVECTOR (vector)->contents[i], Qlambda)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1196 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1197 prefix = subprefix_stack[--submenu_depth]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1198 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1199 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1200 else if (EQ (XVECTOR (vector)->contents[i], Qt)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1201 { |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1202 prefix = XVECTOR (vector)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1203 i += MENU_ITEMS_PANE_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1204 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1205 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1206 { |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1207 entry = XVECTOR (vector)->contents[i + MENU_ITEMS_ITEM_VALUE]; |
11266
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1208 /* The EMACS_INT cast avoids a warning. There's no problem |
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1209 as long as pointers have enough bits to hold small integers. */ |
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1210 if ((int) (EMACS_INT) client_data == i) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1211 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1212 int j; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1213 struct input_event buf; |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1214 Lisp_Object frame; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1215 |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1216 XSETFRAME (frame, f); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1217 buf.kind = menu_bar_event; |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
1218 buf.frame_or_window = Fcons (frame, Fcons (Qmenu_bar, Qnil)); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1219 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1220 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1221 for (j = 0; j < submenu_depth; j++) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1222 if (!NILP (subprefix_stack[j])) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1223 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1224 buf.kind = menu_bar_event; |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1225 buf.frame_or_window = Fcons (frame, subprefix_stack[j]); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1226 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1227 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1228 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1229 if (!NILP (prefix)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1230 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1231 buf.kind = menu_bar_event; |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1232 buf.frame_or_window = Fcons (frame, prefix); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1233 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1234 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1235 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1236 buf.kind = menu_bar_event; |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1237 buf.frame_or_window = Fcons (frame, entry); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1238 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1239 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1240 return; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1241 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1242 i += MENU_ITEMS_ITEM_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1243 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1244 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1245 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1246 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1247 /* This callback is invoked when a dialog or menu is finished being |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1248 used and has been unposted. */ |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1249 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1250 static void |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1251 popup_deactivate_callback (widget, id, client_data) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1252 Widget widget; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1253 LWLIB_ID id; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1254 XtPointer client_data; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1255 { |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1256 popup_activated_flag = 0; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1257 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1258 |
14553
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1259 /* Allocate a widget_value, blocking input. */ |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1260 |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1261 widget_value * |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1262 xmalloc_widget_value () |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1263 { |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1264 widget_value *value; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1265 |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1266 BLOCK_INPUT; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1267 value = malloc_widget_value (); |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1268 UNBLOCK_INPUT; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1269 |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1270 return value; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1271 } |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
1272 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1273 /* This recursively calls free_widget_value on the tree of widgets. |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1274 It must free all data that was malloc'ed for these widget_values. |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1275 In Emacs, many slots are pointers into the data of Lisp_Strings, and |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1276 must be left alone. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1277 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1278 void |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1279 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
|
1280 widget_value *wv; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1281 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1282 if (! wv) return; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1283 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1284 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
|
1285 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1286 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
|
1287 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1288 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
|
1289 wv->contents = (widget_value *) 0xDEADBEEF; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1290 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1291 if (wv->next) |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1292 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1293 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
|
1294 wv->next = (widget_value *) 0xDEADBEEF; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1295 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1296 BLOCK_INPUT; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1297 free_widget_value (wv); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1298 UNBLOCK_INPUT; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1299 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1300 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1301 /* Return a tree of widget_value structures for a menu bar item |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1302 whose event type is ITEM_KEY (with string ITEM_NAME) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1303 and whose contents come from the list of keymaps MAPS. */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1304 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1305 static widget_value * |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1306 single_submenu (item_key, item_name, maps) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1307 Lisp_Object item_key, item_name, maps; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1308 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1309 widget_value *wv, *prev_wv, *save_wv, *first_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1310 int i; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1311 int submenu_depth = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1312 Lisp_Object length; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1313 int len; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1314 Lisp_Object *mapvec; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1315 widget_value **submenu_stack; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1316 int mapno; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1317 int previous_items = menu_items_used; |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1318 int top_level_items = 0; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1319 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1320 length = Flength (maps); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1321 len = XINT (length); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1322 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1323 /* Convert the list MAPS into a vector MAPVEC. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1324 mapvec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1325 for (i = 0; i < len; i++) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1326 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1327 mapvec[i] = Fcar (maps); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1328 maps = Fcdr (maps); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1329 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1330 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1331 menu_items_n_panes = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1332 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1333 /* Loop over the given keymaps, making a pane for each map. |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1334 But don't make a pane that is empty--ignore that map instead. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1335 for (i = 0; i < len; i++) |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1336 { |
15311
a9ed91ec0700
(single_submenu): Handle non-keymap lists like symbols.
Richard M. Stallman <rms@gnu.org>
parents:
15107
diff
changeset
|
1337 if (SYMBOLP (mapvec[i]) |
a9ed91ec0700
(single_submenu): Handle non-keymap lists like symbols.
Richard M. Stallman <rms@gnu.org>
parents:
15107
diff
changeset
|
1338 || (CONSP (mapvec[i]) |
a9ed91ec0700
(single_submenu): Handle non-keymap lists like symbols.
Richard M. Stallman <rms@gnu.org>
parents:
15107
diff
changeset
|
1339 && NILP (Fkeymapp (mapvec[i])))) |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1340 { |
15311
a9ed91ec0700
(single_submenu): Handle non-keymap lists like symbols.
Richard M. Stallman <rms@gnu.org>
parents:
15107
diff
changeset
|
1341 /* Here we have a command at top level in the menu bar |
a9ed91ec0700
(single_submenu): Handle non-keymap lists like symbols.
Richard M. Stallman <rms@gnu.org>
parents:
15107
diff
changeset
|
1342 as opposed to a submenu. */ |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1343 top_level_items = 1; |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1344 push_menu_pane (Qnil, Qnil); |
24993 | 1345 push_menu_item (item_name, Qt, item_key, mapvec[i], Qnil, Qnil, Qnil); |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1346 } |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1347 else |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
1348 single_keymap_panes (mapvec[i], item_name, item_key, 0, 10); |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1349 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1350 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1351 /* Create a tree of widget_value objects |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1352 representing the panes and their items. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1353 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1354 submenu_stack |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1355 = (widget_value **) alloca (menu_items_used * sizeof (widget_value *)); |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1356 wv = xmalloc_widget_value (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1357 wv->name = "menu"; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1358 wv->value = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1359 wv->enabled = 1; |
24993 | 1360 wv->button_type = BUTTON_TYPE_NONE; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1361 first_wv = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1362 save_wv = 0; |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1363 prev_wv = 0; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1364 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1365 /* Loop over all panes and items made during this call |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1366 and construct a tree of widget_value objects. |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1367 Ignore the panes and items made by previous calls to |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1368 single_submenu, even though those are also in menu_items. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1369 i = previous_items; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1370 while (i < menu_items_used) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1371 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1372 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1373 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1374 submenu_stack[submenu_depth++] = save_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1375 save_wv = prev_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1376 prev_wv = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1377 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1378 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1379 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1380 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1381 prev_wv = save_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1382 save_wv = submenu_stack[--submenu_depth]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1383 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1384 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1385 else if (EQ (XVECTOR (menu_items)->contents[i], Qt) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1386 && submenu_depth != 0) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1387 i += MENU_ITEMS_PANE_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1388 /* Ignore a nil in the item list. |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1389 It's meaningful only for dialog boxes. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1390 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1391 i += 1; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1392 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1393 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1394 /* Create a new pane. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1395 Lisp_Object pane_name, prefix; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1396 char *pane_string; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1397 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1398 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1399 #ifndef HAVE_MULTILINGUAL_MENU |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1400 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1401 pane_name = string_make_unibyte (pane_name); |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1402 #endif |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1403 pane_string = (NILP (pane_name) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1404 ? "" : (char *) XSTRING (pane_name)->data); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1405 /* If there is just one top-level pane, put all its items directly |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1406 under the top-level menu. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1407 if (menu_items_n_panes == 1) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1408 pane_string = ""; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1409 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1410 /* If the pane has a meaningful name, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1411 make the pane a top-level menu item |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1412 with its items as a submenu beneath it. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1413 if (strcmp (pane_string, "")) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1414 { |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1415 wv = xmalloc_widget_value (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1416 if (save_wv) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1417 save_wv->next = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1418 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1419 first_wv->contents = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1420 wv->name = pane_string; |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
1421 /* Ignore the @ that means "separate pane". |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
1422 This is a kludge, but this isn't worth more time. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
1423 if (!NILP (prefix) && wv->name[0] == '@') |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1424 wv->name++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1425 wv->value = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1426 wv->enabled = 1; |
24993 | 1427 wv->button_type = BUTTON_TYPE_NONE; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1428 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1429 save_wv = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1430 prev_wv = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1431 i += MENU_ITEMS_PANE_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1432 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1433 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1434 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1435 /* Create a new item within current pane. */ |
24993 | 1436 Lisp_Object item_name, enable, descrip, def, type, selected; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1437 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1438 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1439 descrip |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1440 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
1441 def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION]; |
24993 | 1442 type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE]; |
1443 selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED]; | |
1444 | |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1445 #ifndef HAVE_MULTILINGUAL_MENU |
24993 | 1446 if (STRING_MULTIBYTE (item_name)) |
1447 item_name = string_make_unibyte (item_name); | |
1448 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) | |
1449 descrip = string_make_unibyte (descrip); | |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1450 #endif |
24993 | 1451 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1452 wv = xmalloc_widget_value (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1453 if (prev_wv) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1454 prev_wv->next = wv; |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1455 else |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1456 save_wv->contents = wv; |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1457 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1458 wv->name = (char *) XSTRING (item_name)->data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1459 if (!NILP (descrip)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1460 wv->key = (char *) XSTRING (descrip)->data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1461 wv->value = 0; |
11266
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1462 /* The EMACS_INT cast avoids a warning. There's no problem |
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1463 as long as pointers have enough bits to hold small integers. */ |
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1464 wv->call_data = (!NILP (def) ? (void *) (EMACS_INT) i : 0); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1465 wv->enabled = !NILP (enable); |
24993 | 1466 |
1467 if (NILP (type)) | |
1468 wv->button_type = BUTTON_TYPE_NONE; | |
1469 else if (EQ (type, QCradio)) | |
1470 wv->button_type = BUTTON_TYPE_RADIO; | |
1471 else if (EQ (type, QCtoggle)) | |
1472 wv->button_type = BUTTON_TYPE_TOGGLE; | |
1473 else | |
1474 abort (); | |
1475 | |
1476 wv->selected = !NILP (selected); | |
1477 | |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1478 prev_wv = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1479 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1480 i += MENU_ITEMS_ITEM_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1481 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1482 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1483 |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1484 /* If we have just one "menu item" |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1485 that was originally a button, return it by itself. */ |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1486 if (top_level_items && first_wv->contents && first_wv->contents->next == 0) |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1487 { |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1488 wv = first_wv->contents; |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1489 free_widget_value (first_wv); |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1490 return wv; |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1491 } |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1492 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1493 return first_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1494 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1495 |
6200
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1496 extern void EmacsFrameSetCharSize (); |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1497 |
12018
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1498 /* Recompute all the widgets of frame F, when the menu bar |
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1499 has been changed. */ |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1500 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1501 static void |
6481
55236c5bca7c
(update_frame_menubar): Function renamed from update_one_frame_psheets.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6439
diff
changeset
|
1502 update_frame_menubar (f) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1503 FRAME_PTR f; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1504 { |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1505 struct x_output *x = f->output_data.x; |
6200
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1506 int columns, rows; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1507 int menubar_changed; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1508 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1509 Dimension shell_height; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1510 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1511 /* We assume the menubar contents has changed if the global flag is set, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1512 or if the current buffer has changed, or if the menubar has never |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1513 been updated before. |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1514 */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1515 menubar_changed = (x->menubar_widget |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1516 && !XtIsManaged (x->menubar_widget)); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1517 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1518 if (! (menubar_changed)) |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1519 return; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1520 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1521 BLOCK_INPUT; |
6200
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1522 /* Save the size of the frame because the pane widget doesn't accept to |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1523 resize itself. So force it. */ |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1524 columns = f->width; |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1525 rows = f->height; |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1526 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1527 /* Do the voodoo which means "I'm changing lots of things, don't try to |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1528 refigure sizes until I'm done." */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1529 lw_refigure_widget (x->column_widget, False); |
6200
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1530 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1531 /* 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
|
1532 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
|
1533 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
|
1534 */ |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1535 XtUnmanageChild (x->edit_widget); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1536 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1537 /* 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
|
1538 should be there. |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1539 */ |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1540 if (menubar_changed) |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1541 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1542 XtManageChild (x->menubar_widget); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1543 XtMapWidget (x->menubar_widget); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1544 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
|
1545 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1546 |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1547 /* Re-manage the text-area widget, and then thrash the sizes. */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1548 XtManageChild (x->edit_widget); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1549 lw_refigure_widget (x->column_widget, True); |
6200
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1550 |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1551 /* Force the pane widget to resize itself with the right values. */ |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1552 EmacsFrameSetCharSize (x->edit_widget, columns, rows); |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1553 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1554 UNBLOCK_INPUT; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1555 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1556 |
12018
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1557 /* Set the contents of the menubar widgets of frame F. |
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1558 The argument FIRST_TIME is currently ignored; |
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1559 it is set the first time this is called, from initialize_frame_menubar. */ |
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1560 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1561 void |
12661 | 1562 set_frame_menubar (f, first_time, deep_p) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1563 FRAME_PTR f; |
6605
f5b781f33789
(set_frame_menubar): New arg, first_time.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6526
diff
changeset
|
1564 int first_time; |
12661 | 1565 int deep_p; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1566 { |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1567 Widget menubar_widget = f->output_data.x->menubar_widget; |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
1568 Lisp_Object tail, items, frame; |
9725
98d374d51f4d
(set_frame_menubar): Don't copy string during GC risk.
Karl Heuer <kwzh@gnu.org>
parents:
9649
diff
changeset
|
1569 widget_value *wv, *first_wv, *prev_wv = 0; |
6172
57d031171fa2
(map_event_to_object, set_frame_menubar):
Richard M. Stallman <rms@gnu.org>
parents:
6115
diff
changeset
|
1570 int i; |
12661 | 1571 LWLIB_ID id; |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1572 |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
1573 XSETFRAME (Vmenu_updating_frame, f); |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
1574 |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1575 if (f->output_data.x->id == 0) |
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1576 f->output_data.x->id = next_menubar_widget_id++; |
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1577 id = f->output_data.x->id; |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
1578 |
12661 | 1579 if (! menubar_widget) |
1580 deep_p = 1; | |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1581 else if (pending_menu_activation && !deep_p) |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1582 deep_p = 1; |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1583 /* Make the first call for any given frame always go deep. */ |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1584 else if (!f->output_data.x->saved_menu_event && !deep_p) |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1585 { |
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1586 deep_p = 1; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1587 f->output_data.x->saved_menu_event = (XEvent*)xmalloc (sizeof (XEvent)); |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1588 f->output_data.x->saved_menu_event->type = 0; |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1589 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1590 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1591 wv = xmalloc_widget_value (); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1592 wv->name = "menubar"; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1593 wv->value = 0; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1594 wv->enabled = 1; |
24993 | 1595 wv->button_type = BUTTON_TYPE_NONE; |
9725
98d374d51f4d
(set_frame_menubar): Don't copy string during GC risk.
Karl Heuer <kwzh@gnu.org>
parents:
9649
diff
changeset
|
1596 first_wv = wv; |
12661 | 1597 |
1598 if (deep_p) | |
1599 { | |
1600 /* Make a widget-value tree representing the entire menu trees. */ | |
1601 | |
1602 struct buffer *prev = current_buffer; | |
1603 Lisp_Object buffer; | |
1604 int specpdl_count = specpdl_ptr - specpdl; | |
1605 int previous_menu_items_used = f->menu_bar_items_used; | |
1606 Lisp_Object *previous_items | |
1607 = (Lisp_Object *) alloca (previous_menu_items_used | |
1608 * sizeof (Lisp_Object)); | |
12634
eec80ea06395
(set_frame_menubar): If the Lisp-level menu bar menus
Richard M. Stallman <rms@gnu.org>
parents:
12625
diff
changeset
|
1609 |
17554
0a75fcee3cb8
(set_frame_menubar): When widget is new, forget records of old contents.
Richard M. Stallman <rms@gnu.org>
parents:
17364
diff
changeset
|
1610 /* If we are making a new widget, its contents are empty, |
0a75fcee3cb8
(set_frame_menubar): When widget is new, forget records of old contents.
Richard M. Stallman <rms@gnu.org>
parents:
17364
diff
changeset
|
1611 do always reinitialize them. */ |
0a75fcee3cb8
(set_frame_menubar): When widget is new, forget records of old contents.
Richard M. Stallman <rms@gnu.org>
parents:
17364
diff
changeset
|
1612 if (! menubar_widget) |
0a75fcee3cb8
(set_frame_menubar): When widget is new, forget records of old contents.
Richard M. Stallman <rms@gnu.org>
parents:
17364
diff
changeset
|
1613 previous_menu_items_used = 0; |
0a75fcee3cb8
(set_frame_menubar): When widget is new, forget records of old contents.
Richard M. Stallman <rms@gnu.org>
parents:
17364
diff
changeset
|
1614 |
12661 | 1615 buffer = XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer; |
1616 specbind (Qinhibit_quit, Qt); | |
1617 /* Don't let the debugger step into this code | |
1618 because it is not reentrant. */ | |
1619 specbind (Qdebug_on_next_call, Qnil); | |
1620 | |
21178
85fd58cb0654
(set_frame_menubar): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
20630
diff
changeset
|
1621 record_unwind_protect (Fset_match_data, Fmatch_data (Qnil, Qnil)); |
12661 | 1622 if (NILP (Voverriding_local_map_menu_flag)) |
1623 { | |
1624 specbind (Qoverriding_terminal_local_map, Qnil); | |
1625 specbind (Qoverriding_local_map, Qnil); | |
1626 } | |
1627 | |
1628 set_buffer_internal_1 (XBUFFER (buffer)); | |
12634
eec80ea06395
(set_frame_menubar): If the Lisp-level menu bar menus
Richard M. Stallman <rms@gnu.org>
parents:
12625
diff
changeset
|
1629 |
12661 | 1630 /* Run the Lucid hook. */ |
1631 call1 (Vrun_hooks, Qactivate_menubar_hook); | |
1632 /* If it has changed current-menubar from previous value, | |
1633 really recompute the menubar from the value. */ | |
1634 if (! NILP (Vlucid_menu_bar_dirty_flag)) | |
1635 call0 (Qrecompute_lucid_menubar); | |
14298 | 1636 safe_run_hooks (Qmenu_bar_update_hook); |
12661 | 1637 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); |
1638 | |
1639 items = FRAME_MENU_BAR_ITEMS (f); | |
1640 | |
1641 inhibit_garbage_collection (); | |
1642 | |
1643 /* Save the frame's previous menu bar contents data. */ | |
1644 bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items, | |
1645 previous_menu_items_used * sizeof (Lisp_Object)); | |
1646 | |
1647 /* Fill in the current menu bar contents. */ | |
1648 menu_items = f->menu_bar_vector; | |
1649 menu_items_allocated = XVECTOR (menu_items)->size; | |
1650 init_menu_items (); | |
15107
e025990722ca
(set_frame_menubar): FRAME_MENU_BAR_ITEMS now has four elements per item.
Richard M. Stallman <rms@gnu.org>
parents:
14741
diff
changeset
|
1651 for (i = 0; i < XVECTOR (items)->size; i += 4) |
12661 | 1652 { |
1653 Lisp_Object key, string, maps; | |
1654 | |
1655 key = XVECTOR (items)->contents[i]; | |
1656 string = XVECTOR (items)->contents[i + 1]; | |
1657 maps = XVECTOR (items)->contents[i + 2]; | |
1658 if (NILP (string)) | |
1659 break; | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1660 |
12661 | 1661 wv = single_submenu (key, string, maps); |
1662 if (prev_wv) | |
1663 prev_wv->next = wv; | |
1664 else | |
1665 first_wv->contents = wv; | |
1666 /* Don't set wv->name here; GC during the loop might relocate it. */ | |
1667 wv->enabled = 1; | |
24993 | 1668 wv->button_type = BUTTON_TYPE_NONE; |
12661 | 1669 prev_wv = wv; |
1670 } | |
1671 | |
1672 finish_menu_items (); | |
1673 | |
1674 set_buffer_internal_1 (prev); | |
1675 unbind_to (specpdl_count, Qnil); | |
1676 | |
1677 /* If there has been no change in the Lisp-level contents | |
1678 of the menu bar, skip redisplaying it. Just exit. */ | |
1679 | |
1680 for (i = 0; i < previous_menu_items_used; i++) | |
1681 if (menu_items_used == i | |
17364
573189779804
(Fx_popup_menu): Don't use Lisp_Object as integer.
Karl Heuer <kwzh@gnu.org>
parents:
16752
diff
changeset
|
1682 || (!EQ (previous_items[i], XVECTOR (menu_items)->contents[i]))) |
12661 | 1683 break; |
13654
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
1684 if (i == menu_items_used && i == previous_menu_items_used && i != 0) |
12661 | 1685 { |
1686 free_menubar_widget_value_tree (first_wv); | |
1687 menu_items = Qnil; | |
1688 | |
1689 return; | |
1690 } | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1691 |
12661 | 1692 /* Now GC cannot happen during the lifetime of the widget_value, |
1693 so it's safe to store data from a Lisp_String. */ | |
1694 wv = first_wv->contents; | |
15107
e025990722ca
(set_frame_menubar): FRAME_MENU_BAR_ITEMS now has four elements per item.
Richard M. Stallman <rms@gnu.org>
parents:
14741
diff
changeset
|
1695 for (i = 0; i < XVECTOR (items)->size; i += 4) |
12661 | 1696 { |
1697 Lisp_Object string; | |
1698 string = XVECTOR (items)->contents[i + 1]; | |
1699 if (NILP (string)) | |
1700 break; | |
1701 wv->name = (char *) XSTRING (string)->data; | |
1702 wv = wv->next; | |
1703 } | |
1704 | |
1705 f->menu_bar_vector = menu_items; | |
1706 f->menu_bar_items_used = menu_items_used; | |
1707 menu_items = Qnil; | |
1708 } | |
1709 else | |
1710 { | |
1711 /* Make a widget-value tree containing | |
1712 just the top level menu bar strings. */ | |
1713 | |
1714 items = FRAME_MENU_BAR_ITEMS (f); | |
15107
e025990722ca
(set_frame_menubar): FRAME_MENU_BAR_ITEMS now has four elements per item.
Richard M. Stallman <rms@gnu.org>
parents:
14741
diff
changeset
|
1715 for (i = 0; i < XVECTOR (items)->size; i += 4) |
12661 | 1716 { |
1717 Lisp_Object string; | |
1718 | |
1719 string = XVECTOR (items)->contents[i + 1]; | |
1720 if (NILP (string)) | |
1721 break; | |
1722 | |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1723 wv = xmalloc_widget_value (); |
12661 | 1724 wv->name = (char *) XSTRING (string)->data; |
1725 wv->value = 0; | |
1726 wv->enabled = 1; | |
24993 | 1727 wv->button_type = BUTTON_TYPE_NONE; |
15785
9902d8a8a548
(set_frame_menubar): Use -1 for call_data
Richard M. Stallman <rms@gnu.org>
parents:
15710
diff
changeset
|
1728 /* This prevents lwlib from assuming this |
9902d8a8a548
(set_frame_menubar): Use -1 for call_data
Richard M. Stallman <rms@gnu.org>
parents:
15710
diff
changeset
|
1729 menu item is really supposed to be empty. */ |
9902d8a8a548
(set_frame_menubar): Use -1 for call_data
Richard M. Stallman <rms@gnu.org>
parents:
15710
diff
changeset
|
1730 /* The EMACS_INT cast avoids a warning. |
9902d8a8a548
(set_frame_menubar): Use -1 for call_data
Richard M. Stallman <rms@gnu.org>
parents:
15710
diff
changeset
|
1731 This value just has to be different from small integers. */ |
9902d8a8a548
(set_frame_menubar): Use -1 for call_data
Richard M. Stallman <rms@gnu.org>
parents:
15710
diff
changeset
|
1732 wv->call_data = (void *) (EMACS_INT) (-1); |
12661 | 1733 |
1734 if (prev_wv) | |
1735 prev_wv->next = wv; | |
1736 else | |
1737 first_wv->contents = wv; | |
1738 prev_wv = wv; | |
1739 } | |
13654
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
1740 |
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
1741 /* Forget what we thought we knew about what is in the |
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
1742 detailed contents of the menu bar menus. |
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
1743 Changing the top level always destroys the contents. */ |
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
1744 f->menu_bar_items_used = 0; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1745 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1746 |
12661 | 1747 /* Create or update the menu bar widget. */ |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1748 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1749 BLOCK_INPUT; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1750 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1751 if (menubar_widget) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1752 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1753 /* Disable resizing (done for Motif!) */ |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1754 lw_allow_resizing (f->output_data.x->widget, False); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1755 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1756 /* The third arg is DEEP_P, which says to consider the entire |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1757 menu trees we supply, rather than just the menu bar item names. */ |
12661 | 1758 lw_modify_all_widgets (id, first_wv, deep_p); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1759 |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1760 /* Re-enable the edit widget to resize. */ |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1761 lw_allow_resizing (f->output_data.x->widget, True); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1762 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1763 else |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1764 { |
12661 | 1765 menubar_widget = lw_create_widget ("menubar", "menubar", id, first_wv, |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1766 f->output_data.x->column_widget, |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1767 0, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1768 popup_activate_callback, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1769 menubar_selection_callback, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1770 popup_deactivate_callback); |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1771 f->output_data.x->menubar_widget = menubar_widget; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1772 } |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1773 |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1774 { |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1775 int menubar_size |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1776 = (f->output_data.x->menubar_widget |
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1777 ? (f->output_data.x->menubar_widget->core.height |
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1778 + f->output_data.x->menubar_widget->core.border_width) |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1779 : 0); |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1780 |
15943
16fb6dcfa4e8
(set_frame_menubar): Don't add ibw to menubar_size.
Richard M. Stallman <rms@gnu.org>
parents:
15912
diff
changeset
|
1781 #if 0 /* Experimentally, we now get the right results |
16fb6dcfa4e8
(set_frame_menubar): Don't add ibw to menubar_size.
Richard M. Stallman <rms@gnu.org>
parents:
15912
diff
changeset
|
1782 for -geometry -0-0 without this. 24 Aug 96, rms. */ |
13489
ddf90bfd3744
Don't include Xaw/Paned.h unless USE_LUCID is defined.
Richard M. Stallman <rms@gnu.org>
parents:
13071
diff
changeset
|
1783 #ifdef USE_LUCID |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1784 if (FRAME_EXTERNAL_MENU_BAR (f)) |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1785 { |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1786 Dimension ibw = 0; |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1787 XtVaGetValues (f->output_data.x->column_widget, |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1788 XtNinternalBorderWidth, &ibw, NULL); |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1789 menubar_size += ibw; |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1790 } |
13489
ddf90bfd3744
Don't include Xaw/Paned.h unless USE_LUCID is defined.
Richard M. Stallman <rms@gnu.org>
parents:
13071
diff
changeset
|
1791 #endif /* USE_LUCID */ |
15943
16fb6dcfa4e8
(set_frame_menubar): Don't add ibw to menubar_size.
Richard M. Stallman <rms@gnu.org>
parents:
15912
diff
changeset
|
1792 #endif /* 0 */ |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1793 |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1794 f->output_data.x->menubar_height = menubar_size; |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
1795 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1796 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1797 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
|
1798 |
12018
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1799 update_frame_menubar (f); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1800 |
12634
eec80ea06395
(set_frame_menubar): If the Lisp-level menu bar menus
Richard M. Stallman <rms@gnu.org>
parents:
12625
diff
changeset
|
1801 UNBLOCK_INPUT; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1802 } |
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
|
1803 |
14036 | 1804 /* Called from Fx_create_frame to create the initial menubar of a frame |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1805 before it is mapped, so that the window is mapped with the menubar already |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1806 there instead of us tacking it on later and thrashing the window after it |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1807 is visible. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1808 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1809 void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1810 initialize_frame_menubar (f) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1811 FRAME_PTR f; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1812 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1813 /* This function is called before the first chance to redisplay |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1814 the frame. It has to be, so the frame will have the right size. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1815 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); |
12661 | 1816 set_frame_menubar (f, 1, 1); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1817 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1818 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1819 /* Get rid of the menu bar of frame F, and free its storage. |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1820 This is used when deleting a frame, and when turning off the menu bar. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1821 |
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
|
1822 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
|
1823 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
|
1824 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
|
1825 { |
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
|
1826 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
|
1827 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
|
1828 |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1829 menubar_widget = f->output_data.x->menubar_widget; |
19624
c73494a6bcd3
(free_frame_menubar): Clear menubar_height field.
Richard M. Stallman <rms@gnu.org>
parents:
17709
diff
changeset
|
1830 |
c73494a6bcd3
(free_frame_menubar): Clear menubar_height field.
Richard M. Stallman <rms@gnu.org>
parents:
17709
diff
changeset
|
1831 f->output_data.x->menubar_height = 0; |
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
|
1832 |
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
|
1833 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
|
1834 { |
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
|
1835 BLOCK_INPUT; |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1836 lw_destroy_all_widgets ((LWLIB_ID) f->output_data.x->id); |
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
|
1837 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
|
1838 } |
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
|
1839 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1840 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1841 #endif /* USE_X_TOOLKIT */ |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1842 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1843 /* xmenu_show actually displays a menu using the panes and items in menu_items |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1844 and returns the value selected from it. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1845 There are two versions of xmenu_show, one for Xt and one for Xlib. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1846 Both assume input is blocked by the caller. */ |
118 | 1847 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1848 /* F is the frame the menu is for. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1849 X and Y are the frame-relative specified position, |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1850 relative to the inside upper left corner of the frame F. |
15839
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1851 FOR_CLICK is nonzero if this menu was invoked for a mouse click. |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1852 KEYMAPS is 1 if this menu was specified with keymaps; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1853 in that case, we return a list containing the chosen item's value |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1854 and perhaps also the pane's prefix. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1855 TITLE is the specified menu title. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1856 ERROR is a place to store an error message string in case of failure. |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1857 (We return nil on failure, but the value doesn't actually matter.) */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1858 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1859 #ifdef USE_X_TOOLKIT |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1860 |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
1861 /* We need a unique id for each widget handled by the Lucid Widget |
11918
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
1862 library. |
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
1863 |
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
1864 For the main windows, and popup menus, we use this counter, |
12661 | 1865 which we increment each time after use. This starts from 1<<16. |
11918
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
1866 |
12661 | 1867 For menu bars, we use numbers starting at 0, counted in |
1868 next_menubar_widget_id. */ | |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
1869 LWLIB_ID widget_id_tick; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
1870 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1871 #ifdef __STDC__ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1872 static Lisp_Object *volatile menu_item_selection; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1873 #else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1874 static Lisp_Object *menu_item_selection; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1875 #endif |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1876 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1877 static void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1878 popup_selection_callback (widget, id, client_data) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1879 Widget widget; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1880 LWLIB_ID id; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1881 XtPointer client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1882 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1883 menu_item_selection = (Lisp_Object *) client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1884 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1885 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1886 static Lisp_Object |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
1887 xmenu_show (f, x, y, for_click, keymaps, title, error) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1888 FRAME_PTR f; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1889 int x; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1890 int y; |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
1891 int for_click; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1892 int keymaps; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1893 Lisp_Object title; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1894 char **error; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1895 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1896 int i; |
11918
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
1897 LWLIB_ID menu_id; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1898 Widget menu; |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
1899 Arg av[2]; |
8414
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
1900 int ac = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1901 widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1902 widget_value **submenu_stack |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1903 = (widget_value **) alloca (menu_items_used * sizeof (widget_value *)); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1904 Lisp_Object *subprefix_stack |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1905 = (Lisp_Object *) alloca (menu_items_used * sizeof (Lisp_Object)); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1906 int submenu_depth = 0; |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
1907 XButtonPressedEvent dummy; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
1908 |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1909 int first_pane; |
8175
c3bc5fca374f
(xmenu_show) {USE_X_TOOLKIT}: ButtonPress no longer pops
Richard M. Stallman <rms@gnu.org>
parents:
8166
diff
changeset
|
1910 int next_release_must_exit = 0; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1911 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1912 *error = NULL; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1913 |
7335
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
1914 if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
1915 { |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
1916 *error = "Empty menu"; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
1917 return Qnil; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
1918 } |
5896
b20145eafe0c
(xmenu_show) [USE_X_TOOLKIT]: return Qnil when val is null.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5881
diff
changeset
|
1919 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1920 /* Create a tree of widget_value objects |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1921 representing the panes and their items. */ |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1922 wv = xmalloc_widget_value (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1923 wv->name = "menu"; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1924 wv->value = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1925 wv->enabled = 1; |
24993 | 1926 wv->button_type = BUTTON_TYPE_NONE; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1927 first_wv = wv; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1928 first_pane = 1; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1929 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1930 /* Loop over all panes and items, filling in the tree. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1931 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1932 while (i < menu_items_used) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1933 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1934 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1935 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1936 submenu_stack[submenu_depth++] = save_wv; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1937 save_wv = prev_wv; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1938 prev_wv = 0; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1939 first_pane = 1; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1940 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1941 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1942 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1943 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1944 prev_wv = save_wv; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1945 save_wv = submenu_stack[--submenu_depth]; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1946 first_pane = 0; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1947 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1948 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1949 else if (EQ (XVECTOR (menu_items)->contents[i], Qt) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1950 && submenu_depth != 0) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1951 i += MENU_ITEMS_PANE_LENGTH; |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
1952 /* Ignore a nil in the item list. |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
1953 It's meaningful only for dialog boxes. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
1954 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
1955 i += 1; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1956 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1957 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1958 /* Create a new pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1959 Lisp_Object pane_name, prefix; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1960 char *pane_string; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1961 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1962 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1963 #ifndef HAVE_MULTILINGUAL_MENU |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1964 if (!NILP (pane_name) && STRING_MULTIBYTE (pane_name)) |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1965 pane_name = string_make_unibyte (pane_name); |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1966 #endif |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1967 pane_string = (NILP (pane_name) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1968 ? "" : (char *) XSTRING (pane_name)->data); |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
1969 /* If there is just one top-level pane, put all its items directly |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1970 under the top-level menu. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1971 if (menu_items_n_panes == 1) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1972 pane_string = ""; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1973 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1974 /* If the pane has a meaningful name, |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1975 make the pane a top-level menu item |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1976 with its items as a submenu beneath it. */ |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1977 if (!keymaps && strcmp (pane_string, "")) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1978 { |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1979 wv = xmalloc_widget_value (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1980 if (save_wv) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1981 save_wv->next = wv; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1982 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1983 first_wv->contents = wv; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1984 wv->name = pane_string; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1985 if (keymaps && !NILP (prefix)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1986 wv->name++; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1987 wv->value = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1988 wv->enabled = 1; |
24993 | 1989 wv->button_type = BUTTON_TYPE_NONE; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1990 save_wv = wv; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1991 prev_wv = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1992 } |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1993 else if (first_pane) |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1994 { |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1995 save_wv = wv; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1996 prev_wv = 0; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1997 } |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
1998 first_pane = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
1999 i += MENU_ITEMS_PANE_LENGTH; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2000 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2001 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2002 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2003 /* Create a new item within current pane. */ |
24993 | 2004 Lisp_Object item_name, enable, descrip, def, type, selected; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2005 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2006 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2007 descrip |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2008 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2009 def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION]; |
24993 | 2010 type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE]; |
2011 selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED]; | |
2012 | |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2013 #ifndef HAVE_MULTILINGUAL_MENU |
24993 | 2014 if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) |
2015 item_name = string_make_unibyte (item_name); | |
2016 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) | |
2017 item_name = string_make_unibyte (descrip); | |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2018 #endif |
24993 | 2019 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2020 wv = xmalloc_widget_value (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2021 if (prev_wv) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2022 prev_wv->next = wv; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2023 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2024 save_wv->contents = wv; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2025 wv->name = (char *) XSTRING (item_name)->data; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2026 if (!NILP (descrip)) |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2027 wv->key = (char *) XSTRING (descrip)->data; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2028 wv->value = 0; |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2029 /* If this item has a null value, |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2030 make the call_data null so that it won't display a box |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2031 when the mouse is on it. */ |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2032 wv->call_data |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2033 = (!NILP (def) ? (void *) &XVECTOR (menu_items)->contents[i] : 0); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2034 wv->enabled = !NILP (enable); |
24993 | 2035 |
2036 if (NILP (type)) | |
2037 wv->button_type = BUTTON_TYPE_NONE; | |
2038 else if (EQ (type, QCtoggle)) | |
2039 wv->button_type = BUTTON_TYPE_TOGGLE; | |
2040 else if (EQ (type, QCradio)) | |
2041 wv->button_type = BUTTON_TYPE_RADIO; | |
2042 else | |
2043 abort (); | |
2044 | |
2045 wv->selected = !NILP (selected); | |
2046 | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2047 prev_wv = wv; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2048 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2049 i += MENU_ITEMS_ITEM_LENGTH; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2050 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2051 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2052 |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
2053 /* Deal with the title, if it is non-nil. */ |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2054 if (!NILP (title)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2055 { |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2056 widget_value *wv_title = xmalloc_widget_value (); |
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2057 widget_value *wv_sep1 = xmalloc_widget_value (); |
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2058 widget_value *wv_sep2 = xmalloc_widget_value (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2059 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2060 wv_sep2->name = "--"; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2061 wv_sep2->next = first_wv->contents; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2062 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2063 wv_sep1->name = "--"; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2064 wv_sep1->next = wv_sep2; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2065 |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2066 #ifndef HAVE_MULTILINGUAL_MENU |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2067 if (STRING_MULTIBYTE (title)) |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2068 title = string_make_unibyte (title); |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2069 #endif |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2070 wv_title->name = (char *) XSTRING (title)->data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2071 wv_title->enabled = True; |
24993 | 2072 wv_title->button_type = BUTTON_TYPE_NONE; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2073 wv_title->next = wv_sep1; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2074 first_wv->contents = wv_title; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2075 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2076 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2077 /* Actually create the menu. */ |
11918
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
2078 menu_id = widget_id_tick++; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2079 menu = lw_create_widget ("popup", first_wv->name, menu_id, first_wv, |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2080 f->output_data.x->widget, 1, 0, |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2081 popup_selection_callback, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2082 popup_deactivate_callback); |
8414
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
2083 |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2084 /* Adjust coordinates to relative to the outer (window manager) window. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2085 { |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2086 Window child; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2087 int win_x = 0, win_y = 0; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2088 |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2089 /* Find the position of the outside upper-left corner of |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2090 the inner window, with respect to the outer window. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2091 if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window) |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2092 { |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2093 BLOCK_INPUT; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2094 XTranslateCoordinates (FRAME_X_DISPLAY (f), |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2095 |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2096 /* From-window, to-window. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2097 f->output_data.x->window_desc, |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2098 f->output_data.x->parent_desc, |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2099 |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2100 /* From-position, to-position. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2101 0, 0, &win_x, &win_y, |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2102 |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2103 /* Child of window. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2104 &child); |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2105 UNBLOCK_INPUT; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2106 x += win_x; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2107 y += win_y; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2108 } |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2109 } |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2110 |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2111 /* Adjust coordinates to be root-window-relative. */ |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2112 x += f->output_data.x->left_pos; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2113 y += f->output_data.x->top_pos; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2114 |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2115 dummy.type = ButtonPress; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2116 dummy.serial = 0; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2117 dummy.send_event = 0; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2118 dummy.display = FRAME_X_DISPLAY (f); |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2119 dummy.time = CurrentTime; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2120 dummy.root = FRAME_X_DISPLAY_INFO (f)->root_window; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2121 dummy.window = dummy.root; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2122 dummy.subwindow = dummy.root; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2123 dummy.x_root = x; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2124 dummy.y_root = y; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2125 dummy.x = x; |
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2126 dummy.y = y; |
15839
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
2127 dummy.state = (FRAME_X_DISPLAY_INFO (f)->grabbed >> 1) * Button1Mask; |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
2128 dummy.button = 0; |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
2129 for (i = 0; i < 5; i++) |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
2130 if (FRAME_X_DISPLAY_INFO (f)->grabbed & (1 << i)) |
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
2131 dummy.button = i; |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2132 |
8414
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
2133 /* Don't allow any geometry request from the user. */ |
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
2134 XtSetArg (av[ac], XtNgeometry, 0); ac++; |
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
2135 XtSetValues (menu, av, ac); |
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
2136 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2137 /* Free the widget_value objects we used to specify the contents. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2138 free_menubar_widget_value_tree (first_wv); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2139 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2140 /* No selection has been chosen yet. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2141 menu_item_selection = 0; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2142 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2143 /* Display the menu. */ |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
2144 lw_popup_menu (menu, &dummy); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2145 popup_activated_flag = 1; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2146 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2147 /* Process events that apply to the menu. */ |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
2148 popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2149 |
24993 | 2150 #ifdef LESSTIF_VERSION |
2151 /* Nov 1998: For an unknown reason a button grab remains active | |
2152 after the popup menu has gone. */ | |
2153 XUngrabButton (XtDisplay (f->output_data.x->widget), | |
2154 AnyButton, AnyModifier, | |
2155 XtWindow (f->output_data.x->widget)); | |
2156 XUngrabButton (XtDisplay (f->output_data.x->edit_widget), | |
2157 AnyButton, AnyModifier, | |
2158 XtWindow (f->output_data.x->edit_widget)); | |
2159 #endif /* LESSTIF_VERSION */ | |
2160 | |
6625
d53ff9fcf05a
(xmenu_show): Undo part of March 11 change:
Richard M. Stallman <rms@gnu.org>
parents:
6605
diff
changeset
|
2161 /* fp turned off the following statement and wrote a comment |
d53ff9fcf05a
(xmenu_show): Undo part of March 11 change:
Richard M. Stallman <rms@gnu.org>
parents:
6605
diff
changeset
|
2162 that it is unnecessary--that the menu has already disappeared. |
12149
f1585a0ecd0c
(xmenu_show): Do call lw_destroy_all_widgets.
Karl Heuer <kwzh@gnu.org>
parents:
12131
diff
changeset
|
2163 Nowadays the menu disappears ok, all right, but |
f1585a0ecd0c
(xmenu_show): Do call lw_destroy_all_widgets.
Karl Heuer <kwzh@gnu.org>
parents:
12131
diff
changeset
|
2164 we need to delete the widgets or multiple ones will pile up. */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2165 lw_destroy_all_widgets (menu_id); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2166 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2167 /* Find the selected item, and its pane, to return |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2168 the proper value. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2169 if (menu_item_selection != 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2170 { |
11655
a9f93ce6e1b4
(xmenu_show, menubar_selection_callback): Move declaration
Karl Heuer <kwzh@gnu.org>
parents:
11614
diff
changeset
|
2171 Lisp_Object prefix, entry; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2172 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2173 prefix = Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2174 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2175 while (i < menu_items_used) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2176 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2177 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2178 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2179 subprefix_stack[submenu_depth++] = prefix; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2180 prefix = entry; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2181 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2182 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2183 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2184 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2185 prefix = subprefix_stack[--submenu_depth]; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2186 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2187 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2188 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2189 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2190 prefix |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2191 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2192 i += MENU_ITEMS_PANE_LENGTH; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2193 } |
13071
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
2194 /* Ignore a nil in the item list. |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
2195 It's meaningful only for dialog boxes. */ |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
2196 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
2197 i += 1; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2198 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2199 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2200 entry |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2201 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_VALUE]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2202 if (menu_item_selection == &XVECTOR (menu_items)->contents[i]) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2203 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2204 if (keymaps != 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2205 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2206 int j; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2207 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2208 entry = Fcons (entry, Qnil); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2209 if (!NILP (prefix)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2210 entry = Fcons (prefix, entry); |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2211 for (j = submenu_depth - 1; j >= 0; j--) |
6931
2d0ee7ef620a
(xmenu_show): Fix typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
6913
diff
changeset
|
2212 if (!NILP (subprefix_stack[j])) |
6913
f167828a3ec2
(xmenu_show): Don't cons on subprefix_stck[j] if nil.
Richard M. Stallman <rms@gnu.org>
parents:
6881
diff
changeset
|
2213 entry = Fcons (subprefix_stack[j], entry); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2214 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2215 return entry; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2216 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2217 i += MENU_ITEMS_ITEM_LENGTH; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2218 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2219 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2220 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2221 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2222 return Qnil; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2223 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2224 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2225 static void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2226 dialog_selection_callback (widget, id, client_data) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2227 Widget widget; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2228 LWLIB_ID id; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2229 XtPointer client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2230 { |
11266
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
2231 /* The EMACS_INT cast avoids a warning. There's no problem |
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
2232 as long as pointers have enough bits to hold small integers. */ |
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
2233 if ((int) (EMACS_INT) client_data != -1) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2234 menu_item_selection = (Lisp_Object *) client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2235 BLOCK_INPUT; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2236 lw_destroy_all_widgets (id); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2237 UNBLOCK_INPUT; |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
2238 popup_activated_flag = 0; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2239 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2240 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2241 static char * button_names [] = { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2242 "button1", "button2", "button3", "button4", "button5", |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2243 "button6", "button7", "button8", "button9", "button10" }; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2244 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2245 static Lisp_Object |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
2246 xdialog_show (f, keymaps, title, error) |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2247 FRAME_PTR f; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2248 int keymaps; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2249 Lisp_Object title; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2250 char **error; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2251 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2252 int i, nb_buttons=0; |
11918
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
2253 LWLIB_ID dialog_id; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2254 Widget menu; |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2255 char dialog_name[6]; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2256 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2257 widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2258 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2259 /* Number of elements seen so far, before boundary. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2260 int left_count = 0; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2261 /* 1 means we've seen the boundary between left-hand elts and right-hand. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2262 int boundary_seen = 0; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2263 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2264 *error = NULL; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2265 |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2266 if (menu_items_n_panes > 1) |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2267 { |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2268 *error = "Multiple panes in dialog box"; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2269 return Qnil; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2270 } |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2271 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2272 /* Create a tree of widget_value objects |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2273 representing the text label and buttons. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2274 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2275 Lisp_Object pane_name, prefix; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2276 char *pane_string; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2277 pane_name = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2278 prefix = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_PREFIX]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2279 pane_string = (NILP (pane_name) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2280 ? "" : (char *) XSTRING (pane_name)->data); |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2281 prev_wv = xmalloc_widget_value (); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2282 prev_wv->value = pane_string; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2283 if (keymaps && !NILP (prefix)) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2284 prev_wv->name++; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2285 prev_wv->enabled = 1; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2286 prev_wv->name = "message"; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2287 first_wv = prev_wv; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2288 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2289 /* Loop over all panes and items, filling in the tree. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2290 i = MENU_ITEMS_PANE_LENGTH; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2291 while (i < menu_items_used) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2292 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2293 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2294 /* Create a new item within current pane. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2295 Lisp_Object item_name, enable, descrip; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2296 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2297 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2298 descrip |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2299 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2300 |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2301 if (NILP (item_name)) |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2302 { |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2303 free_menubar_widget_value_tree (first_wv); |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2304 *error = "Submenu in dialog items"; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2305 return Qnil; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2306 } |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2307 if (EQ (item_name, Qquote)) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2308 { |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2309 /* This is the boundary between left-side elts |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2310 and right-side elts. Stop incrementing right_count. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2311 boundary_seen = 1; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2312 i++; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2313 continue; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2314 } |
15912
afb0bb1cdbe6
(xdialog_show): Don't allow 9 buttons.
Richard M. Stallman <rms@gnu.org>
parents:
15839
diff
changeset
|
2315 if (nb_buttons >= 9) |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2316 { |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2317 free_menubar_widget_value_tree (first_wv); |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2318 *error = "Too many dialog items"; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2319 return Qnil; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2320 } |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2321 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2322 wv = xmalloc_widget_value (); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2323 prev_wv->next = wv; |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2324 wv->name = (char *) button_names[nb_buttons]; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2325 if (!NILP (descrip)) |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2326 wv->key = (char *) XSTRING (descrip)->data; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2327 wv->value = (char *) XSTRING (item_name)->data; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2328 wv->call_data = (void *) &XVECTOR (menu_items)->contents[i]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2329 wv->enabled = !NILP (enable); |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2330 prev_wv = wv; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2331 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2332 if (! boundary_seen) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2333 left_count++; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2334 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2335 nb_buttons++; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2336 i += MENU_ITEMS_ITEM_LENGTH; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2337 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2338 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2339 /* If the boundary was not specified, |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2340 by default put half on the left and half on the right. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2341 if (! boundary_seen) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2342 left_count = nb_buttons - nb_buttons / 2; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2343 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2344 wv = xmalloc_widget_value (); |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2345 wv->name = dialog_name; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2346 |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2347 /* Dialog boxes use a really stupid name encoding |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2348 which specifies how many buttons to use |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2349 and how many buttons are on the right. |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2350 The Q means something also. */ |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2351 dialog_name[0] = 'Q'; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2352 dialog_name[1] = '0' + nb_buttons; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2353 dialog_name[2] = 'B'; |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2354 dialog_name[3] = 'R'; |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2355 /* Number of buttons to put on the right. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2356 dialog_name[4] = '0' + nb_buttons - left_count; |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2357 dialog_name[5] = 0; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2358 wv->contents = first_wv; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2359 first_wv = wv; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2360 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2361 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2362 /* Actually create the dialog. */ |
11918
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
2363 dialog_id = widget_id_tick++; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2364 menu = lw_create_widget (first_wv->name, "dialog", dialog_id, first_wv, |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2365 f->output_data.x->widget, 1, 0, |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2366 dialog_selection_callback, 0); |
7770
41dda174ca7c
(xdialog_show): Fix problem with message in dialog box.
Karl Heuer <kwzh@gnu.org>
parents:
7679
diff
changeset
|
2367 lw_modify_all_widgets (dialog_id, first_wv->contents, True); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2368 /* Free the widget_value objects we used to specify the contents. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2369 free_menubar_widget_value_tree (first_wv); |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2370 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2371 /* No selection has been chosen yet. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2372 menu_item_selection = 0; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2373 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2374 /* Display the menu. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2375 lw_pop_up_all_widgets (dialog_id); |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
2376 popup_activated_flag = 1; |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2377 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2378 /* Process events that apply to the menu. */ |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
2379 popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), dialog_id); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2380 |
12149
f1585a0ecd0c
(xmenu_show): Do call lw_destroy_all_widgets.
Karl Heuer <kwzh@gnu.org>
parents:
12131
diff
changeset
|
2381 lw_destroy_all_widgets (dialog_id); |
f1585a0ecd0c
(xmenu_show): Do call lw_destroy_all_widgets.
Karl Heuer <kwzh@gnu.org>
parents:
12131
diff
changeset
|
2382 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2383 /* Find the selected item, and its pane, to return |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2384 the proper value. */ |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2385 if (menu_item_selection != 0) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2386 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2387 Lisp_Object prefix; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2388 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2389 prefix = Qnil; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2390 i = 0; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2391 while (i < menu_items_used) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2392 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2393 Lisp_Object entry; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2394 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2395 if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2396 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2397 prefix |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2398 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2399 i += MENU_ITEMS_PANE_LENGTH; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2400 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2401 else |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2402 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2403 entry |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2404 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_VALUE]; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2405 if (menu_item_selection == &XVECTOR (menu_items)->contents[i]) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2406 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2407 if (keymaps != 0) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2408 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2409 entry = Fcons (entry, Qnil); |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2410 if (!NILP (prefix)) |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2411 entry = Fcons (prefix, entry); |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2412 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2413 return entry; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2414 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2415 i += MENU_ITEMS_ITEM_LENGTH; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2416 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2417 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2418 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2419 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2420 return Qnil; |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2421 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2422 #else /* not USE_X_TOOLKIT */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2423 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2424 static Lisp_Object |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
2425 xmenu_show (f, x, y, for_click, keymaps, title, error) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2426 FRAME_PTR f; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2427 int x, y; |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
2428 int for_click; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2429 int keymaps; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2430 Lisp_Object title; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2431 char **error; |
118 | 2432 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2433 Window root; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2434 XMenu *menu; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2435 int pane, selidx, lpane, status; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2436 Lisp_Object entry, pane_prefix; |
118 | 2437 char *datap; |
2438 int ulx, uly, width, height; | |
2439 int dispwidth, dispheight; | |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2440 int i, j; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2441 int maxwidth; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2442 int dummy_int; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2443 unsigned int dummy_uint; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
2444 |
3747
6506b2fd475a
(xmenu_show): Store 0 in *ERROR at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
3501
diff
changeset
|
2445 *error = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2446 if (menu_items_n_panes == 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2447 return Qnil; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
2448 |
7335
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2449 if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2450 { |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2451 *error = "Empty menu"; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2452 return Qnil; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2453 } |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2454 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2455 /* Figure out which root window F is on. */ |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2456 XGetGeometry (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), &root, |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2457 &dummy_int, &dummy_int, &dummy_uint, &dummy_uint, |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2458 &dummy_uint, &dummy_uint); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2459 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2460 /* Make the menu on that window. */ |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2461 menu = XMenuCreate (FRAME_X_DISPLAY (f), root, "emacs"); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2462 if (menu == NULL) |
118 | 2463 { |
2464 *error = "Can't create menu"; | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2465 return Qnil; |
118 | 2466 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2467 |
9572 | 2468 #ifdef HAVE_X_WINDOWS |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2469 /* Adjust coordinates to relative to the outer (window manager) window. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2470 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2471 Window child; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2472 int win_x = 0, win_y = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2473 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2474 /* Find the position of the outside upper-left corner of |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2475 the inner window, with respect to the outer window. */ |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2476 if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2477 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2478 BLOCK_INPUT; |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2479 XTranslateCoordinates (FRAME_X_DISPLAY (f), |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2480 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2481 /* From-window, to-window. */ |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2482 f->output_data.x->window_desc, |
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2483 f->output_data.x->parent_desc, |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2484 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2485 /* From-position, to-position. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2486 0, 0, &win_x, &win_y, |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2487 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2488 /* Child of window. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2489 &child); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2490 UNBLOCK_INPUT; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2491 x += win_x; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2492 y += win_y; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2493 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2494 } |
9572 | 2495 #endif /* HAVE_X_WINDOWS */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2496 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2497 /* Adjust coordinates to be root-window-relative. */ |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2498 x += f->output_data.x->left_pos; |
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2499 y += f->output_data.x->top_pos; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2500 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2501 /* Create all the necessary panes and their items. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2502 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2503 while (i < menu_items_used) |
118 | 2504 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2505 if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
118 | 2506 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2507 /* Create a new pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2508 Lisp_Object pane_name, prefix; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2509 char *pane_string; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2510 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2511 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2512 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2513 pane_string = (NILP (pane_name) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2514 ? "" : (char *) XSTRING (pane_name)->data); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2515 if (keymaps && !NILP (prefix)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2516 pane_string++; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2517 |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2518 lpane = XMenuAddPane (FRAME_X_DISPLAY (f), menu, pane_string, TRUE); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2519 if (lpane == XM_FAILURE) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2520 { |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2521 XMenuDestroy (FRAME_X_DISPLAY (f), menu); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2522 *error = "Can't create pane"; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2523 return Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2524 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2525 i += MENU_ITEMS_PANE_LENGTH; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2526 |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2527 /* Find the width of the widest item in this pane. */ |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2528 maxwidth = 0; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2529 j = i; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2530 while (j < menu_items_used) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2531 { |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2532 Lisp_Object item; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2533 item = XVECTOR (menu_items)->contents[j]; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2534 if (EQ (item, Qt)) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2535 break; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2536 if (NILP (item)) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2537 { |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2538 j++; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2539 continue; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2540 } |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21242
diff
changeset
|
2541 width = STRING_BYTES (XSTRING (item)); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2542 if (width > maxwidth) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2543 maxwidth = width; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2544 |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2545 j += MENU_ITEMS_ITEM_LENGTH; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2546 } |
118 | 2547 } |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2548 /* Ignore a nil in the item list. |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2549 It's meaningful only for dialog boxes. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2550 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2551 i += 1; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2552 else |
118 | 2553 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2554 /* Create a new item within current pane. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2555 Lisp_Object item_name, enable, descrip; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2556 unsigned char *item_data; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2557 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2558 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2559 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2560 descrip |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2561 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2562 if (!NILP (descrip)) |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2563 { |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21242
diff
changeset
|
2564 int gap = maxwidth - STRING_BYTES (XSTRING (item_name)); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2565 #ifdef C_ALLOCA |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2566 Lisp_Object spacer; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2567 spacer = Fmake_string (make_number (gap), make_number (' ')); |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2568 item_name = concat2 (item_name, spacer); |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2569 item_name = concat2 (item_name, descrip); |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2570 item_data = XSTRING (item_name)->data; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2571 #else |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2572 /* if alloca is fast, use that to make the space, |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2573 to reduce gc needs. */ |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2574 item_data |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2575 = (unsigned char *) alloca (maxwidth |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21242
diff
changeset
|
2576 + STRING_BYTES (XSTRING (descrip)) + 1); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2577 bcopy (XSTRING (item_name)->data, item_data, |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21242
diff
changeset
|
2578 STRING_BYTES (XSTRING (item_name))); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2579 for (j = XSTRING (item_name)->size; j < maxwidth; j++) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2580 item_data[j] = ' '; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2581 bcopy (XSTRING (descrip)->data, item_data + j, |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21242
diff
changeset
|
2582 STRING_BYTES (XSTRING (descrip))); |
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21242
diff
changeset
|
2583 item_data[j + STRING_BYTES (XSTRING (descrip))] = 0; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2584 #endif |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2585 } |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2586 else |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2587 item_data = XSTRING (item_name)->data; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2588 |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2589 if (XMenuAddSelection (FRAME_X_DISPLAY (f), |
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2590 menu, lpane, 0, item_data, |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2591 !NILP (enable)) |
118 | 2592 == XM_FAILURE) |
2593 { | |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2594 XMenuDestroy (FRAME_X_DISPLAY (f), menu); |
118 | 2595 *error = "Can't add selection to menu"; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2596 return Qnil; |
118 | 2597 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2598 i += MENU_ITEMS_ITEM_LENGTH; |
118 | 2599 } |
2600 } | |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2601 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2602 /* All set and ready to fly. */ |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2603 XMenuRecompute (FRAME_X_DISPLAY (f), menu); |
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2604 dispwidth = DisplayWidth (FRAME_X_DISPLAY (f), |
9649
910da93766c8
(xmenu_show): Get the screen number for DisplayHeight
Richard M. Stallman <rms@gnu.org>
parents:
9619
diff
changeset
|
2605 XScreenNumberOfScreen (FRAME_X_SCREEN (f))); |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2606 dispheight = DisplayHeight (FRAME_X_DISPLAY (f), |
9649
910da93766c8
(xmenu_show): Get the screen number for DisplayHeight
Richard M. Stallman <rms@gnu.org>
parents:
9619
diff
changeset
|
2607 XScreenNumberOfScreen (FRAME_X_SCREEN (f))); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2608 x = min (x, dispwidth); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2609 y = min (y, dispheight); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2610 x = max (x, 1); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2611 y = max (y, 1); |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2612 XMenuLocate (FRAME_X_DISPLAY (f), menu, 0, 0, x, y, |
118 | 2613 &ulx, &uly, &width, &height); |
2614 if (ulx+width > dispwidth) | |
2615 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2616 x -= (ulx + width) - dispwidth; |
118 | 2617 ulx = dispwidth - width; |
2618 } | |
2619 if (uly+height > dispheight) | |
2620 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2621 y -= (uly + height) - dispheight; |
118 | 2622 uly = dispheight - height; |
2623 } | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2624 if (ulx < 0) x -= ulx; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2625 if (uly < 0) y -= uly; |
6526
95661fd7a320
(xmenu_show): Enable asynchronous events.
Karl Heuer <kwzh@gnu.org>
parents:
6481
diff
changeset
|
2626 |
95661fd7a320
(xmenu_show): Enable asynchronous events.
Karl Heuer <kwzh@gnu.org>
parents:
6481
diff
changeset
|
2627 XMenuSetAEQ (menu, TRUE); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2628 XMenuSetFreeze (menu, TRUE); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2629 pane = selidx = 0; |
118 | 2630 |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2631 status = XMenuActivate (FRAME_X_DISPLAY (f), menu, &pane, &selidx, |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2632 x, y, ButtonReleaseMask, &datap); |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2633 |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2634 |
12131
fa4e74485660
(xmenu_show): If !HAVE_X_WINDOWS, don't reference X display.
Karl Heuer <kwzh@gnu.org>
parents:
12018
diff
changeset
|
2635 #ifdef HAVE_X_WINDOWS |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2636 /* Assume the mouse has moved out of the X window. |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2637 If it has actually moved in, we will get an EnterNotify. */ |
11528
29d1cbdd2ca4
(xmenu_show): x_mouse_leave needs an arg.
Karl Heuer <kwzh@gnu.org>
parents:
11502
diff
changeset
|
2638 x_mouse_leave (FRAME_X_DISPLAY_INFO (f)); |
12131
fa4e74485660
(xmenu_show): If !HAVE_X_WINDOWS, don't reference X display.
Karl Heuer <kwzh@gnu.org>
parents:
12018
diff
changeset
|
2639 #endif |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2640 |
118 | 2641 switch (status) |
2642 { | |
2643 case XM_SUCCESS: | |
2644 #ifdef XDEBUG | |
2645 fprintf (stderr, "pane= %d line = %d\n", panes, selidx); | |
2646 #endif | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2647 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2648 /* Find the item number SELIDX in pane number PANE. */ |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2649 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2650 while (i < menu_items_used) |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
2651 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2652 if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2653 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2654 if (pane == 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2655 pane_prefix |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2656 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2657 pane--; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2658 i += MENU_ITEMS_PANE_LENGTH; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2659 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2660 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2661 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2662 if (pane == -1) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2663 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2664 if (selidx == 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2665 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2666 entry |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2667 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_VALUE]; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2668 if (keymaps != 0) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2669 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2670 entry = Fcons (entry, Qnil); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2671 if (!NILP (pane_prefix)) |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2672 entry = Fcons (pane_prefix, entry); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2673 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2674 break; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2675 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2676 selidx--; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2677 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2678 i += MENU_ITEMS_ITEM_LENGTH; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2679 } |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
2680 } |
118 | 2681 break; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2682 |
118 | 2683 case XM_FAILURE: |
2684 *error = "Can't activate menu"; | |
2685 case XM_IA_SELECT: | |
2686 case XM_NO_SELECT: | |
2687 entry = Qnil; | |
2688 break; | |
2689 } | |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
2690 XMenuDestroy (FRAME_X_DISPLAY (f), menu); |
7208
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
2691 |
9572 | 2692 #ifdef HAVE_X_WINDOWS |
7208
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
2693 /* State that no mouse buttons are now held. |
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
2694 (The oldXMenu code doesn't track this info for us.) |
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
2695 That is not necessarily true, but the fiction leads to reasonable |
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
2696 results, and it is a pain to ask which are actually held now. */ |
9619
1c985426ad84
(xdialog_show, xmenu_show): Use grabbed field instead of x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
9608
diff
changeset
|
2697 FRAME_X_DISPLAY_INFO (f)->grabbed = 0; |
9572 | 2698 #endif |
7208
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
2699 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2700 return entry; |
118 | 2701 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2702 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2703 #endif /* not USE_X_TOOLKIT */ |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
2704 |
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
2705 #endif /* HAVE_MENUS */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2706 |
21514 | 2707 void |
118 | 2708 syms_of_xmenu () |
2709 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2710 staticpro (&menu_items); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2711 menu_items = Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2712 |
12625
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
2713 Qdebug_on_next_call = intern ("debug-on-next-call"); |
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
2714 staticpro (&Qdebug_on_next_call); |
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
2715 |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
2716 DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
2717 "Frame for which we are updating a menu.\n\ |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
2718 The enable predicate for a menu command should check this variable."); |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
2719 Vmenu_updating_frame = Qnil; |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
2720 |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
2721 #ifdef USE_X_TOOLKIT |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2722 widget_id_tick = (1<<16); |
12661 | 2723 next_menubar_widget_id = 1; |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
2724 #endif |
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
2725 |
118 | 2726 defsubr (&Sx_popup_menu); |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
2727 #ifdef HAVE_MENUS |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2728 defsubr (&Sx_popup_dialog); |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
2729 #endif |
118 | 2730 } |