Mercurial > emacs
annotate src/xmenu.c @ 56521:3dcebd60c9bd
(rmail-mime-charset-pattern): Don't include semicolon in the charset value.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 24 Jul 2004 21:35:32 +0000 |
parents | 5a46a8191136 |
children | 27ebdb6b3098 4c6128c0d7e2 |
rev | line source |
---|---|
118 | 1 /* X Communication module for terminals which understand the X protocol. |
50938
20b3d6c3c7e5
(single_menu_item): Change last parameter to void* to
Andreas Schwab <schwab@suse.de>
parents:
50803
diff
changeset
|
2 Copyright (C) 1986, 88, 93, 94, 96, 99, 2000, 2001, 2003 |
36191
0cee3a77c592
(set_frame_menubar): Run acivate-menu-bar-hook with
Gerd Moellmann <gerd@gnu.org>
parents:
34038
diff
changeset
|
3 Free Software Foundation, Inc. |
118 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
7 GNU Emacs is free software; you can redistribute it and/or modify | |
8 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
|
9 the Free Software Foundation; either version 2, or (at your option) |
118 | 10 any later version. |
11 | |
12 GNU Emacs is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 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
|
19 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
|
20 Boston, MA 02111-1307, USA. */ |
118 | 21 |
40239
5fda2888718a
Spell the name of Emacs properly (GNU Emacs instead of gnuemacs).
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
22 /* X pop-up deck-of-cards menu facility for GNU Emacs. |
118 | 23 * |
24 * Written by Jon Arnold and Roman Budzianowski | |
25 * Mods and rewrite by Robert Krawitz | |
26 * | |
27 */ | |
28 | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
29 /* 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
|
30 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
|
31 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
32 /* 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
|
33 |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
26036
diff
changeset
|
34 #include <config.h> |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
26036
diff
changeset
|
35 |
118 | 36 /* On 4.3 this loses if it comes after xterm.h. */ |
37 #include <signal.h> | |
7900
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7871
diff
changeset
|
38 |
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7871
diff
changeset
|
39 #include <stdio.h> |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
40 |
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" |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32179
diff
changeset
|
43 #include "keyboard.h" |
39690
38c1890338cc
(keymap_panes, Fx_popup_menu): Use Fkeymap_prompt.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
44 #include "keymap.h" |
770 | 45 #include "frame.h" |
118 | 46 #include "window.h" |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2209
diff
changeset
|
47 #include "blockinput.h" |
12661 | 48 #include "buffer.h" |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
49 #include "charset.h" |
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
50 #include "coding.h" |
118 | 51 |
10502
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
52 #ifdef MSDOS |
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
53 #include "msdos.h" |
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
54 #endif |
1b08df5c5e4a
[MSDOS]: #include msdos.h.
Richard M. Stallman <rms@gnu.org>
parents:
10167
diff
changeset
|
55 |
9572 | 56 #ifdef HAVE_X_WINDOWS |
118 | 57 /* This may include sys/types.h, and that somehow loses |
58 if this is not done before the other system files. */ | |
59 #include "xterm.h" | |
9572 | 60 #endif |
118 | 61 |
62 /* Load sys/types.h if not already loaded. | |
63 In some systems loading it twice is suicidal. */ | |
64 #ifndef makedev | |
65 #include <sys/types.h> | |
66 #endif | |
67 | |
68 #include "dispextern.h" | |
69 | |
9572 | 70 #ifdef HAVE_X_WINDOWS |
51404 | 71 /* Defining HAVE_MULTILINGUAL_MENU would mean that the toolkit menu |
72 code accepts the Emacs internal encoding. */ | |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
73 #undef HAVE_MULTILINGUAL_MENU |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
74 #ifdef USE_X_TOOLKIT |
36958
0b580e75db8c
Include widget.h only if USE_X_TOOLKIT is defined.
Eli Zaretskii <eliz@gnu.org>
parents:
36938
diff
changeset
|
75 #include "widget.h" |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
76 #include <X11/Xlib.h> |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
77 #include <X11/IntrinsicP.h> |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
78 #include <X11/CoreP.h> |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
79 #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
|
80 #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
|
81 #ifdef USE_LUCID |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
82 #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
|
83 #endif /* USE_LUCID */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
84 #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
|
85 #else /* not USE_X_TOOLKIT */ |
49322 | 86 #ifndef USE_GTK |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
87 #include "../oldXMenu/XMenu.h" |
49322 | 88 #endif |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
89 #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
|
90 #endif /* HAVE_X_WINDOWS */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
91 |
118 | 92 #ifndef TRUE |
93 #define TRUE 1 | |
94 #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
|
95 #endif /* no TRUE */ |
118 | 96 |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
97 Lisp_Object Vmenu_updating_frame; |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
98 |
12625
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
99 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
|
100 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
101 extern Lisp_Object 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
|
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 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
|
115 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
116 static Lisp_Object xdialog_show (); |
48912
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
117 static void popup_get_selection (); |
24993 | 118 |
40239
5fda2888718a
Spell the name of Emacs properly (GNU Emacs instead of gnuemacs).
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
119 /* Define HAVE_BOXES if menus can handle radio and toggle buttons. */ |
24993 | 120 |
121 #define HAVE_BOXES 1 | |
49322 | 122 #endif /* USE_X_TOOLKIT */ |
123 | |
124 #ifdef USE_GTK | |
125 #include "gtkutil.h" | |
126 #define HAVE_BOXES 1 | |
127 extern void set_frame_menubar (); | |
128 static Lisp_Object xdialog_show (); | |
24993 | 129 #endif |
130 | |
51404 | 131 /* This is how to deal with multibyte text if HAVE_MULTILINGUAL_MENU |
132 isn't defined. The use of HAVE_MULTILINGUAL_MENU could probably be | |
133 confined to an extended version of this with sections of code below | |
134 using it unconditionally. */ | |
135 #ifdef USE_GTK | |
136 /* gtk just uses utf-8. */ | |
137 # define ENCODE_MENU_STRING(str) ENCODE_UTF_8 (str) | |
138 #else | |
139 /* I'm not convinced ENCODE_SYSTEM is defined correctly, or maybe | |
140 something else should be used here. Except under MS-Windows it | |
141 just converts to unibyte, but encoding with `locale-coding-system' | |
142 seems better -- X may actually display the result correctly, and | |
143 it's not necessarily equivalent to the unibyte text. -- fx */ | |
144 # define ENCODE_MENU_STRING(str) ENCODE_SYSTEM (str) | |
145 #endif | |
146 | |
24993 | 147 static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
148 Lisp_Object, Lisp_Object, Lisp_Object, | |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
149 Lisp_Object, Lisp_Object)); |
36933 | 150 static int update_frame_menubar P_ ((struct frame *)); |
151 static Lisp_Object xmenu_show P_ ((struct frame *, int, int, int, int, | |
152 Lisp_Object, char **)); | |
153 static void keymap_panes P_ ((Lisp_Object *, int, int)); | |
154 static void single_keymap_panes P_ ((Lisp_Object, Lisp_Object, Lisp_Object, | |
155 int, int)); | |
156 static void list_of_panes P_ ((Lisp_Object)); | |
157 static void list_of_items P_ ((Lisp_Object)); | |
48912
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
158 |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
159 extern EMACS_TIME timer_check P_ ((int)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
160 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
161 /* 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
|
162 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
|
163 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
164 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
|
165 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
172 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
|
173 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
|
174 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
|
175 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
|
176 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
177 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
|
178 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
|
179 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
180 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
|
181 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
|
182 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
183 #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
|
184 #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
|
185 #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
|
186 |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
187 enum menu_item_idx |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
188 { |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
189 MENU_ITEMS_ITEM_NAME = 0, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
190 MENU_ITEMS_ITEM_ENABLE, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
191 MENU_ITEMS_ITEM_VALUE, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
192 MENU_ITEMS_ITEM_EQUIV_KEY, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
193 MENU_ITEMS_ITEM_DEFINITION, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
194 MENU_ITEMS_ITEM_TYPE, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
195 MENU_ITEMS_ITEM_SELECTED, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
196 MENU_ITEMS_ITEM_HELP, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
197 MENU_ITEMS_ITEM_LENGTH |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
198 }; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
199 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
200 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
|
201 |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
202 /* If non-nil, means that the global vars defined here are already in use. |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
203 Used to detect cases where we try to re-enter this non-reentrant code. */ |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
204 static Lisp_Object menu_items_inuse; |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
205 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
206 /* 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
|
207 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
|
208 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
209 /* 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
|
210 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
|
211 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
212 /* 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
|
213 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
|
214 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
|
215 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
216 /* Current depth within submenus. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
217 static int menu_items_submenu_depth; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
218 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
219 /* 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
|
220 Xt on behalf of one of the widget sets. */ |
49322 | 221 static int popup_activated_flag; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
222 |
12661 | 223 static int next_menubar_widget_id; |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
224 |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
225 /* 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
|
226 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
|
227 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
|
228 |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
229 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
|
230 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
|
231 |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
232 int pending_menu_activation; |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
233 |
12661 | 234 #ifdef USE_X_TOOLKIT |
235 | |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
236 /* 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
|
237 |
12661 | 238 static struct frame * |
239 menubar_id_to_frame (id) | |
240 LWLIB_ID id; | |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
241 { |
12661 | 242 Lisp_Object tail, frame; |
243 FRAME_PTR f; | |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
244 |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
25322
diff
changeset
|
245 for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail)) |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
246 { |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
25322
diff
changeset
|
247 frame = XCAR (tail); |
12661 | 248 if (!GC_FRAMEP (frame)) |
249 continue; | |
250 f = XFRAME (frame); | |
26729
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26088
diff
changeset
|
251 if (!FRAME_WINDOW_P (f)) |
12661 | 252 continue; |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
253 if (f->output_data.x->id == id) |
12661 | 254 return f; |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
255 } |
12661 | 256 return 0; |
257 } | |
11237
7c968b691ff0
(frame_vector): New static variable.
Richard M. Stallman <rms@gnu.org>
parents:
11125
diff
changeset
|
258 |
12661 | 259 #endif |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
260 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
261 /* 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
|
262 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
|
263 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
264 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
265 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
|
266 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
267 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
|
268 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
269 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
|
270 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
|
271 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
272 |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
273 if (!NILP (menu_items_inuse)) |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
274 error ("Trying to use a menu from within a menu-entry"); |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
275 menu_items_inuse = Qt; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
276 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
|
277 menu_items_n_panes = 0; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
278 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
|
279 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
280 |
41769
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
281 /* Call at the end of generating the data in 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
|
282 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
283 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
284 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
|
285 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
286 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
287 |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
288 static Lisp_Object |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
289 unuse_menu_items (dummy) |
48329
0d792a35828b
(unuse_menu_items, digest_single_submenu):
Dave Love <fx@gnu.org>
parents:
48270
diff
changeset
|
290 int dummy; |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
291 { |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
292 return menu_items_inuse = Qnil; |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
293 } |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
294 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
295 /* 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
|
296 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
|
297 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
298 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
299 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
|
300 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
301 /* 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
|
302 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
|
303 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
|
304 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
305 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
|
306 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
|
307 } |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
308 xassert (NILP (menu_items_inuse)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
309 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
310 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
311 /* 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
|
312 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
313 static void |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
314 grow_menu_items () |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
315 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
316 Lisp_Object old; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
317 int old_size = menu_items_allocated; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
318 old = menu_items; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
319 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
320 menu_items_allocated *= 2; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
321 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
|
322 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
|
323 old_size * sizeof (Lisp_Object)); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
324 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
325 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
326 /* Begin a submenu. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
327 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
328 static void |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
329 push_submenu_start () |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
330 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
331 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
|
332 grow_menu_items (); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
333 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
334 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
|
335 menu_items_submenu_depth++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
336 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
337 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
338 /* End a submenu. */ |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
339 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
340 static void |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
341 push_submenu_end () |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
342 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
343 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
|
344 grow_menu_items (); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
345 |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
346 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
|
347 menu_items_submenu_depth--; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
348 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
349 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
350 /* Indicate boundary between left and right. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
351 |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
352 static void |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
353 push_left_right_boundary () |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
354 { |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
355 if (menu_items_used + 1 > menu_items_allocated) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
356 grow_menu_items (); |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
357 |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
358 XVECTOR (menu_items)->contents[menu_items_used++] = Qquote; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
359 } |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
360 |
40239
5fda2888718a
Spell the name of Emacs properly (GNU Emacs instead of gnuemacs).
Pavel Janík <Pavel@Janik.cz>
parents:
39988
diff
changeset
|
361 /* Start a new menu pane in 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
|
362 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
|
363 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
364 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
365 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
|
366 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
|
367 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
368 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
|
369 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
|
370 |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
371 if (menu_items_submenu_depth == 0) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
372 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
|
373 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
|
374 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
|
375 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
|
376 } |
118 | 377 |
24993 | 378 /* Push one menu item into the current pane. NAME is the string to |
379 display. ENABLE if non-nil means this item can be selected. KEY | |
380 is the key generated by choosing this item, or nil if this item | |
381 doesn't really have a definition. DEF is the definition of this | |
382 item. EQUIV is the textual description of the keyboard equivalent | |
383 for this item (or nil if none). TYPE is the type of this menu | |
384 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
|
385 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
386 static void |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
387 push_menu_item (name, enable, key, def, equiv, type, selected, help) |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
388 Lisp_Object name, enable, key, def, equiv, type, selected, help; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
389 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
390 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
|
391 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
|
392 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
393 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
|
394 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
|
395 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
|
396 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
|
397 XVECTOR (menu_items)->contents[menu_items_used++] = def; |
24993 | 398 XVECTOR (menu_items)->contents[menu_items_used++] = type; |
399 XVECTOR (menu_items)->contents[menu_items_used++] = selected; | |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
400 XVECTOR (menu_items)->contents[menu_items_used++] = help; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
401 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
402 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
403 /* 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
|
404 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
|
405 If NOTREAL is nonzero, |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
406 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
|
407 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
408 static void |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
409 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
|
410 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
|
411 int nmaps; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
412 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
|
413 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
414 int mapno; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
415 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
416 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
|
417 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
418 /* 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
|
419 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
|
420 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
|
421 for (mapno = 0; mapno < nmaps; mapno++) |
30420
3ed29d254c6c
(keymap_panes): Pass the keymap's prompt as the pane
Eli Zaretskii <eliz@gnu.org>
parents:
30363
diff
changeset
|
422 single_keymap_panes (keymaps[mapno], |
39690
38c1890338cc
(keymap_panes, Fx_popup_menu): Use Fkeymap_prompt.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
423 Fkeymap_prompt (keymaps[mapno]), 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
|
424 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
425 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
|
426 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
427 |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
428 /* Args passed between single_keymap_panes and single_menu_item. */ |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
429 struct skp |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
430 { |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
431 Lisp_Object pending_maps; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
432 int maxdepth, notreal; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
433 int notbuttons; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
434 }; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
435 |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
436 static void single_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
50938
20b3d6c3c7e5
(single_menu_item): Change last parameter to void* to
Andreas Schwab <schwab@suse.de>
parents:
50803
diff
changeset
|
437 void *)); |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
438 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
439 /* 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
|
440 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
|
441 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
|
442 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
|
443 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
|
444 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
|
445 |
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
446 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
|
447 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
448 static void |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
449 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
|
450 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
|
451 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
|
452 Lisp_Object prefix; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
453 int notreal; |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
454 int maxdepth; |
118 | 455 { |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
456 struct skp skp; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
457 struct gcpro gcpro1; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
458 |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
459 skp.pending_maps = Qnil; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
460 skp.maxdepth = maxdepth; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
461 skp.notreal = notreal; |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
462 skp.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
|
463 |
16752
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
464 if (maxdepth <= 0) |
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
465 return; |
6409ef81a2a8
(single_keymap_panes): New arg DEPTH.
Richard M. Stallman <rms@gnu.org>
parents:
16729
diff
changeset
|
466 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
467 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
|
468 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
469 #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
|
470 /* 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
|
471 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
|
472 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
|
473 items need a prefix. */ |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
474 skp.notbuttons = menu_items_used; |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
475 #endif |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
476 |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
477 GCPRO1 (skp.pending_maps); |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
478 map_keymap (keymap, single_menu_item, Qnil, &skp, 1); |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
479 UNGCPRO; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
480 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
481 /* Process now any submenus which want to be panes at this level. */ |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
482 while (CONSP (skp.pending_maps)) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
483 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
484 Lisp_Object elt, eltcdr, string; |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
485 elt = XCAR (skp.pending_maps); |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
25322
diff
changeset
|
486 eltcdr = XCDR (elt); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
25322
diff
changeset
|
487 string = XCAR (eltcdr); |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
488 /* 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
|
489 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
|
490 single_keymap_panes (Fcar (elt), string, |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
25322
diff
changeset
|
491 XCDR (eltcdr), notreal, maxdepth - 1); |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
492 skp.pending_maps = XCDR (skp.pending_maps); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
493 } |
118 | 494 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
495 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
496 /* 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
|
497 keymap entry. |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
498 KEY is a key in a keymap and ITEM is its binding. |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
499 SKP->PENDING_MAPS_PTR is a list of keymaps waiting to be made into |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
500 separate panes. |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
501 If SKP->NOTREAL is nonzero, only check for equivalent key bindings, don't |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
502 evaluate expressions in menu items and don't make any menu. |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
503 If we encounter submenus deeper than SKP->MAXDEPTH levels, ignore them. |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
504 SKP->NOTBUTTONS is only used when simulating toggle boxes and radio |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
505 buttons. It keeps track of if we have seen a button in this menu or |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
506 not. */ |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
507 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
508 static void |
50938
20b3d6c3c7e5
(single_menu_item): Change last parameter to void* to
Andreas Schwab <schwab@suse.de>
parents:
50803
diff
changeset
|
509 single_menu_item (key, item, dummy, skp_v) |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
510 Lisp_Object key, item, dummy; |
50938
20b3d6c3c7e5
(single_menu_item): Change last parameter to void* to
Andreas Schwab <schwab@suse.de>
parents:
50803
diff
changeset
|
511 void *skp_v; |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
512 { |
25730
db88a4b84d91
(single_menu_item, Fx_popup_menu, Fx_popup_menu,
Gerd Moellmann <gerd@gnu.org>
parents:
25680
diff
changeset
|
513 Lisp_Object map, item_string, enabled; |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
514 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
|
515 int res; |
50938
20b3d6c3c7e5
(single_menu_item): Change last parameter to void* to
Andreas Schwab <schwab@suse.de>
parents:
50803
diff
changeset
|
516 struct skp *skp = skp_v; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
517 |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
518 /* 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
|
519 GCPRO2 (key, item); |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
520 res = parse_menu_item (item, skp->notreal, 0); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
521 UNGCPRO; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
522 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
|
523 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
|
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 map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP]; |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
526 |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
527 if (skp->notreal) |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
528 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
529 /* 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
|
530 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
|
531 if (!NILP (map)) |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
532 single_keymap_panes (map, Qnil, key, 1, skp->maxdepth - 1); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
533 return; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
534 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
535 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
536 enabled = XVECTOR (item_properties)->contents[ITEM_PROPERTY_ENABLE]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
537 item_string = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME]; |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
538 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
539 if (!NILP (map) && SREF (item_string, 0) == '@') |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
540 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
541 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
|
542 /* An enabled separate pane. Remember this to handle it later. */ |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
543 skp->pending_maps = Fcons (Fcons (map, Fcons (item_string, key)), |
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
544 skp->pending_maps); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
545 return; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
546 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
547 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
548 #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
|
549 /* 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
|
550 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
|
551 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
552 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
|
553 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
|
554 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
|
555 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
556 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
|
557 = 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
|
558 |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
559 if (skp->notbuttons) |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
560 /* 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
|
561 { |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
562 int index = skp->notbuttons; /* Index for first item this menu. */ |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
563 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
|
564 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
|
565 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
|
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 tem |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
568 = 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
|
569 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
|
570 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
571 index++; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
572 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
|
573 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
574 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
|
575 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
576 index++; |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
577 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
|
578 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
579 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
|
580 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
|
581 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
|
582 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
|
583 else |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
584 { |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
585 if (!submenu && SREF (tem, 0) != '\0' |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
586 && SREF (tem, 0) != '-') |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
587 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
|
588 = 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
|
589 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
|
590 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
591 } |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
592 skp->notbuttons = 0; |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
593 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
594 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
595 /* 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
|
596 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
|
597 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
|
598 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
|
599 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
|
600 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
601 /* Not a button. If we have earlier buttons, then we need a prefix. */ |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
602 else if (!skp->notbuttons && SREF (item_string, 0) != '\0' |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
603 && SREF (item_string, 0) != '-') |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
604 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
|
605 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
606 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
|
607 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
|
608 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
609 #endif /* not HAVE_BOXES */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
610 |
49322 | 611 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) |
53069
1218a42792ea
Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52981
diff
changeset
|
612 if (!NILP (map)) |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
613 /* 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
|
614 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
|
615 #endif |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
616 |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
617 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
|
618 XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF], |
24993 | 619 XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ], |
620 XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE], | |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
621 XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED], |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
622 XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP]); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
623 |
49322 | 624 #if defined (USE_X_TOOLKIT) || defined (USE_GTK) |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
625 /* 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
|
626 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
|
627 { |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
628 push_submenu_start (); |
50803
140fa7af01db
(struct skp): New struct, to pass args through map_keymap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
49651
diff
changeset
|
629 single_keymap_panes (map, Qnil, key, 0, skp->maxdepth - 1); |
21242
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
630 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
|
631 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
632 #endif |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
633 } |
10e1764f84b8
Don't include puresize.h any more as code that needs it
Richard M. Stallman <rms@gnu.org>
parents:
21178
diff
changeset
|
634 |
14036 | 635 /* 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
|
636 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
|
637 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
|
638 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
639 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
640 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
|
641 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
|
642 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
643 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
|
644 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
645 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
|
646 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
647 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
|
648 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
649 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
|
650 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
|
651 pane_name = Fcar (elt); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
652 CHECK_STRING (pane_name); |
51404 | 653 push_menu_pane (ENCODE_MENU_STRING (pane_name), Qnil); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
654 pane_data = Fcdr (elt); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
655 CHECK_CONS (pane_data); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
656 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
|
657 } |
118 | 658 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
659 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
|
660 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
661 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
662 /* 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
|
663 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
664 static void |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
665 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
|
666 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
|
667 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
668 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
|
669 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
670 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
|
671 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
672 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
|
673 if (STRINGP (item)) |
51404 | 674 push_menu_item (ENCODE_MENU_STRING (item), Qnil, Qnil, Qt, |
675 Qnil, Qnil, Qnil, Qnil); | |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
676 else if (NILP (item)) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
677 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
|
678 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
679 { |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
680 CHECK_CONS (item); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
681 item1 = Fcar (item); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
682 CHECK_STRING (item1); |
51404 | 683 push_menu_item (ENCODE_MENU_STRING (item1), Qt, Fcdr (item), |
684 Qt, Qnil, 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
|
685 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
686 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
687 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
688 |
49302
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
689 #ifdef HAVE_X_WINDOWS |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
690 /* Return the mouse position in *X and *Y. The coordinates are window |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
691 relative for the edit window in frame F. |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
692 This is for Fx_popup_menu. The mouse_position_hook can not |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
693 be used for X, as it returns window relative coordinates |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
694 for the window where the mouse is in. This could be the menu bar, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
695 the scroll bar or the edit window. Fx_popup_menu needs to be |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
696 sure it is the edit window. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
697 static void |
53069
1218a42792ea
Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52981
diff
changeset
|
698 mouse_position_for_popup (f, x, y) |
49302
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
699 FRAME_PTR f; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
700 int *x; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
701 int *y; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
702 { |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
703 Window root, dummy_window; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
704 int dummy; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
705 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
706 BLOCK_INPUT; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
707 |
49302
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
708 XQueryPointer (FRAME_X_DISPLAY (f), |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
709 DefaultRootWindow (FRAME_X_DISPLAY (f)), |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
710 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
711 /* The root window which contains the pointer. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
712 &root, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
713 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
714 /* Window pointer is on, not used */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
715 &dummy_window, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
716 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
717 /* The position on that root window. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
718 x, y, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
719 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
720 /* x/y in dummy_window coordinates, not used. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
721 &dummy, &dummy, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
722 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
723 /* Modifier keys and pointer buttons, about which |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
724 we don't care. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
725 (unsigned int *) &dummy); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
726 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
727 UNBLOCK_INPUT; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
728 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
729 /* xmenu_show expects window coordinates, not root window |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
730 coordinates. Translate. */ |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
731 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
732 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
49302
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
733 } |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
734 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
735 #endif /* HAVE_X_WINDOWS */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
736 |
6424
b3d22929b7c1
(Fx_popup_dialog, Fx_popup_menu): Require 2 args.
Richard M. Stallman <rms@gnu.org>
parents:
6406
diff
changeset
|
737 DEFUN ("x-popup-menu", Fx_popup_menu, Sx_popup_menu, 2, 2, 0, |
40993 | 738 doc: /* Pop up a deck-of-cards menu and return user's selection. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
739 POSITION is a position specification. This is either a mouse button event |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
740 or a list ((XOFFSET YOFFSET) WINDOW) |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
741 where XOFFSET and YOFFSET are positions in pixels from the top left |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
742 corner of WINDOW's frame. (WINDOW may be a frame object instead of a window.) |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
743 This controls the position of the center of the first line |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
744 in the first pane of the menu, not the top left of the menu as a whole. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
745 If POSITION is t, it means to use the current mouse position. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
746 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
747 MENU is a specifier for a menu. For the simplest case, MENU is a keymap. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
748 The menu items come from key bindings that have a menu string as well as |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
749 a definition; actually, the "definition" in such a key binding looks like |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
750 \(STRING . REAL-DEFINITION). To give the menu a title, put a string into |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
751 the keymap as a top-level element. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
752 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
753 If REAL-DEFINITION is nil, that puts a nonselectable string in the menu. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
754 Otherwise, REAL-DEFINITION should be a valid key binding definition. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
755 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
756 You can also use a list of keymaps as MENU. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
757 Then each keymap makes a separate pane. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
758 When MENU is a keymap or a list of keymaps, the return value |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
759 is a list of events. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
760 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
761 Alternatively, you can specify a menu of multiple panes |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
762 with a list of the form (TITLE PANE1 PANE2...), |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
763 where each pane is a list of form (TITLE ITEM1 ITEM2...). |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
764 Each ITEM is normally a cons cell (STRING . VALUE); |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
765 but a string can appear as an item--that makes a nonselectable line |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
766 in the menu. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
767 With this form of menu, the return value is VALUE from the chosen item. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
768 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
769 If POSITION is nil, don't display the menu at all, just precalculate the |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
770 cached information about equivalent key sequences. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
771 (position, menu) |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
772 Lisp_Object position, menu; |
118 | 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 Lisp_Object keymap, tem; |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31465
diff
changeset
|
775 int xpos = 0, ypos = 0; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
776 Lisp_Object title; |
118 | 777 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
|
778 Lisp_Object selection; |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
779 FRAME_PTR f = NULL; |
118 | 780 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
|
781 int keymaps = 0; |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
782 int for_click = 0; |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
783 int specpdl_count = SPECPDL_INDEX (); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
784 struct gcpro gcpro1; |
118 | 785 |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
786 #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
|
787 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
|
788 { |
49322 | 789 int get_current_pos_p = 0; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
790 check_x (); |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
791 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
792 /* 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
|
793 if (EQ (position, Qt) |
32179
15fe3fd7b8fc
(Fx_popup_menu, Fx_popup_dialog): Check for tool-bar
Dave Love <fx@gnu.org>
parents:
31829
diff
changeset
|
794 || (CONSP (position) && (EQ (XCAR (position), Qmenu_bar) |
15fe3fd7b8fc
(Fx_popup_menu, Fx_popup_dialog): Check for tool-bar
Dave Love <fx@gnu.org>
parents:
31829
diff
changeset
|
795 || EQ (XCAR (position), Qtool_bar)))) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
796 { |
49322 | 797 get_current_pos_p = 1; |
798 } | |
799 else | |
800 { | |
801 tem = Fcar (position); | |
802 if (CONSP (tem)) | |
803 { | |
804 window = Fcar (Fcdr (position)); | |
805 x = Fcar (tem); | |
806 y = Fcar (Fcdr (tem)); | |
807 } | |
808 else | |
809 { | |
810 for_click = 1; | |
811 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ | |
812 window = Fcar (tem); /* POSN_WINDOW (tem) */ | |
813 tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */ | |
814 x = Fcar (tem); | |
815 y = Fcdr (tem); | |
816 } | |
817 | |
818 /* If a click happens in an external tool bar or a detached | |
819 tool bar, x and y is NIL. In that case, use the current | |
820 mouse position. This happens for the help button in the | |
821 tool bar. Ideally popup-menu should pass NIL to | |
822 this function, but it doesn't. */ | |
823 if (NILP (x) && NILP (y)) | |
824 get_current_pos_p = 1; | |
825 } | |
826 | |
827 if (get_current_pos_p) | |
828 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
829 /* Use the mouse's current position. */ |
25680
841eb01263ef
(Fx_popup_menu): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
830 FRAME_PTR new_f = SELECTED_FRAME (); |
49302
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
831 #ifdef HAVE_X_WINDOWS |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
832 /* Can't use mouse_position_hook for X since it returns |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
833 coordinates relative to the window the mouse is in, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
834 we need coordinates relative to the edit widget always. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
835 if (new_f != 0) |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
836 { |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
837 int cur_x, cur_y; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
838 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
839 mouse_position_for_popup (new_f, &cur_x, &cur_y); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
840 /* cur_x/y may be negative, so use make_number. */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
841 x = make_number (cur_x); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
842 y = make_number (cur_y); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
843 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
844 |
49302
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
845 #else /* not HAVE_X_WINDOWS */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
846 Lisp_Object bar_window; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
847 enum scroll_bar_part part; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
848 unsigned long time; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
849 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
850 if (mouse_position_hook) |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
851 (*mouse_position_hook) (&new_f, 1, &bar_window, |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
852 &part, &x, &y, &time); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
853 #endif /* not HAVE_X_WINDOWS */ |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
854 |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
855 if (new_f != 0) |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
856 XSETFRAME (window, new_f); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
857 else |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
858 { |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
859 window = selected_window; |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
860 XSETFASTINT (x, 0); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
861 XSETFASTINT (y, 0); |
17a9a82ad89f
(mouse_position_for_popup): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49116
diff
changeset
|
862 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
863 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
864 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
865 CHECK_NUMBER (x); |
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
866 CHECK_NUMBER (y); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
867 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
868 /* 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
|
869 |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
870 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
|
871 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
872 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
|
873 xpos = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
874 ypos = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
875 } |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
876 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
|
877 { |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
878 CHECK_LIVE_WINDOW (window); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
879 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
|
880 |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
881 xpos = WINDOW_LEFT_EDGE_X (XWINDOW (window)); |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
882 ypos = WINDOW_TOP_EDGE_Y (XWINDOW (window)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
883 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
884 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
885 /* ??? 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
|
886 but I don't want to make one now. */ |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
887 CHECK_WINDOW (window); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
888 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
889 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
|
890 ypos += XINT (y); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
891 } |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
892 Vmenu_updating_frame = Qnil; |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
893 #endif /* HAVE_MENUS */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
894 |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
895 record_unwind_protect (unuse_menu_items, Qnil); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
896 title = Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
897 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
|
898 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
899 /* 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
|
900 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32179
diff
changeset
|
901 keymap = get_keymap (menu, 0, 0); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32179
diff
changeset
|
902 if (CONSP (keymap)) |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
903 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
904 /* 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
|
905 Lisp_Object prompt; |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
906 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
907 /* 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
|
908 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
|
909 |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
910 /* 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
|
911 That string is the title of the menu. */ |
39690
38c1890338cc
(keymap_panes, Fx_popup_menu): Use Fkeymap_prompt.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
912 prompt = Fkeymap_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
|
913 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
|
914 title = prompt; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
915 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
916 /* 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
|
917 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
|
918 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
|
919 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
920 keymaps = 1; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
921 } |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32179
diff
changeset
|
922 else if (CONSP (menu) && KEYMAPP (XCAR (menu))) |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
923 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
924 /* 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
|
925 int nmaps = XFASTINT (Flength (menu)); |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
926 Lisp_Object *maps |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
927 = (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
|
928 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
|
929 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
930 title = Qnil; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
931 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
932 /* 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
|
933 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
|
934 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
|
935 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
936 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
|
937 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32179
diff
changeset
|
938 maps[i++] = keymap = get_keymap (Fcar (tem), 1, 0); |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
939 |
39690
38c1890338cc
(keymap_panes, Fx_popup_menu): Use Fkeymap_prompt.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
940 prompt = Fkeymap_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
|
941 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
|
942 title = prompt; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
943 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
944 |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
945 /* 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
|
946 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
|
947 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
948 /* 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
|
949 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
|
950 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
|
951 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
952 keymaps = 1; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
953 } |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
954 else |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
955 { |
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
956 /* 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
|
957 title = Fcar (menu); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
958 CHECK_STRING (title); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
959 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
960 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
|
961 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
962 keymaps = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
963 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
964 |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
965 unbind_to (specpdl_count, Qnil); |
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
966 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
967 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
|
968 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
969 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
|
970 UNGCPRO; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
971 return Qnil; |
118 | 972 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
973 |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
974 #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
|
975 /* 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
|
976 BLOCK_INPUT; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
977 |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
978 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
|
979 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
|
980 UNBLOCK_INPUT; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
981 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
982 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
|
983 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
984 UNGCPRO; |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
985 #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
|
986 |
118 | 987 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
|
988 return selection; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
989 } |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
990 |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
991 #ifdef HAVE_MENUS |
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
992 |
6424
b3d22929b7c1
(Fx_popup_dialog, Fx_popup_menu): Require 2 args.
Richard M. Stallman <rms@gnu.org>
parents:
6406
diff
changeset
|
993 DEFUN ("x-popup-dialog", Fx_popup_dialog, Sx_popup_dialog, 2, 2, 0, |
40993 | 994 doc: /* Pop up a dialog box and return user's selection. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
995 POSITION specifies which frame to use. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
996 This is normally a mouse button event or a window or frame. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
997 If POSITION is t, it means to use the frame the mouse is on. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
998 The dialog box appears in the middle of the specified frame. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
999 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1000 CONTENTS specifies the alternatives to display in the dialog box. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1001 It is a list of the form (TITLE ITEM1 ITEM2...). |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1002 Each ITEM is a cons cell (STRING . VALUE). |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1003 The return value is VALUE from the chosen item. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1004 |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1005 An ITEM may also be just a string--that makes a nonselectable item. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1006 An ITEM may also be nil--that means to put all preceding items |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
1007 on the left of the dialog box and all following items on the right. |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
1008 \(By default, approximately half appear on each side.) */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
1009 (position, contents) |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1010 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
|
1011 { |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
1012 FRAME_PTR f = NULL; |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1013 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
|
1014 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
1015 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
|
1016 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1017 /* 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
|
1018 if (EQ (position, Qt) |
32179
15fe3fd7b8fc
(Fx_popup_menu, Fx_popup_dialog): Check for tool-bar
Dave Love <fx@gnu.org>
parents:
31829
diff
changeset
|
1019 || (CONSP (position) && (EQ (XCAR (position), Qmenu_bar) |
15fe3fd7b8fc
(Fx_popup_menu, Fx_popup_dialog): Check for tool-bar
Dave Love <fx@gnu.org>
parents:
31829
diff
changeset
|
1020 || EQ (XCAR (position), Qtool_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
|
1021 { |
6653
14a0a3fe93fd
(Fx_popup_dialog): If POSITION is t, use selected frame.
Richard M. Stallman <rms@gnu.org>
parents:
6625
diff
changeset
|
1022 #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
|
1023 /* Use the mouse's current position. */ |
25680
841eb01263ef
(Fx_popup_menu): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
1024 FRAME_PTR new_f = SELECTED_FRAME (); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1025 Lisp_Object bar_window; |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
1026 enum scroll_bar_part part; |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1027 unsigned long time; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1028 Lisp_Object x, y; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1029 |
11125
dc78213dd2b3
(Fx_popup_menu): Pass 1 for `insist' arg.
Richard M. Stallman <rms@gnu.org>
parents:
10835
diff
changeset
|
1030 (*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
|
1031 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1032 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
|
1033 XSETFRAME (window, new_f); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1034 else |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1035 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
|
1036 #endif |
11907
0f03ad1cac1e
(Fx_popup_dialog): Treat (menu-bar) like t, for POSITION.
Karl Heuer <kwzh@gnu.org>
parents:
11898
diff
changeset
|
1037 window = selected_window; |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1038 } |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1039 else if (CONSP (position)) |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1040 { |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1041 Lisp_Object tem; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1042 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
|
1043 if (CONSP (tem)) |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1044 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
|
1045 else |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
1046 { |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1047 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1048 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
|
1049 } |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1050 } |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1051 else if (WINDOWP (position) || FRAMEP (position)) |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1052 window = position; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1053 else |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1054 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
|
1055 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1056 /* 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
|
1057 |
9102
7a73653817de
(menu_item_enabled_p, single_keymap_panes, Fx_popup_menu, Fx_popup_dialog):
Karl Heuer <kwzh@gnu.org>
parents:
8849
diff
changeset
|
1058 if (FRAMEP (window)) |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1059 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
|
1060 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
|
1061 { |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
1062 CHECK_LIVE_WINDOW (window); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1063 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
|
1064 } |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1065 else |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1066 /* ??? 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
|
1067 but I don't want to make one now. */ |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
1068 CHECK_WINDOW (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
|
1069 |
49322 | 1070 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1071 /* Display a menu with these alternatives |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1072 in the middle of frame F. */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1073 { |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1074 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
|
1075 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
|
1076 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
|
1077 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
|
1078 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
|
1079 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1080 return Fx_popup_menu (newpos, |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1081 Fcons (Fcar (contents), Fcons (contents, Qnil))); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1082 } |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1083 #else |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1084 { |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1085 Lisp_Object title; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1086 char *error_name; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1087 Lisp_Object selection; |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
1088 int specpdl_count = SPECPDL_INDEX (); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1089 |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1090 /* 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
|
1091 title = Fcar (contents); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40477
diff
changeset
|
1092 CHECK_STRING (title); |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
1093 record_unwind_protect (unuse_menu_items, 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
|
1094 |
53545
ed3e26153ee9
* xmenu.c (Fx_popup_dialog): Add an Ok button if no buttons are
Jan Djärv <jan.h.d@swipnet.se>
parents:
53325
diff
changeset
|
1095 if (NILP (Fcar (Fcdr (contents)))) |
ed3e26153ee9
* xmenu.c (Fx_popup_dialog): Add an Ok button if no buttons are
Jan Djärv <jan.h.d@swipnet.se>
parents:
53325
diff
changeset
|
1096 /* No buttons specified, add an "Ok" button so users can pop down |
ed3e26153ee9
* xmenu.c (Fx_popup_dialog): Add an Ok button if no buttons are
Jan Djärv <jan.h.d@swipnet.se>
parents:
53325
diff
changeset
|
1097 the dialog. Also, the lesstif/motif version crashes if there are |
ed3e26153ee9
* xmenu.c (Fx_popup_dialog): Add an Ok button if no buttons are
Jan Djärv <jan.h.d@swipnet.se>
parents:
53325
diff
changeset
|
1098 no buttons. */ |
ed3e26153ee9
* xmenu.c (Fx_popup_dialog): Add an Ok button if no buttons are
Jan Djärv <jan.h.d@swipnet.se>
parents:
53325
diff
changeset
|
1099 contents = Fcons (title, Fcons (Fcons (build_string ("Ok"), Qt), Qnil)); |
ed3e26153ee9
* xmenu.c (Fx_popup_dialog): Add an Ok button if no buttons are
Jan Djärv <jan.h.d@swipnet.se>
parents:
53325
diff
changeset
|
1100 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1101 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
|
1102 |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1103 /* Display them in a dialog box. */ |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1104 BLOCK_INPUT; |
11502
7ecd4aa33faa
(Fx_popup_dialog): Don't pass menubarp arg to xdialog_show.
Karl Heuer <kwzh@gnu.org>
parents:
11491
diff
changeset
|
1105 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
|
1106 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
|
1107 |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
1108 unbind_to (specpdl_count, Qnil); |
6439
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1109 discard_menu_items (); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1110 |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1111 if (error_name) error (error_name); |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1112 return selection; |
463b12ba8260
(xdialog_show): Delete args x, y.
Richard M. Stallman <rms@gnu.org>
parents:
6426
diff
changeset
|
1113 } |
6325
d6817c9c0413
Undo previous change. Instead:
Richard M. Stallman <rms@gnu.org>
parents:
6324
diff
changeset
|
1114 #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
|
1115 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1116 |
49322 | 1117 #if defined (USE_X_TOOLKIT) || defined (USE_GTK) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1118 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1119 /* Loop in Xt until the menu pulldown or dialog popup has been |
13821 | 1120 popped down (deactivated). This is used for x-popup-menu |
48912
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
1121 and x-popup-dialog; it is not used for the menu bar. |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
1122 |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
1123 If DO_TIMERS is nonzero, run timers. |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1124 If DOWN_ON_KEYPRESS is nonzero, pop down if a key is pressed. |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1125 |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1126 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
|
1127 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
|
1128 |
49322 | 1129 #ifdef USE_X_TOOLKIT |
48912
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
1130 static void |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1131 popup_get_selection (initial_event, dpyinfo, id, do_timers, down_on_keypress) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1132 XEvent *initial_event; |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1133 struct x_display_info *dpyinfo; |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1134 LWLIB_ID id; |
48912
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
1135 int do_timers; |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1136 int down_on_keypress; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1137 { |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1138 XEvent event; |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1139 |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1140 while (popup_activated_flag) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1141 { |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1142 /* If we have no events to run, consider timers. */ |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1143 if (do_timers && !XtAppPending (Xt_app_con)) |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1144 timer_check (1); |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1145 |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1146 if (initial_event) |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1147 { |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1148 event = *initial_event; |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1149 initial_event = 0; |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1150 } |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1151 else |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1152 XtAppNextEvent (Xt_app_con, &event); |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1153 |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1154 /* Make sure we don't consider buttons grabbed after menu goes. |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1155 And make sure to deactivate for any ButtonRelease, |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1156 even if XtDispatchEvent doesn't do that. */ |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1157 if (event.type == ButtonRelease |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1158 && 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
|
1159 { |
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1160 dpyinfo->grabbed &= ~(1 << event.xbutton.button); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1161 #ifdef USE_MOTIF /* Pretending that the event came from a |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1162 Btn1Down seems the only way to convince Motif to |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1163 activate its callbacks; setting the XmNmenuPost |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1164 isn't working. --marcus@sysc.pdx.edu. */ |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1165 event.xbutton.button = 1; |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1166 /* Motif only pops down menus when no Ctrl, Alt or Mod |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1167 key is pressed and the button is released. So reset key state |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1168 so Motif thinks this is the case. */ |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1169 event.xbutton.state = 0; |
15839
e66ccb471d26
(xmenu_show): Set dummy.state.
Richard M. Stallman <rms@gnu.org>
parents:
15807
diff
changeset
|
1170 #endif |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1171 } |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1172 /* If the user presses a key that doesn't go to the menu, |
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1173 deactivate the menu. |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1174 The user is likely to do that if we get wedged. |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1175 All toolkits now pop down menus on ESC. |
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1176 For dialogs however, the focus may not be on the dialog, so |
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1177 in that case, we pop down. */ |
11954
4117d74ba254
(popup_get_selection): Force deactivation if key pressed.
Karl Heuer <kwzh@gnu.org>
parents:
11918
diff
changeset
|
1178 else if (event.type == KeyPress |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1179 && down_on_keypress |
15628
f74c79dcaf8d
(popup_get_selection): For a ButtonRelease on the proper
Karl Heuer <kwzh@gnu.org>
parents:
15428
diff
changeset
|
1180 && dpyinfo->display == event.xbutton.display) |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1181 { |
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1182 KeySym keysym = XLookupKeysym (&event.xkey, 0); |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1183 if (!IsModifierKey (keysym) |
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1184 && x_any_window_to_frame (dpyinfo, event.xany.window) != NULL) |
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
1185 popup_activated_flag = 0; |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1186 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1187 |
49116
8c37b25a7f02
(Fx_popup_menu): If popping up at mouse position,
Jan Djärv <jan.h.d@swipnet.se>
parents:
48946
diff
changeset
|
1188 x_dispatch_event (&event, event.xany.display); |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1189 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1190 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1191 |
49322 | 1192 #endif /* USE_X_TOOLKIT */ |
1193 | |
1194 #ifdef USE_GTK | |
1195 /* Loop util popup_activated_flag is set to zero in a callback. | |
1196 Used for popup menus and dialogs. */ | |
1197 static void | |
1198 popup_widget_loop () | |
1199 { | |
1200 ++popup_activated_flag; | |
1201 | |
1202 /* Process events in the Gtk event loop until done. */ | |
1203 while (popup_activated_flag) | |
1204 { | |
1205 gtk_main_iteration (); | |
1206 } | |
1207 } | |
1208 #endif | |
1209 | |
12661 | 1210 /* Activate the menu bar of frame F. |
1211 This is called from keyboard.c when it gets the | |
45803
9484de301252
Rename enum event_kind items.
Pavel Janík <Pavel@Janik.cz>
parents:
42588
diff
changeset
|
1212 MENU_BAR_ACTIVATE_EVENT out of the Emacs event queue. |
12661 | 1213 |
1214 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
|
1215 that was saved in saved_menu_event. |
12661 | 1216 That makes the toolkit do its thing. |
1217 | |
1218 But first we recompute the menu bar contents (the whole tree). | |
1219 | |
1220 The reason for saving the button event until here, instead of | |
1221 passing it to the toolkit right away, is that we can safely | |
1222 execute Lisp code. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1223 |
21514 | 1224 void |
12661 | 1225 x_activate_menubar (f) |
1226 FRAME_PTR f; | |
1227 { | |
15710
85d87cd0f655
(x_activate_menubar): Allow any event, not just ButtonPress.
Karl Heuer <kwzh@gnu.org>
parents:
15628
diff
changeset
|
1228 if (!f->output_data.x->saved_menu_event->type) |
12661 | 1229 return; |
1230 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1231 #ifdef USE_GTK |
53069
1218a42792ea
Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52981
diff
changeset
|
1232 if (! xg_win_to_widget (FRAME_X_DISPLAY (f), |
1218a42792ea
Implement multiple display handling for GTK.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52981
diff
changeset
|
1233 f->output_data.x->saved_menu_event->xany.window)) |
49322 | 1234 return; |
1235 #endif | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1236 |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1237 set_frame_menubar (f, 0, 1); |
12661 | 1238 BLOCK_INPUT; |
49322 | 1239 #ifdef USE_GTK |
1240 XPutBackEvent (f->output_data.x->display_info->display, | |
1241 f->output_data.x->saved_menu_event); | |
1242 popup_activated_flag = 1; | |
1243 #else | |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
1244 XtDispatchEvent (f->output_data.x->saved_menu_event); |
49322 | 1245 #endif |
12661 | 1246 UNBLOCK_INPUT; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1247 #ifdef USE_MOTIF |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1248 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
|
1249 pending_menu_activation = 1; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1250 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1251 |
12661 | 1252 /* 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
|
1253 f->output_data.x->saved_menu_event->type = 0; |
12661 | 1254 } |
1255 | |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1256 /* 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
|
1257 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1258 int |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1259 popup_activated () |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1260 { |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1261 return popup_activated_flag; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1262 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1263 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1264 /* 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
|
1265 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
|
1266 |
49322 | 1267 #ifndef USE_GTK |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1268 static void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1269 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
|
1270 Widget widget; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1271 LWLIB_ID id; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1272 XtPointer client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1273 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1274 popup_activated_flag = 1; |
27425
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1275 } |
49322 | 1276 #endif |
27425
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1277 |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1278 /* This callback is invoked when a dialog or menu is finished being |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1279 used and has been unposted. */ |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1280 |
49322 | 1281 #ifdef USE_GTK |
1282 static void | |
1283 popup_deactivate_callback (widget, client_data) | |
1284 GtkWidget *widget; | |
1285 gpointer client_data; | |
1286 { | |
1287 popup_activated_flag = 0; | |
1288 } | |
1289 #else | |
27425
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1290 static void |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1291 popup_deactivate_callback (widget, id, client_data) |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1292 Widget widget; |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1293 LWLIB_ID id; |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1294 XtPointer client_data; |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1295 { |
e575223479a1
(popup_activated_flag): Make externally visible.
Gerd Moellmann <gerd@gnu.org>
parents:
27341
diff
changeset
|
1296 popup_activated_flag = 0; |
118 | 1297 } |
49322 | 1298 #endif |
1299 | |
1300 | |
1301 /* Function that finds the frame for WIDGET and shows the HELP text | |
1302 for that widget. | |
1303 F is the frame if known, or NULL if not known. */ | |
1304 static void | |
1305 show_help_event (f, widget, help) | |
1306 FRAME_PTR f; | |
1307 xt_or_gtk_widget widget; | |
1308 Lisp_Object help; | |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1309 { |
49322 | 1310 Lisp_Object frame; |
1311 | |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1312 if (f) |
30472
0c982ed8515f
(menu_highlight_callback): Call show_help_echo directly
Gerd Moellmann <gerd@gnu.org>
parents:
30420
diff
changeset
|
1313 { |
0c982ed8515f
(menu_highlight_callback): Call show_help_echo directly
Gerd Moellmann <gerd@gnu.org>
parents:
30420
diff
changeset
|
1314 XSETFRAME (frame, f); |
0c982ed8515f
(menu_highlight_callback): Call show_help_echo directly
Gerd Moellmann <gerd@gnu.org>
parents:
30420
diff
changeset
|
1315 kbd_buffer_store_help_event (frame, help); |
0c982ed8515f
(menu_highlight_callback): Call show_help_echo directly
Gerd Moellmann <gerd@gnu.org>
parents:
30420
diff
changeset
|
1316 } |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1317 else |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1318 { |
53325
8e8832ef3963
(show_help_event): Remove unused code.
Kim F. Storm <storm@cua.dk>
parents:
53069
diff
changeset
|
1319 #if 0 /* This code doesn't do anything useful. ++kfs */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1320 /* WIDGET is the popup menu. It's parent is the frame's |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1321 widget. See which frame that is. */ |
49322 | 1322 xt_or_gtk_widget frame_widget = XtParent (widget); |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1323 Lisp_Object tail; |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1324 |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1325 for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail)) |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1326 { |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1327 frame = XCAR (tail); |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1328 if (GC_FRAMEP (frame) |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1329 && (f = XFRAME (frame), |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1330 FRAME_X_P (f) && f->output_data.x->widget == frame_widget)) |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1331 break; |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1332 } |
53325
8e8832ef3963
(show_help_event): Remove unused code.
Kim F. Storm <storm@cua.dk>
parents:
53069
diff
changeset
|
1333 #endif |
30472
0c982ed8515f
(menu_highlight_callback): Call show_help_echo directly
Gerd Moellmann <gerd@gnu.org>
parents:
30420
diff
changeset
|
1334 show_help_echo (help, Qnil, Qnil, Qnil, 1); |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1335 } |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1336 } |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1337 |
49322 | 1338 /* Callback called when menu items are highlighted/unhighlighted |
1339 while moving the mouse over them. WIDGET is the menu bar or menu | |
1340 popup widget. ID is its LWLIB_ID. CALL_DATA contains a pointer to | |
1341 the data structure for the menu item, or null in case of | |
1342 unhighlighting. */ | |
1343 | |
1344 #ifdef USE_GTK | |
1345 void | |
1346 menu_highlight_callback (widget, call_data) | |
1347 GtkWidget *widget; | |
1348 gpointer call_data; | |
1349 { | |
1350 xg_menu_item_cb_data *cb_data; | |
1351 Lisp_Object help; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1352 |
49322 | 1353 cb_data = (xg_menu_item_cb_data*) g_object_get_data (G_OBJECT (widget), |
1354 XG_ITEM_DATA); | |
1355 if (! cb_data) return; | |
1356 | |
1357 help = call_data ? cb_data->help : Qnil; | |
1358 | |
1359 /* If popup_activated_flag is greater than 1 we are in a popup menu. | |
1360 Don't show help for them, they won't appear before the | |
1361 popup is popped down. */ | |
1362 if (popup_activated_flag <= 1) | |
1363 show_help_event (cb_data->cl_data->f, widget, help); | |
1364 } | |
1365 #else | |
1366 void | |
1367 menu_highlight_callback (widget, id, call_data) | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1368 Widget widget; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1369 LWLIB_ID id; |
49322 | 1370 void *call_data; |
1371 { | |
1372 struct frame *f; | |
1373 Lisp_Object help; | |
1374 | |
1375 widget_value *wv = (widget_value *) call_data; | |
1376 | |
1377 help = wv ? wv->help : Qnil; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1378 |
49322 | 1379 /* Determine the frame for the help event. */ |
1380 f = menubar_id_to_frame (id); | |
1381 | |
1382 show_help_event (f, widget, help); | |
1383 } | |
1384 #endif | |
1385 | |
1386 /* Find the menu selection and store it in the keyboard buffer. | |
1387 F is the frame the menu is on. | |
1388 MENU_BAR_ITEMS_USED is the length of VECTOR. | |
1389 VECTOR is an array of menu events for the whole menu. | |
1390 */ | |
1391 void | |
1392 find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data) | |
1393 FRAME_PTR f; | |
1394 int menu_bar_items_used; | |
1395 Lisp_Object vector; | |
1396 void *client_data; | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1397 { |
11655
a9f93ce6e1b4
(xmenu_show, menubar_selection_callback): Move declaration
Karl Heuer <kwzh@gnu.org>
parents:
11614
diff
changeset
|
1398 Lisp_Object prefix, entry; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1399 Lisp_Object *subprefix_stack; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1400 int submenu_depth = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1401 int i; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1402 |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31465
diff
changeset
|
1403 entry = Qnil; |
49322 | 1404 subprefix_stack = (Lisp_Object *) alloca (menu_bar_items_used * sizeof (Lisp_Object)); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1405 prefix = Qnil; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1406 i = 0; |
49322 | 1407 |
1408 while (i < menu_bar_items_used) | |
9233
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 (EQ (XVECTOR (vector)->contents[i], Qnil)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1411 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1412 subprefix_stack[submenu_depth++] = prefix; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1413 prefix = entry; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1414 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1415 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1416 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
|
1417 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1418 prefix = subprefix_stack[--submenu_depth]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1419 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1420 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1421 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
|
1422 { |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1423 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
|
1424 i += MENU_ITEMS_PANE_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1425 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1426 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1427 { |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1428 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
|
1429 /* 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
|
1430 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
|
1431 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
|
1432 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1433 int j; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1434 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
|
1435 Lisp_Object frame; |
51575
45724e359a61
(find_and_call_menu_selection): Don't pass uninitialized
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
51404
diff
changeset
|
1436 EVENT_INIT (buf); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1437 |
10799
1745fca9370a
(menubar_selection_callback): frame_or_window field of a menu-bar event now
Karl Heuer <kwzh@gnu.org>
parents:
10757
diff
changeset
|
1438 XSETFRAME (frame, f); |
30181
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1439 buf.kind = MENU_BAR_EVENT; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1440 buf.frame_or_window = frame; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1441 buf.arg = frame; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1442 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1443 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1444 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
|
1445 if (!NILP (subprefix_stack[j])) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1446 { |
30181
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1447 buf.kind = MENU_BAR_EVENT; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1448 buf.frame_or_window = frame; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1449 buf.arg = subprefix_stack[j]; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1450 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1451 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1452 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1453 if (!NILP (prefix)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1454 { |
30181
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1455 buf.kind = MENU_BAR_EVENT; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1456 buf.frame_or_window = frame; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1457 buf.arg = prefix; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1458 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1459 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1460 |
30181
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1461 buf.kind = MENU_BAR_EVENT; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1462 buf.frame_or_window = frame; |
770a280db6ee
(menu_highlight_callback): Store help string in the
Gerd Moellmann <gerd@gnu.org>
parents:
30144
diff
changeset
|
1463 buf.arg = entry; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1464 kbd_buffer_store_event (&buf); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1465 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1466 return; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1467 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1468 i += MENU_ITEMS_ITEM_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1469 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1470 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1471 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1472 |
49322 | 1473 |
1474 #ifdef USE_GTK | |
1475 /* Gtk calls callbacks just because we tell it what item should be | |
1476 selected in a radio group. If this variable is set to a non-zero | |
1477 value, we are creating menus and don't want callbacks right now. | |
1478 */ | |
1479 static int xg_crazy_callback_abort; | |
1480 | |
1481 /* This callback is called from the menu bar pulldown menu | |
1482 when the user makes a selection. | |
1483 Figure out what the user chose | |
1484 and put the appropriate events into the keyboard buffer. */ | |
1485 static void | |
1486 menubar_selection_callback (widget, client_data) | |
1487 GtkWidget *widget; | |
1488 gpointer client_data; | |
1489 { | |
1490 xg_menu_item_cb_data *cb_data = (xg_menu_item_cb_data*) client_data; | |
1491 | |
1492 if (xg_crazy_callback_abort) | |
1493 return; | |
1494 | |
1495 if (! cb_data || ! cb_data->cl_data || ! cb_data->cl_data->f) | |
1496 return; | |
1497 | |
1498 find_and_call_menu_selection (cb_data->cl_data->f, | |
1499 cb_data->cl_data->menu_bar_items_used, | |
1500 cb_data->cl_data->menu_bar_vector, | |
1501 cb_data->call_data); | |
1502 } | |
1503 | |
1504 #else /* not USE_GTK */ | |
1505 | |
1506 /* This callback is called from the menu bar pulldown menu | |
1507 when the user makes a selection. | |
1508 Figure out what the user chose | |
1509 and put the appropriate events into the keyboard buffer. */ | |
1510 static void | |
1511 menubar_selection_callback (widget, id, client_data) | |
1512 Widget widget; | |
1513 LWLIB_ID id; | |
1514 XtPointer client_data; | |
1515 { | |
1516 FRAME_PTR f; | |
1517 | |
1518 f = menubar_id_to_frame (id); | |
1519 if (!f) | |
1520 return; | |
1521 find_and_call_menu_selection (f, f->menu_bar_items_used, | |
1522 f->menu_bar_vector, client_data); | |
1523 } | |
1524 #endif /* not USE_GTK */ | |
1525 | |
14553
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1526 /* 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
|
1527 |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1528 widget_value * |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1529 xmalloc_widget_value () |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1530 { |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1531 widget_value *value; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1532 |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1533 BLOCK_INPUT; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1534 value = malloc_widget_value (); |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1535 UNBLOCK_INPUT; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1536 |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1537 return value; |
00521a7aaa75
(xmalloc_widget_value): Define only if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
14548
diff
changeset
|
1538 } |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
1539 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1540 /* 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
|
1541 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
|
1542 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
|
1543 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
|
1544 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1545 void |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1546 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
|
1547 widget_value *wv; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1548 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1549 if (! wv) return; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1550 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1551 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
|
1552 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1553 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
|
1554 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1555 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
|
1556 wv->contents = (widget_value *) 0xDEADBEEF; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1557 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1558 if (wv->next) |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1559 { |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1560 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
|
1561 wv->next = (widget_value *) 0xDEADBEEF; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1562 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1563 BLOCK_INPUT; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1564 free_widget_value (wv); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1565 UNBLOCK_INPUT; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1566 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1567 |
48270
b6f3eaeb71e5
(parse_single_submenu): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48113
diff
changeset
|
1568 /* Set up data in menu_items for a menu bar item |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1569 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
|
1570 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
|
1571 |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1572 static int |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1573 parse_single_submenu (item_key, item_name, maps) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1574 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
|
1575 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1576 Lisp_Object length; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1577 int len; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1578 Lisp_Object *mapvec; |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1579 int i; |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1580 int top_level_items = 0; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1581 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1582 length = Flength (maps); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1583 len = XINT (length); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1584 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1585 /* 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
|
1586 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
|
1587 for (i = 0; i < len; i++) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1588 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1589 mapvec[i] = Fcar (maps); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1590 maps = Fcdr (maps); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1591 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1592 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1593 /* 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
|
1594 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
|
1595 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
|
1596 { |
48270
b6f3eaeb71e5
(parse_single_submenu): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
48113
diff
changeset
|
1597 if (!KEYMAPP (mapvec[i])) |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1598 { |
15311
a9ed91ec0700
(single_submenu): Handle non-keymap lists like symbols.
Richard M. Stallman <rms@gnu.org>
parents:
15107
diff
changeset
|
1599 /* 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
|
1600 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
|
1601 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
|
1602 push_menu_pane (Qnil, Qnil); |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1603 push_menu_item (item_name, Qt, item_key, mapvec[i], |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1604 Qnil, 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
|
1605 } |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1606 else |
48946
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1607 { |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1608 Lisp_Object prompt; |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1609 prompt = Fkeymap_prompt (mapvec[i]); |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1610 single_keymap_panes (mapvec[i], |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1611 !NILP (prompt) ? prompt : item_name, |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1612 item_key, 0, 10); |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1613 } |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1614 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1615 |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1616 return top_level_items; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1617 } |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1618 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1619 /* Create a tree of widget_value objects |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1620 representing the panes and items |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1621 in menu_items starting at index START, up to index END. */ |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1622 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1623 static widget_value * |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1624 digest_single_submenu (start, end, top_level_items) |
48329
0d792a35828b
(unuse_menu_items, digest_single_submenu):
Dave Love <fx@gnu.org>
parents:
48270
diff
changeset
|
1625 int start, end, top_level_items; |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1626 { |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1627 widget_value *wv, *prev_wv, *save_wv, *first_wv; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1628 int i; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1629 int submenu_depth = 0; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1630 widget_value **submenu_stack; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1631 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1632 submenu_stack |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1633 = (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
|
1634 wv = xmalloc_widget_value (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1635 wv->name = "menu"; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1636 wv->value = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1637 wv->enabled = 1; |
24993 | 1638 wv->button_type = BUTTON_TYPE_NONE; |
42586
3d2b46b8e1bf
(single_submenu): Initialize wv->help to Qnil.
Jason Rumney <jasonr@gnu.org>
parents:
42583
diff
changeset
|
1639 wv->help = Qnil; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1640 first_wv = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1641 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
|
1642 prev_wv = 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1643 |
48946
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1644 /* Loop over all panes and items made by the preceding call |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1645 to parse_single_submenu and construct a tree of widget_value objects. |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1646 Ignore the panes and items used by previous calls to |
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1647 digest_single_submenu, even though those are also in menu_items. */ |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1648 i = start; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1649 while (i < end) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1650 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1651 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
|
1652 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1653 submenu_stack[submenu_depth++] = save_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1654 save_wv = prev_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1655 prev_wv = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1656 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1657 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1658 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
|
1659 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1660 prev_wv = save_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1661 save_wv = submenu_stack[--submenu_depth]; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1662 i++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1663 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1664 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
|
1665 && submenu_depth != 0) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1666 i += MENU_ITEMS_PANE_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1667 /* 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
|
1668 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
|
1669 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
|
1670 i += 1; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1671 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
|
1672 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1673 /* Create a new pane. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1674 Lisp_Object pane_name, prefix; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1675 char *pane_string; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1676 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1677 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
|
1678 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1679 |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1680 #ifndef HAVE_MULTILINGUAL_MENU |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1681 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1682 { |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
1683 pane_name = ENCODE_SYSTEM (pane_name); |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1684 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1685 } |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1686 #endif |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1687 pane_string = (NILP (pane_name) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1688 ? "" : (char *) SDATA (pane_name)); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1689 /* 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
|
1690 under the top-level menu. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1691 if (menu_items_n_panes == 1) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1692 pane_string = ""; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1693 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1694 /* 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
|
1695 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
|
1696 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
|
1697 if (strcmp (pane_string, "")) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1698 { |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1699 wv = xmalloc_widget_value (); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1700 if (save_wv) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1701 save_wv->next = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1702 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1703 first_wv->contents = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1704 wv->name = pane_string; |
12747
a36d5f3940b5
[USE_X_TOOLKIT] (xmenu_show): Compute root-based
Richard M. Stallman <rms@gnu.org>
parents:
12672
diff
changeset
|
1705 /* 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
|
1706 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
|
1707 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
|
1708 wv->name++; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1709 wv->value = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1710 wv->enabled = 1; |
24993 | 1711 wv->button_type = BUTTON_TYPE_NONE; |
42586
3d2b46b8e1bf
(single_submenu): Initialize wv->help to Qnil.
Jason Rumney <jasonr@gnu.org>
parents:
42583
diff
changeset
|
1712 wv->help = Qnil; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1713 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1714 save_wv = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1715 prev_wv = 0; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1716 i += MENU_ITEMS_PANE_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1717 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1718 else |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1719 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1720 /* Create a new item within current pane. */ |
24993 | 1721 Lisp_Object item_name, enable, descrip, def, type, selected; |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
1722 Lisp_Object help; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1723 |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1724 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1725 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1726 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1727 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1728 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1729 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1730 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); |
24993 | 1731 |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
1732 #ifndef HAVE_MULTILINGUAL_MENU |
24993 | 1733 if (STRING_MULTIBYTE (item_name)) |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1734 { |
51404 | 1735 item_name = ENCODE_MENU_STRING (item_name); |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1736 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1737 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1738 |
24993 | 1739 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1740 { |
51404 | 1741 descrip = ENCODE_MENU_STRING (descrip); |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1742 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1743 } |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
1744 #endif /* not HAVE_MULTILINGUAL_MENU */ |
24993 | 1745 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
1746 wv = xmalloc_widget_value (); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1747 if (prev_wv) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1748 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
|
1749 else |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1750 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
|
1751 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1752 wv->name = (char *) SDATA (item_name); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1753 if (!NILP (descrip)) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1754 wv->key = (char *) SDATA (descrip); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1755 wv->value = 0; |
11266
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
1756 /* 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
|
1757 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
|
1758 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
|
1759 wv->enabled = !NILP (enable); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1760 |
24993 | 1761 if (NILP (type)) |
1762 wv->button_type = BUTTON_TYPE_NONE; | |
1763 else if (EQ (type, QCradio)) | |
1764 wv->button_type = BUTTON_TYPE_RADIO; | |
1765 else if (EQ (type, QCtoggle)) | |
1766 wv->button_type = BUTTON_TYPE_TOGGLE; | |
1767 else | |
1768 abort (); | |
1769 | |
1770 wv->selected = !NILP (selected); | |
41769
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
1771 if (! STRINGP (help)) |
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
1772 help = Qnil; |
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
1773 |
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
1774 wv->help = help; |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
1775 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1776 prev_wv = wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1777 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1778 i += MENU_ITEMS_ITEM_LENGTH; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1779 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1780 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1781 |
12432
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1782 /* 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
|
1783 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
|
1784 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
|
1785 { |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1786 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
|
1787 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
|
1788 return wv; |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1789 } |
a46766b7288a
(single_submenu): Handle commands appearing directly in the menu bar.
Richard M. Stallman <rms@gnu.org>
parents:
12361
diff
changeset
|
1790 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1791 return first_wv; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1792 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1793 |
36933 | 1794 /* Recompute all the widgets of frame F, when the menu bar has been |
1795 changed. Value is non-zero if widgets were updated. */ | |
1796 | |
1797 static int | |
6481
55236c5bca7c
(update_frame_menubar): Function renamed from update_one_frame_psheets.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6439
diff
changeset
|
1798 update_frame_menubar (f) |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1799 FRAME_PTR f; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1800 { |
49322 | 1801 #ifdef USE_GTK |
1802 return xg_update_frame_menubar (f); | |
1803 #else | |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1804 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
|
1805 int columns, rows; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1806 |
36933 | 1807 if (!x->menubar_widget || XtIsManaged (x->menubar_widget)) |
1808 return 0; | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1809 |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1810 BLOCK_INPUT; |
36933 | 1811 /* Save the size of the frame because the pane widget doesn't accept |
1812 to resize itself. So force it. */ | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
1813 columns = FRAME_COLS (f); |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
1814 rows = FRAME_LINES (f); |
6200
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1815 |
36933 | 1816 /* Do the voodoo which means "I'm changing lots of things, don't try |
1817 to refigure sizes until I'm done." */ | |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1818 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
|
1819 |
36933 | 1820 /* The order in which children are managed is the top to bottom |
1821 order in which they are displayed in the paned window. First, | |
1822 remove the text-area widget. */ | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1823 XtUnmanageChild (x->edit_widget); |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1824 |
36933 | 1825 /* Remove the menubar that is there now, and put up the menubar that |
1826 should be there. */ | |
1827 XtManageChild (x->menubar_widget); | |
1828 XtMapWidget (x->menubar_widget); | |
1829 XtVaSetValues (x->menubar_widget, XtNmappedWhenManaged, 1, NULL); | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1830 |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
1831 /* 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
|
1832 XtManageChild (x->edit_widget); |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
1833 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
|
1834 |
01c57ae8ca57
(update_one_frame_psheets): Call EmacsFrameSetCharSize to
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6198
diff
changeset
|
1835 /* 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
|
1836 EmacsFrameSetCharSize (x->edit_widget, columns, rows); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1837 UNBLOCK_INPUT; |
49322 | 1838 #endif |
36933 | 1839 return 1; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1840 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1841 |
12018
f5d820ad7a13
(set_frame_menubar): Always call update_frame_menubar.
Karl Heuer <kwzh@gnu.org>
parents:
11954
diff
changeset
|
1842 /* 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
|
1843 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
|
1844 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
|
1845 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1846 void |
12661 | 1847 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
|
1848 FRAME_PTR f; |
6605
f5b781f33789
(set_frame_menubar): New arg, first_time.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6526
diff
changeset
|
1849 int first_time; |
12661 | 1850 int deep_p; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1851 { |
49322 | 1852 xt_or_gtk_widget menubar_widget = f->output_data.x->menubar_widget; |
1853 #ifdef USE_X_TOOLKIT | |
1854 LWLIB_ID id; | |
1855 #endif | |
25730
db88a4b84d91
(single_menu_item, Fx_popup_menu, Fx_popup_menu,
Gerd Moellmann <gerd@gnu.org>
parents:
25680
diff
changeset
|
1856 Lisp_Object items; |
9725
98d374d51f4d
(set_frame_menubar): Don't copy string during GC risk.
Karl Heuer <kwzh@gnu.org>
parents:
9649
diff
changeset
|
1857 widget_value *wv, *first_wv, *prev_wv = 0; |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1858 int i, last_i; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1859 int *submenu_start, *submenu_end; |
48946
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1860 int *submenu_top_level_items, *submenu_n_panes; |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
1861 |
11449
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
1862 |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
1863 XSETFRAME (Vmenu_updating_frame, f); |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
1864 |
49322 | 1865 #ifdef USE_X_TOOLKIT |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
1866 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
|
1867 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
|
1868 id = f->output_data.x->id; |
49322 | 1869 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1870 |
12661 | 1871 if (! menubar_widget) |
1872 deep_p = 1; | |
15792
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1873 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
|
1874 deep_p = 1; |
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1875 /* 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
|
1876 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
|
1877 { |
feeb1f7c1cec
(pending_menu_activation): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
15785
diff
changeset
|
1878 deep_p = 1; |
15807
508ec69917b1
(pending_menu_activation): Don't initialize. Not static.
Richard M. Stallman <rms@gnu.org>
parents:
15795
diff
changeset
|
1879 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
|
1880 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
|
1881 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1882 |
52981
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
1883 #ifdef USE_GTK |
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
1884 /* If we have detached menus, we must update deep so detached menus |
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
1885 also gets updated. */ |
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
1886 deep_p = deep_p || xg_have_tear_offs (); |
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
1887 #endif |
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
1888 |
12661 | 1889 if (deep_p) |
1890 { | |
1891 /* Make a widget-value tree representing the entire menu trees. */ | |
1892 | |
1893 struct buffer *prev = current_buffer; | |
1894 Lisp_Object buffer; | |
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
45803
diff
changeset
|
1895 int specpdl_count = SPECPDL_INDEX (); |
12661 | 1896 int previous_menu_items_used = f->menu_bar_items_used; |
1897 Lisp_Object *previous_items | |
1898 = (Lisp_Object *) alloca (previous_menu_items_used | |
1899 * 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
|
1900 |
17554
0a75fcee3cb8
(set_frame_menubar): When widget is new, forget records of old contents.
Richard M. Stallman <rms@gnu.org>
parents:
17364
diff
changeset
|
1901 /* 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
|
1902 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
|
1903 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
|
1904 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
|
1905 |
12661 | 1906 buffer = XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer; |
1907 specbind (Qinhibit_quit, Qt); | |
1908 /* Don't let the debugger step into this code | |
1909 because it is not reentrant. */ | |
1910 specbind (Qdebug_on_next_call, Qnil); | |
1911 | |
21178
85fd58cb0654
(set_frame_menubar): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
20630
diff
changeset
|
1912 record_unwind_protect (Fset_match_data, Fmatch_data (Qnil, Qnil)); |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
1913 record_unwind_protect (unuse_menu_items, Qnil); |
12661 | 1914 if (NILP (Voverriding_local_map_menu_flag)) |
1915 { | |
1916 specbind (Qoverriding_terminal_local_map, Qnil); | |
1917 specbind (Qoverriding_local_map, Qnil); | |
1918 } | |
1919 | |
1920 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
|
1921 |
12661 | 1922 /* Run the Lucid hook. */ |
36191
0cee3a77c592
(set_frame_menubar): Run acivate-menu-bar-hook with
Gerd Moellmann <gerd@gnu.org>
parents:
34038
diff
changeset
|
1923 safe_run_hooks (Qactivate_menubar_hook); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1924 |
12661 | 1925 /* If it has changed current-menubar from previous value, |
1926 really recompute the menubar from the value. */ | |
1927 if (! NILP (Vlucid_menu_bar_dirty_flag)) | |
1928 call0 (Qrecompute_lucid_menubar); | |
14298 | 1929 safe_run_hooks (Qmenu_bar_update_hook); |
12661 | 1930 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); |
1931 | |
1932 items = FRAME_MENU_BAR_ITEMS (f); | |
1933 | |
1934 /* Save the frame's previous menu bar contents data. */ | |
38594
53ed5f089c9e
(set_frame_menubar): Take into account that
Gerd Moellmann <gerd@gnu.org>
parents:
37940
diff
changeset
|
1935 if (previous_menu_items_used) |
53ed5f089c9e
(set_frame_menubar): Take into account that
Gerd Moellmann <gerd@gnu.org>
parents:
37940
diff
changeset
|
1936 bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items, |
53ed5f089c9e
(set_frame_menubar): Take into account that
Gerd Moellmann <gerd@gnu.org>
parents:
37940
diff
changeset
|
1937 previous_menu_items_used * sizeof (Lisp_Object)); |
12661 | 1938 |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1939 /* Fill in menu_items with the current menu bar contents. |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1940 This can evaluate Lisp code. */ |
12661 | 1941 menu_items = f->menu_bar_vector; |
38594
53ed5f089c9e
(set_frame_menubar): Take into account that
Gerd Moellmann <gerd@gnu.org>
parents:
37940
diff
changeset
|
1942 menu_items_allocated = VECTORP (menu_items) ? ASIZE (menu_items) : 0; |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1943 submenu_start = (int *) alloca (XVECTOR (items)->size * sizeof (int *)); |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1944 submenu_end = (int *) alloca (XVECTOR (items)->size * sizeof (int *)); |
48946
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1945 submenu_n_panes = (int *) alloca (XVECTOR (items)->size * sizeof (int)); |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1946 submenu_top_level_items |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1947 = (int *) alloca (XVECTOR (items)->size * sizeof (int *)); |
12661 | 1948 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
|
1949 for (i = 0; i < XVECTOR (items)->size; i += 4) |
12661 | 1950 { |
1951 Lisp_Object key, string, maps; | |
1952 | |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1953 last_i = i; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1954 |
12661 | 1955 key = XVECTOR (items)->contents[i]; |
1956 string = XVECTOR (items)->contents[i + 1]; | |
1957 maps = XVECTOR (items)->contents[i + 2]; | |
1958 if (NILP (string)) | |
1959 break; | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
1960 |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1961 submenu_start[i] = menu_items_used; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1962 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1963 menu_items_n_panes = 0; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1964 submenu_top_level_items[i] |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1965 = parse_single_submenu (key, string, maps); |
48946
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1966 submenu_n_panes[i] = menu_items_n_panes; |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1967 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1968 submenu_end[i] = menu_items_used; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1969 } |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1970 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1971 finish_menu_items (); |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1972 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1973 /* Convert menu_items into widget_value trees |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1974 to display the menu. This cannot evaluate Lisp code. */ |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1975 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1976 wv = xmalloc_widget_value (); |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1977 wv->name = "menubar"; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1978 wv->value = 0; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1979 wv->enabled = 1; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1980 wv->button_type = BUTTON_TYPE_NONE; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1981 wv->help = Qnil; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1982 first_wv = wv; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1983 |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1984 for (i = 0; i < last_i; i += 4) |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1985 { |
48946
2c4a754e02b6
(parse_single_submenu): Use individual keymap's prompt
Richard M. Stallman <rms@gnu.org>
parents:
48912
diff
changeset
|
1986 menu_items_n_panes = submenu_n_panes[i]; |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1987 wv = digest_single_submenu (submenu_start[i], submenu_end[i], |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
1988 submenu_top_level_items[i]); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
1989 if (prev_wv) |
12661 | 1990 prev_wv->next = wv; |
1991 else | |
1992 first_wv->contents = wv; | |
1993 /* Don't set wv->name here; GC during the loop might relocate it. */ | |
1994 wv->enabled = 1; | |
24993 | 1995 wv->button_type = BUTTON_TYPE_NONE; |
12661 | 1996 prev_wv = wv; |
1997 } | |
1998 | |
1999 set_buffer_internal_1 (prev); | |
2000 unbind_to (specpdl_count, Qnil); | |
2001 | |
2002 /* If there has been no change in the Lisp-level contents | |
2003 of the menu bar, skip redisplaying it. Just exit. */ | |
2004 | |
2005 for (i = 0; i < previous_menu_items_used; i++) | |
2006 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
|
2007 || (!EQ (previous_items[i], XVECTOR (menu_items)->contents[i]))) |
12661 | 2008 break; |
13654
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
2009 if (i == menu_items_used && i == previous_menu_items_used && i != 0) |
12661 | 2010 { |
2011 free_menubar_widget_value_tree (first_wv); | |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
2012 discard_menu_items (); |
12661 | 2013 |
2014 return; | |
2015 } | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2016 |
12661 | 2017 /* Now GC cannot happen during the lifetime of the widget_value, |
2018 so it's safe to store data from a Lisp_String. */ | |
2019 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
|
2020 for (i = 0; i < XVECTOR (items)->size; i += 4) |
12661 | 2021 { |
2022 Lisp_Object string; | |
2023 string = XVECTOR (items)->contents[i + 1]; | |
2024 if (NILP (string)) | |
2025 break; | |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2026 wv->name = (char *) SDATA (string); |
12661 | 2027 wv = wv->next; |
2028 } | |
2029 | |
2030 f->menu_bar_vector = menu_items; | |
2031 f->menu_bar_items_used = menu_items_used; | |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
2032 discard_menu_items (); |
12661 | 2033 } |
2034 else | |
2035 { | |
2036 /* Make a widget-value tree containing | |
2037 just the top level menu bar strings. */ | |
2038 | |
46753
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2039 wv = xmalloc_widget_value (); |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2040 wv->name = "menubar"; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2041 wv->value = 0; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2042 wv->enabled = 1; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2043 wv->button_type = BUTTON_TYPE_NONE; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2044 wv->help = Qnil; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2045 first_wv = wv; |
5e95e401d481
(set_frame_menubar): First parse all submenus,
Richard M. Stallman <rms@gnu.org>
parents:
46370
diff
changeset
|
2046 |
12661 | 2047 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
|
2048 for (i = 0; i < XVECTOR (items)->size; i += 4) |
12661 | 2049 { |
2050 Lisp_Object string; | |
2051 | |
2052 string = XVECTOR (items)->contents[i + 1]; | |
2053 if (NILP (string)) | |
2054 break; | |
2055 | |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2056 wv = xmalloc_widget_value (); |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2057 wv->name = (char *) SDATA (string); |
12661 | 2058 wv->value = 0; |
2059 wv->enabled = 1; | |
24993 | 2060 wv->button_type = BUTTON_TYPE_NONE; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2061 wv->help = Qnil; |
15785
9902d8a8a548
(set_frame_menubar): Use -1 for call_data
Richard M. Stallman <rms@gnu.org>
parents:
15710
diff
changeset
|
2062 /* 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
|
2063 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
|
2064 /* 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
|
2065 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
|
2066 wv->call_data = (void *) (EMACS_INT) (-1); |
12661 | 2067 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2068 if (prev_wv) |
12661 | 2069 prev_wv->next = wv; |
2070 else | |
2071 first_wv->contents = wv; | |
2072 prev_wv = wv; | |
2073 } | |
13654
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
2074 |
645e14e39a2b
(set_frame_menubar): When called with deep_p == 0,
Richard M. Stallman <rms@gnu.org>
parents:
13489
diff
changeset
|
2075 /* 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
|
2076 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
|
2077 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
|
2078 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
|
2079 } |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2080 |
12661 | 2081 /* 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
|
2082 |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
2083 BLOCK_INPUT; |
fca5a32f7806
(popup_get_selection): Queue up events that aren't
Richard M. Stallman <rms@gnu.org>
parents:
11266
diff
changeset
|
2084 |
49322 | 2085 #ifdef USE_GTK |
2086 xg_crazy_callback_abort = 1; | |
2087 if (menubar_widget) | |
2088 { | |
52981
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2089 /* The fourth arg is DEEP_P, which says to consider the entire |
49322 | 2090 menu trees we supply, rather than just the menu bar item names. */ |
2091 xg_modify_menubar_widgets (menubar_widget, | |
2092 f, | |
2093 first_wv, | |
2094 deep_p, | |
2095 G_CALLBACK (menubar_selection_callback), | |
2096 G_CALLBACK (popup_deactivate_callback), | |
2097 G_CALLBACK (menu_highlight_callback)); | |
2098 } | |
2099 else | |
2100 { | |
2101 GtkWidget *wvbox = f->output_data.x->vbox_widget; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2102 |
49322 | 2103 menubar_widget |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2104 = xg_create_widget ("menubar", "menubar", f, first_wv, |
49322 | 2105 G_CALLBACK (menubar_selection_callback), |
2106 G_CALLBACK (popup_deactivate_callback), | |
2107 G_CALLBACK (menu_highlight_callback)); | |
2108 | |
2109 f->output_data.x->menubar_widget = menubar_widget; | |
2110 } | |
2111 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2112 |
49322 | 2113 #else /* not USE_GTK */ |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2114 if (menubar_widget) |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2115 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2116 /* 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
|
2117 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
|
2118 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2119 /* 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
|
2120 menu trees we supply, rather than just the menu bar item names. */ |
12661 | 2121 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
|
2122 |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
2123 /* 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
|
2124 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
|
2125 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2126 else |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2127 { |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2128 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
|
2129 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
|
2130 0, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2131 popup_activate_callback, |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2132 menubar_selection_callback, |
27341
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
2133 popup_deactivate_callback, |
ab22130d8fe3
(enum menu_item_idx): New enumeration replacing defines
Gerd Moellmann <gerd@gnu.org>
parents:
26729
diff
changeset
|
2134 menu_highlight_callback); |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2135 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
|
2136 } |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2137 |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2138 { |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2139 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
|
2140 = (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
|
2141 ? (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
|
2142 + 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
|
2143 : 0); |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2144 |
15943
16fb6dcfa4e8
(set_frame_menubar): Don't add ibw to menubar_size.
Richard M. Stallman <rms@gnu.org>
parents:
15912
diff
changeset
|
2145 #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
|
2146 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
|
2147 #ifdef USE_LUCID |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2148 if (FRAME_EXTERNAL_MENU_BAR (f)) |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2149 { |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2150 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
|
2151 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
|
2152 XtNinternalBorderWidth, &ibw, NULL); |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2153 menubar_size += ibw; |
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2154 } |
13489
ddf90bfd3744
Don't include Xaw/Paned.h unless USE_LUCID is defined.
Richard M. Stallman <rms@gnu.org>
parents:
13071
diff
changeset
|
2155 #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
|
2156 #endif /* 0 */ |
11898
a23359be806b
(set_frame_menubar): Set menubar_height field.
Karl Heuer <kwzh@gnu.org>
parents:
11655
diff
changeset
|
2157 |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2158 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
|
2159 } |
49322 | 2160 #endif /* not USE_GTK */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2161 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2162 free_menubar_widget_value_tree (first_wv); |
36938
010e601743d5
(update_frame_menubar, set_frame_menubar, xmenu_show):
Gerd Moellmann <gerd@gnu.org>
parents:
36933
diff
changeset
|
2163 update_frame_menubar (f); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2164 |
49322 | 2165 #ifdef USE_GTK |
2166 xg_crazy_callback_abort = 0; | |
2167 #endif | |
2168 | |
12634
eec80ea06395
(set_frame_menubar): If the Lisp-level menu bar menus
Richard M. Stallman <rms@gnu.org>
parents:
12625
diff
changeset
|
2169 UNBLOCK_INPUT; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2170 } |
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
|
2171 |
14036 | 2172 /* 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
|
2173 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
|
2174 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
|
2175 is visible. */ |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2176 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2177 void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2178 initialize_frame_menubar (f) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2179 FRAME_PTR f; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2180 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2181 /* 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
|
2182 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
|
2183 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); |
12661 | 2184 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
|
2185 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2186 |
37022
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2187 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2188 /* Get rid of the menu bar of frame F, and free its storage. |
49322 | 2189 This is used when deleting a frame, and when turning off the menu bar. |
2190 For GTK this function is in gtkutil.c. */ | |
2191 | |
2192 #ifndef USE_GTK | |
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
|
2193 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
|
2194 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
|
2195 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
|
2196 { |
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
|
2197 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
|
2198 |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2199 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
|
2200 |
c73494a6bcd3
(free_frame_menubar): Clear menubar_height field.
Richard M. Stallman <rms@gnu.org>
parents:
17709
diff
changeset
|
2201 f->output_data.x->menubar_height = 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2202 |
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
|
2203 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
|
2204 { |
37022
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2205 #ifdef USE_MOTIF |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2206 /* Removing the menu bar magically changes the shell widget's x |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2207 and y position of (0, 0) which, when the menu bar is turned |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2208 on again, leads to pull-down menuss appearing in strange |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2209 positions near the upper-left corner of the display. This |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2210 happens only with some window managers like twm and ctwm, |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2211 but not with other like Motif's mwm or kwm, because the |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2212 latter generate ConfigureNotify events when the menu bar |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2213 is switched off, which fixes the shell position. */ |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2214 Position x0, y0, x1, y1; |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2215 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2216 |
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
|
2217 BLOCK_INPUT; |
37022
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2218 |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2219 #ifdef USE_MOTIF |
37211
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2220 if (f->output_data.x->widget) |
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2221 XtVaGetValues (f->output_data.x->widget, XtNx, &x0, XtNy, &y0, NULL); |
37022
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2222 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2223 |
12667
a3466dad7d6d
Renamings: frame->display => frame->output, struct x_display -> sruct x_output.
Richard M. Stallman <rms@gnu.org>
parents:
12661
diff
changeset
|
2224 lw_destroy_all_widgets ((LWLIB_ID) f->output_data.x->id); |
36457
b0905c60d1ab
(free_frame_menubar): Set the frame's menubar_widget to
Gerd Moellmann <gerd@gnu.org>
parents:
36191
diff
changeset
|
2225 f->output_data.x->menubar_widget = NULL; |
37022
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2226 |
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2227 #ifdef USE_MOTIF |
37211
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2228 if (f->output_data.x->widget) |
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2229 { |
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2230 XtVaGetValues (f->output_data.x->widget, XtNx, &x1, XtNy, &y1, NULL); |
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2231 if (x1 == 0 && y1 == 0) |
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2232 XtVaSetValues (f->output_data.x->widget, XtNx, x0, XtNy, y0, NULL); |
afa458ac7a62
(free_frame_menubar) [USE_MOTIF]: Preserve the
Gerd Moellmann <gerd@gnu.org>
parents:
37022
diff
changeset
|
2233 } |
37022
d7d30cecd891
(free_frame_menubar) [USE_MOTIF]: If the shell widget's
Gerd Moellmann <gerd@gnu.org>
parents:
36958
diff
changeset
|
2234 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2235 |
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
|
2236 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
|
2237 } |
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
|
2238 } |
49322 | 2239 #endif /* not USE_GTK */ |
2240 | |
2241 #endif /* USE_X_TOOLKIT || USE_GTK */ | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2242 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2243 /* 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
|
2244 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
|
2245 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
|
2246 Both assume input is blocked by the caller. */ |
118 | 2247 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2248 /* 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
|
2249 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
|
2250 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
|
2251 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
|
2252 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
|
2253 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
|
2254 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
|
2255 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
|
2256 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
|
2257 (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
|
2258 |
49322 | 2259 #if defined (USE_X_TOOLKIT) || defined (USE_GTK) |
2260 | |
2261 /* The item selected in the popup menu. */ | |
2262 static Lisp_Object *volatile menu_item_selection; | |
2263 | |
2264 #ifdef USE_GTK | |
2265 | |
2266 /* Used when position a popup menu. See menu_position_func and | |
2267 create_and_show_popup_menu below. */ | |
2268 struct next_popup_x_y | |
2269 { | |
49651
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2270 FRAME_PTR f; |
49322 | 2271 int x; |
2272 int y; | |
2273 }; | |
2274 | |
2275 /* The menu position function to use if we are not putting a popup | |
2276 menu where the pointer is. | |
2277 MENU is the menu to pop up. | |
2278 X and Y shall on exit contain x/y where the menu shall pop up. | |
2279 PUSH_IN is not documented in the GTK manual. | |
2280 USER_DATA is any data passed in when calling gtk_menu_popup. | |
2281 Here it points to a struct next_popup_x_y where the coordinates | |
49651
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2282 to store in *X and *Y are as well as the frame for the popup. |
49322 | 2283 |
2284 Here only X and Y are used. */ | |
2285 static void | |
2286 menu_position_func (menu, x, y, push_in, user_data) | |
2287 GtkMenu *menu; | |
2288 gint *x; | |
2289 gint *y; | |
2290 gboolean *push_in; | |
2291 gpointer user_data; | |
2292 { | |
49651
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2293 struct next_popup_x_y* data = (struct next_popup_x_y*)user_data; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2294 GtkRequisition req; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2295 int disp_width = FRAME_X_DISPLAY_INFO (data->f)->width; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2296 int disp_height = FRAME_X_DISPLAY_INFO (data->f)->height; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2297 |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2298 *x = data->x; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2299 *y = data->y; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2300 |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2301 /* Check if there is room for the menu. If not, adjust x/y so that |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2302 the menu is fully visible. */ |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2303 gtk_widget_size_request (GTK_WIDGET (menu), &req); |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2304 if (data->x + req.width > disp_width) |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2305 *x -= data->x + req.width - disp_width; |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2306 if (data->y + req.height > disp_height) |
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2307 *y -= data->y + req.height - disp_height; |
49322 | 2308 } |
2309 | |
2310 static void | |
2311 popup_selection_callback (widget, client_data) | |
2312 GtkWidget *widget; | |
2313 gpointer client_data; | |
2314 { | |
2315 xg_menu_item_cb_data *cb_data = (xg_menu_item_cb_data*) client_data; | |
2316 | |
2317 if (xg_crazy_callback_abort) return; | |
2318 if (cb_data) menu_item_selection = (Lisp_Object *) cb_data->call_data; | |
2319 } | |
2320 | |
2321 /* Pop up the menu for frame F defined by FIRST_WV at X/Y and loop until the | |
2322 menu pops down. | |
2323 menu_item_selection will be set to the selection. */ | |
2324 static void | |
2325 create_and_show_popup_menu (f, first_wv, x, y, for_click) | |
2326 FRAME_PTR f; | |
2327 widget_value *first_wv; | |
2328 int x; | |
2329 int y; | |
2330 int for_click; | |
2331 { | |
2332 int i; | |
2333 GtkWidget *menu; | |
2334 GtkMenuPositionFunc pos_func = 0; /* Pop up at pointer. */ | |
2335 struct next_popup_x_y popup_x_y; | |
2336 | |
2337 xg_crazy_callback_abort = 1; | |
2338 menu = xg_create_widget ("popup", first_wv->name, f, first_wv, | |
2339 G_CALLBACK (popup_selection_callback), | |
2340 G_CALLBACK (popup_deactivate_callback), | |
2341 G_CALLBACK (menu_highlight_callback)); | |
2342 xg_crazy_callback_abort = 0; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2343 |
49322 | 2344 for (i = 0; i < 5; i++) |
2345 if (FRAME_X_DISPLAY_INFO (f)->grabbed & (1 << i)) | |
2346 break; | |
2347 | |
2348 if (! for_click) | |
2349 { | |
2350 /* Not invoked by a click. pop up at x/y. */ | |
2351 pos_func = menu_position_func; | |
2352 | |
2353 /* Adjust coordinates to be root-window-relative. */ | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
2354 x += f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
2355 y += f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
49322 | 2356 |
2357 popup_x_y.x = x; | |
2358 popup_x_y.y = y; | |
49651
05ebf4266798
xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
Jan Djärv <jan.h.d@swipnet.se>
parents:
49600
diff
changeset
|
2359 popup_x_y.f = f; |
49322 | 2360 } |
2361 | |
2362 /* Display the menu. */ | |
2363 gtk_widget_show_all (menu); | |
2364 gtk_menu_popup (GTK_MENU (menu), 0, 0, pos_func, &popup_x_y, i, 0); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2365 |
49322 | 2366 /* Set this to one. popup_widget_loop increases it by one, so it becomes |
2367 two. show_help_echo uses this to detect popup menus. */ | |
2368 popup_activated_flag = 1; | |
2369 /* Process events that apply to the menu. */ | |
2370 popup_widget_loop (); | |
2371 | |
52981
54482f5ea7be
Remove tear off capability for GTK popup menus.
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2372 gtk_widget_destroy (menu); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2373 |
49322 | 2374 /* Must reset this manually because the button release event is not passed |
2375 to Emacs event loop. */ | |
2376 FRAME_X_DISPLAY_INFO (f)->grabbed = 0; | |
2377 } | |
2378 | |
2379 #else /* not USE_GTK */ | |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2380 |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
2381 /* 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
|
2382 library. |
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
2383 |
da016ba65a6c
(xmenu_show, xdialog_show): Increment widget_id_tick
Karl Heuer <kwzh@gnu.org>
parents:
11907
diff
changeset
|
2384 For the main windows, and popup menus, we use this counter, |
12661 | 2385 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
|
2386 |
12661 | 2387 For menu bars, we use numbers starting at 0, counted in |
2388 next_menubar_widget_id. */ | |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
2389 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
|
2390 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2391 static void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2392 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
|
2393 Widget widget; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2394 LWLIB_ID id; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2395 XtPointer client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2396 { |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2397 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
|
2398 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2399 |
49322 | 2400 /* Pop up the menu for frame F defined by FIRST_WV at X/Y and loop until the |
2401 menu pops down. | |
2402 menu_item_selection will be set to the selection. */ | |
2403 static void | |
2404 create_and_show_popup_menu (f, first_wv, x, y, for_click) | |
2405 FRAME_PTR f; | |
2406 widget_value *first_wv; | |
2407 int x; | |
2408 int y; | |
2409 int for_click; | |
2410 { | |
2411 int i; | |
2412 Arg av[2]; | |
2413 int ac = 0; | |
2414 XButtonPressedEvent dummy; | |
2415 LWLIB_ID menu_id; | |
2416 Widget menu; | |
2417 | |
2418 menu_id = widget_id_tick++; | |
2419 menu = lw_create_widget ("popup", first_wv->name, menu_id, first_wv, | |
2420 f->output_data.x->widget, 1, 0, | |
2421 popup_selection_callback, | |
2422 popup_deactivate_callback, | |
2423 menu_highlight_callback); | |
2424 | |
2425 dummy.type = ButtonPress; | |
2426 dummy.serial = 0; | |
2427 dummy.send_event = 0; | |
2428 dummy.display = FRAME_X_DISPLAY (f); | |
2429 dummy.time = CurrentTime; | |
2430 dummy.root = FRAME_X_DISPLAY_INFO (f)->root_window; | |
2431 dummy.window = dummy.root; | |
2432 dummy.subwindow = dummy.root; | |
2433 dummy.x = x; | |
2434 dummy.y = y; | |
2435 | |
2436 /* Adjust coordinates to be root-window-relative. */ | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
2437 x += f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
2438 y += f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
49322 | 2439 |
2440 dummy.x_root = x; | |
2441 dummy.y_root = y; | |
2442 | |
2443 dummy.state = 0; | |
2444 dummy.button = 0; | |
2445 for (i = 0; i < 5; i++) | |
2446 if (FRAME_X_DISPLAY_INFO (f)->grabbed & (1 << i)) | |
2447 dummy.button = i; | |
2448 | |
2449 /* Don't allow any geometry request from the user. */ | |
2450 XtSetArg (av[ac], XtNgeometry, 0); ac++; | |
2451 XtSetValues (menu, av, ac); | |
2452 | |
2453 /* Display the menu. */ | |
2454 lw_popup_menu (menu, (XEvent *) &dummy); | |
2455 popup_activated_flag = 1; | |
2456 | |
2457 /* Process events that apply to the menu. */ | |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
2458 popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 0, 0); |
49322 | 2459 |
2460 /* fp turned off the following statement and wrote a comment | |
2461 that it is unnecessary--that the menu has already disappeared. | |
2462 Nowadays the menu disappears ok, all right, but | |
2463 we need to delete the widgets or multiple ones will pile up. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2464 lw_destroy_all_widgets (menu_id); |
49322 | 2465 } |
2466 | |
2467 #endif /* not USE_GTK */ | |
2468 | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2469 static Lisp_Object |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
2470 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
|
2471 FRAME_PTR f; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2472 int x; |
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2473 int y; |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
2474 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
|
2475 int keymaps; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2476 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
|
2477 char **error; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2478 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2479 int i; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2480 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
|
2481 widget_value **submenu_stack |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2482 = (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
|
2483 Lisp_Object *subprefix_stack |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2484 = (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
|
2485 int submenu_depth = 0; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
2486 |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2487 int first_pane; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2488 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2489 *error = NULL; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2490 |
7335
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2491 if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2492 { |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2493 *error = "Empty menu"; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2494 return Qnil; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
2495 } |
5896
b20145eafe0c
(xmenu_show) [USE_X_TOOLKIT]: return Qnil when val is null.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5881
diff
changeset
|
2496 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2497 /* 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
|
2498 representing the panes and their items. */ |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2499 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
|
2500 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
|
2501 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
|
2502 wv->enabled = 1; |
24993 | 2503 wv->button_type = BUTTON_TYPE_NONE; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2504 wv->help =Qnil; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2505 first_wv = wv; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2506 first_pane = 1; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2507 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2508 /* 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
|
2509 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2510 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
|
2511 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2512 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
|
2513 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2514 submenu_stack[submenu_depth++] = save_wv; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2515 save_wv = prev_wv; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2516 prev_wv = 0; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2517 first_pane = 1; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2518 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2519 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2520 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
|
2521 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2522 prev_wv = save_wv; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2523 save_wv = submenu_stack[--submenu_depth]; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2524 first_pane = 0; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2525 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2526 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2527 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
|
2528 && submenu_depth != 0) |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2529 i += MENU_ITEMS_PANE_LENGTH; |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2530 /* Ignore a nil in the item list. |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2531 It's meaningful only for dialog boxes. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2532 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
|
2533 i += 1; |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2534 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
|
2535 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2536 /* 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
|
2537 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
|
2538 char *pane_string; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2539 |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2540 pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2541 prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2542 |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2543 #ifndef HAVE_MULTILINGUAL_MENU |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2544 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2545 { |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
2546 pane_name = ENCODE_SYSTEM (pane_name); |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2547 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2548 } |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2549 #endif |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2550 pane_string = (NILP (pane_name) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2551 ? "" : (char *) SDATA (pane_name)); |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2552 /* 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
|
2553 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
|
2554 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
|
2555 pane_string = ""; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2556 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2557 /* 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
|
2558 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
|
2559 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
|
2560 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
|
2561 { |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2562 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
|
2563 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
|
2564 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
|
2565 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2566 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
|
2567 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
|
2568 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
|
2569 wv->name++; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2570 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
|
2571 wv->enabled = 1; |
24993 | 2572 wv->button_type = BUTTON_TYPE_NONE; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2573 wv->help = Qnil; |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2574 save_wv = wv; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2575 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
|
2576 } |
7521
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2577 else if (first_pane) |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2578 { |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2579 save_wv = wv; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2580 prev_wv = 0; |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2581 } |
2971264ff9aa
(xmenu_show): Completely ignore nameless panes
Richard M. Stallman <rms@gnu.org>
parents:
7459
diff
changeset
|
2582 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
|
2583 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
|
2584 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2585 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2586 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2587 /* Create a new item within current pane. */ |
30472
0c982ed8515f
(menu_highlight_callback): Call show_help_echo directly
Gerd Moellmann <gerd@gnu.org>
parents:
30420
diff
changeset
|
2588 Lisp_Object item_name, enable, descrip, def, type, selected, help; |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2589 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2590 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2591 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2592 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2593 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2594 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2595 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); |
24993 | 2596 |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2597 #ifndef HAVE_MULTILINGUAL_MENU |
24993 | 2598 if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2599 { |
51404 | 2600 item_name = ENCODE_MENU_STRING (item_name); |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2601 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2602 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2603 |
24993 | 2604 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2605 { |
51404 | 2606 descrip = ENCODE_MENU_STRING (descrip); |
37940
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2607 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2608 } |
e76f885709fc
(single_submenu, xmenu_show) [!HAVE_MULTILINGUAL_MENU]:
Gerd Moellmann <gerd@gnu.org>
parents:
37929
diff
changeset
|
2609 #endif /* not HAVE_MULTILINGUAL_MENU */ |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2610 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2611 wv = xmalloc_widget_value (); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2612 if (prev_wv) |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2613 prev_wv->next = wv; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2614 else |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2615 save_wv->contents = wv; |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2616 wv->name = (char *) SDATA (item_name); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2617 if (!NILP (descrip)) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2618 wv->key = (char *) SDATA (descrip); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2619 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
|
2620 /* 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
|
2621 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
|
2622 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
|
2623 wv->call_data |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
2624 = (!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
|
2625 wv->enabled = !NILP (enable); |
24993 | 2626 |
2627 if (NILP (type)) | |
2628 wv->button_type = BUTTON_TYPE_NONE; | |
2629 else if (EQ (type, QCtoggle)) | |
2630 wv->button_type = BUTTON_TYPE_TOGGLE; | |
2631 else if (EQ (type, QCradio)) | |
2632 wv->button_type = BUTTON_TYPE_RADIO; | |
2633 else | |
2634 abort (); | |
2635 | |
2636 wv->selected = !NILP (selected); | |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
2637 |
41769
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
2638 if (! STRINGP (help)) |
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
2639 help = Qnil; |
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
2640 |
26c1876db9e3
(menu_highlight_callback): Use `help' field as Lisp_Object.
Richard M. Stallman <rms@gnu.org>
parents:
40993
diff
changeset
|
2641 wv->help = help; |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
2642 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2643 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
|
2644 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2645 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
|
2646 } |
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 |
9236
583bb9211b2b
(popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT since the
Paul Reilly <pmr@pajato.com>
parents:
9233
diff
changeset
|
2649 /* 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
|
2650 if (!NILP (title)) |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2651 { |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2652 widget_value *wv_title = xmalloc_widget_value (); |
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2653 widget_value *wv_sep1 = xmalloc_widget_value (); |
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2654 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
|
2655 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2656 wv_sep2->name = "--"; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2657 wv_sep2->next = first_wv->contents; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2658 wv_sep2->help = Qnil; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2659 |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2660 wv_sep1->name = "--"; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2661 wv_sep1->next = wv_sep2; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2662 wv_sep1->help = Qnil; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2663 |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2664 #ifndef HAVE_MULTILINGUAL_MENU |
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2665 if (STRING_MULTIBYTE (title)) |
51404 | 2666 title = ENCODE_MENU_STRING (title); |
23302
dcff2a4b6cb4
(single_submenu) [! HAVE_MULTILINGUAL_MENU]: Make
Kenichi Handa <handa@m17n.org>
parents:
21514
diff
changeset
|
2667 #endif |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2668 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2669 wv_title->name = (char *) SDATA (title); |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
2670 wv_title->enabled = TRUE; |
24993 | 2671 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
|
2672 wv_title->next = wv_sep1; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2673 wv_title->help = Qnil; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2674 first_wv->contents = wv_title; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2675 } |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2676 |
49322 | 2677 /* No selection has been chosen yet. */ |
2678 menu_item_selection = 0; | |
2679 | |
2680 /* Actually create and show the menu until popped down. */ | |
2681 create_and_show_popup_menu (f, first_wv, x, y, for_click); | |
8414
8a8d2cdd4218
(xmenu_show): Ignore any geometry resource from the user.
Richard M. Stallman <rms@gnu.org>
parents:
8269
diff
changeset
|
2682 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2683 /* 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
|
2684 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
|
2685 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2686 /* 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
|
2687 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
|
2688 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
|
2689 { |
11655
a9f93ce6e1b4
(xmenu_show, menubar_selection_callback): Move declaration
Karl Heuer <kwzh@gnu.org>
parents:
11614
diff
changeset
|
2690 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
|
2691 |
31829
43566b0aec59
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
31465
diff
changeset
|
2692 prefix = entry = Qnil; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2693 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2694 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
|
2695 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2696 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
|
2697 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2698 subprefix_stack[submenu_depth++] = prefix; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2699 prefix = entry; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2700 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2701 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2702 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
|
2703 { |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2704 prefix = subprefix_stack[--submenu_depth]; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2705 i++; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2706 } |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2707 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
|
2708 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2709 prefix |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2710 = 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
|
2711 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
|
2712 } |
13071
2e514396cbc8
(popup_get_selection): Pop menu down if button is pressed
Richard M. Stallman <rms@gnu.org>
parents:
12747
diff
changeset
|
2713 /* 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
|
2714 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
|
2715 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
|
2716 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
|
2717 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2718 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2719 entry |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2720 = 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
|
2721 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
|
2722 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2723 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
|
2724 { |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2725 int j; |
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2726 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2727 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
|
2728 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
|
2729 entry = Fcons (prefix, entry); |
6291
38ec8e76594f
(Fx_popup_menu): If POSITION is nil,
Richard M. Stallman <rms@gnu.org>
parents:
6200
diff
changeset
|
2730 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
|
2731 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
|
2732 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
|
2733 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2734 return entry; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2735 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2736 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
|
2737 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2738 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2739 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2740 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
2741 return Qnil; |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2742 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2743 |
49322 | 2744 #ifdef USE_GTK |
2745 static void | |
2746 dialog_selection_callback (widget, client_data) | |
2747 GtkWidget *widget; | |
2748 gpointer client_data; | |
2749 { | |
2750 /* The EMACS_INT cast avoids a warning. There's no problem | |
2751 as long as pointers have enough bits to hold small integers. */ | |
2752 if ((int) (EMACS_INT) client_data != -1) | |
2753 menu_item_selection = (Lisp_Object *) client_data; | |
2754 | |
2755 popup_activated_flag = 0; | |
2756 } | |
2757 | |
2758 /* Pop up the dialog for frame F defined by FIRST_WV and loop until the | |
2759 dialog pops down. | |
2760 menu_item_selection will be set to the selection. */ | |
2761 static void | |
2762 create_and_show_dialog (f, first_wv) | |
2763 FRAME_PTR f; | |
2764 widget_value *first_wv; | |
2765 { | |
2766 GtkWidget *menu; | |
2767 | |
2768 menu = xg_create_widget ("dialog", first_wv->name, f, first_wv, | |
2769 G_CALLBACK (dialog_selection_callback), | |
2770 G_CALLBACK (popup_deactivate_callback), | |
2771 0); | |
2772 | |
2773 if (menu) | |
2774 { | |
2775 /* Display the menu. */ | |
2776 gtk_widget_show_all (menu); | |
2777 | |
2778 /* Process events that apply to the menu. */ | |
2779 popup_widget_loop (); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2780 |
49322 | 2781 gtk_widget_destroy (menu); |
2782 } | |
2783 } | |
2784 | |
2785 #else /* not USE_GTK */ | |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2786 static void |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2787 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
|
2788 Widget widget; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2789 LWLIB_ID id; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2790 XtPointer client_data; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2791 { |
11266
3e93d8b99b05
(menubar_selection_callback, dialog_selection_callback)
Richard M. Stallman <rms@gnu.org>
parents:
11237
diff
changeset
|
2792 /* 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
|
2793 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
|
2794 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
|
2795 menu_item_selection = (Lisp_Object *) client_data; |
49322 | 2796 |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2797 BLOCK_INPUT; |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2798 lw_destroy_all_widgets (id); |
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2799 UNBLOCK_INPUT; |
11614
fdd0d5bdd8c6
(popup_get_selection): Use x_non_menubar_window_to_frame.
Karl Heuer <kwzh@gnu.org>
parents:
11528
diff
changeset
|
2800 popup_activated_flag = 0; |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
2801 } |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
2802 |
49322 | 2803 |
48912
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2804 /* ARG is the LWLIB ID of the dialog box, represented |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2805 as a Lisp object as (HIGHPART . LOWPART). */ |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2806 |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2807 Lisp_Object |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2808 xdialog_show_unwind (arg) |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2809 Lisp_Object arg; |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2810 { |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2811 LWLIB_ID id = (XINT (XCAR (arg)) << 4 * sizeof (LWLIB_ID) |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2812 | XINT (XCDR (arg))); |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2813 BLOCK_INPUT; |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2814 lw_destroy_all_widgets (id); |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2815 UNBLOCK_INPUT; |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2816 popup_activated_flag = 0; |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2817 return Qnil; |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2818 } |
b0b74923fe41
(popup_get_selection): Now static. New arg DO_TIMERS.
Richard M. Stallman <rms@gnu.org>
parents:
48329
diff
changeset
|
2819 |
49322 | 2820 |
2821 /* Pop up the dialog for frame F defined by FIRST_WV and loop until the | |
2822 dialog pops down. | |
2823 menu_item_selection will be set to the selection. */ | |
2824 static void | |
2825 create_and_show_dialog (f, first_wv) | |
2826 FRAME_PTR f; | |
2827 widget_value *first_wv; | |
2828 { | |
2829 LWLIB_ID dialog_id; | |
2830 | |
2831 dialog_id = widget_id_tick++; | |
2832 lw_create_widget (first_wv->name, "dialog", dialog_id, first_wv, | |
2833 f->output_data.x->widget, 1, 0, | |
2834 dialog_selection_callback, 0, 0); | |
2835 lw_modify_all_widgets (dialog_id, first_wv->contents, True); | |
2836 | |
2837 /* Display the dialog box. */ | |
2838 lw_pop_up_all_widgets (dialog_id); | |
2839 popup_activated_flag = 1; | |
2840 | |
2841 /* Process events that apply to the dialog box. | |
2842 Also handle timers. */ | |
2843 { | |
2844 int count = SPECPDL_INDEX (); | |
2845 int fact = 4 * sizeof (LWLIB_ID); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2846 |
49322 | 2847 /* xdialog_show_unwind is responsible for popping the dialog box down. */ |
2848 record_unwind_protect (xdialog_show_unwind, | |
2849 Fcons (make_number (dialog_id >> (fact)), | |
2850 make_number (dialog_id & ~(-1 << (fact))))); | |
2851 | |
53565
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
2852 popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), |
5a46a8191136
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
Jan Djärv <jan.h.d@swipnet.se>
parents:
53545
diff
changeset
|
2853 dialog_id, 1, 1); |
49322 | 2854 |
2855 unbind_to (count, Qnil); | |
2856 } | |
2857 } | |
2858 | |
2859 #endif /* not USE_GTK */ | |
2860 | |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2861 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
|
2862 "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
|
2863 "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
|
2864 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2865 static Lisp_Object |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
2866 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
|
2867 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
|
2868 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
|
2869 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
|
2870 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
|
2871 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2872 int i, nb_buttons=0; |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2873 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
|
2874 |
25730
db88a4b84d91
(single_menu_item, Fx_popup_menu, Fx_popup_menu,
Gerd Moellmann <gerd@gnu.org>
parents:
25680
diff
changeset
|
2875 widget_value *wv, *first_wv = 0, *prev_wv = 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
|
2876 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2877 /* Number of elements seen so far, before boundary. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2878 int left_count = 0; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2879 /* 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
|
2880 int boundary_seen = 0; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2881 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2882 *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
|
2883 |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2884 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
|
2885 { |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2886 *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
|
2887 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
|
2888 } |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2889 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2890 /* 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
|
2891 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
|
2892 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2893 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
|
2894 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
|
2895 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
|
2896 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
|
2897 pane_string = (NILP (pane_name) |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2898 ? "" : (char *) SDATA (pane_name)); |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2899 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
|
2900 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
|
2901 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
|
2902 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
|
2903 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
|
2904 prev_wv->name = "message"; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2905 prev_wv->help = 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
|
2906 first_wv = prev_wv; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2907 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2908 /* 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
|
2909 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
|
2910 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
|
2911 { |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2912 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2913 /* 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
|
2914 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
|
2915 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
|
2916 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
|
2917 descrip |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2918 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2919 |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2920 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
|
2921 { |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2922 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
|
2923 *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
|
2924 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
|
2925 } |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2926 if (EQ (item_name, Qquote)) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2927 { |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2928 /* This is the boundary between left-side elts |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2929 and right-side elts. Stop incrementing right_count. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2930 boundary_seen = 1; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2931 i++; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2932 continue; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2933 } |
15912
afb0bb1cdbe6
(xdialog_show): Don't allow 9 buttons.
Richard M. Stallman <rms@gnu.org>
parents:
15839
diff
changeset
|
2934 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
|
2935 { |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2936 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
|
2937 *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
|
2938 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
|
2939 } |
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2940 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2941 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
|
2942 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
|
2943 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
|
2944 if (!NILP (descrip)) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2945 wv->key = (char *) SDATA (descrip); |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2946 wv->value = (char *) SDATA (item_name); |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2947 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
|
2948 wv->enabled = !NILP (enable); |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2949 wv->help = 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
|
2950 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
|
2951 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2952 if (! boundary_seen) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2953 left_count++; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2954 |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2955 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
|
2956 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
|
2957 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2958 |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2959 /* If the boundary was not specified, |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2960 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
|
2961 if (! boundary_seen) |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2962 left_count = nb_buttons - nb_buttons / 2; |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2963 |
14546
bc0388a7c282
(xmalloc_widget_value): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14298
diff
changeset
|
2964 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
|
2965 wv->name = dialog_name; |
42588
43a330df6213
(set_frame_menubar, xmenu_show):
Jason Rumney <jasonr@gnu.org>
parents:
42586
diff
changeset
|
2966 wv->help = Qnil; |
6426
1f1388aa2d44
(Fx_popup_dialog): Don't fail to set X, Y from POSITION.
Richard M. Stallman <rms@gnu.org>
parents:
6424
diff
changeset
|
2967 /* 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
|
2968 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
|
2969 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
|
2970 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
|
2971 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
|
2972 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
|
2973 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
|
2974 dialog_name[3] = 'R'; |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2975 /* Number of buttons to put on the right. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
2976 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
|
2977 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
|
2978 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
|
2979 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
|
2980 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2981 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2982 /* 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
|
2983 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
|
2984 |
49322 | 2985 /* Actually create and show the dialog. */ |
2986 create_and_show_dialog (f, first_wv); | |
2987 | |
2988 /* Free the widget_value objects we used to specify the contents. */ | |
2989 free_menubar_widget_value_tree (first_wv); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
2990 |
49322 | 2991 /* Find the selected item, and its pane, to return |
2992 the proper 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
|
2993 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
|
2994 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2995 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
|
2996 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
2997 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
|
2998 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
|
2999 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
|
3000 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3001 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
|
3002 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3003 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
|
3004 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3005 prefix |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3006 = 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
|
3007 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
|
3008 } |
31465
b58d8e366faa
(xdialog_show): When looking up the selection in
Gerd Moellmann <gerd@gnu.org>
parents:
31365
diff
changeset
|
3009 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
b58d8e366faa
(xdialog_show): When looking up the selection in
Gerd Moellmann <gerd@gnu.org>
parents:
31365
diff
changeset
|
3010 { |
b58d8e366faa
(xdialog_show): When looking up the selection in
Gerd Moellmann <gerd@gnu.org>
parents:
31365
diff
changeset
|
3011 /* This is the boundary between left-side elts and |
b58d8e366faa
(xdialog_show): When looking up the selection in
Gerd Moellmann <gerd@gnu.org>
parents:
31365
diff
changeset
|
3012 right-side elts. */ |
b58d8e366faa
(xdialog_show): When looking up the selection in
Gerd Moellmann <gerd@gnu.org>
parents:
31365
diff
changeset
|
3013 ++i; |
b58d8e366faa
(xdialog_show): When looking up the selection in
Gerd Moellmann <gerd@gnu.org>
parents:
31365
diff
changeset
|
3014 } |
6307
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3015 else |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3016 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3017 entry |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3018 = 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
|
3019 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
|
3020 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3021 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
|
3022 { |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3023 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
|
3024 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
|
3025 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
|
3026 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3027 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
|
3028 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3029 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
|
3030 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3031 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3032 } |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3033 |
1f9fa4022502
(xdialog_show): New function to handle the display of dialog boxes.
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
6291
diff
changeset
|
3034 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
|
3035 } |
30299
f2cd2bf063c9
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30215
diff
changeset
|
3036 |
49322 | 3037 #else /* not USE_X_TOOLKIT && not USE_GTK */ |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3038 |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3039 /* The frame of the last activated non-toolkit menu bar. |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3040 Used to generate menu help events. */ |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3041 |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3042 static struct frame *menu_help_frame; |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3043 |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3044 |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3045 /* Show help HELP_STRING, or clear help if HELP_STRING is null. |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3046 |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3047 PANE is the pane number, and ITEM is the menu item number in |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3048 the menu (currently not used). |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3049 |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3050 This cannot be done with generating a HELP_EVENT because |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3051 XMenuActivate contains a loop that doesn't let Emacs process |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3052 keyboard events. */ |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3053 |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3054 static void |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3055 menu_help_callback (help_string, pane, item) |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3056 char *help_string; |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3057 int pane, item; |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3058 { |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3059 extern Lisp_Object Qmenu_item; |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3060 Lisp_Object *first_item; |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3061 Lisp_Object pane_name; |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3062 Lisp_Object menu_object; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3063 |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3064 first_item = XVECTOR (menu_items)->contents; |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3065 if (EQ (first_item[0], Qt)) |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3066 pane_name = first_item[MENU_ITEMS_PANE_NAME]; |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3067 else if (EQ (first_item[0], Qquote)) |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3068 /* This shouldn't happen, see xmenu_show. */ |
40477
a56267e601e4
Include coding.h and charset.h.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40239
diff
changeset
|
3069 pane_name = empty_string; |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3070 else |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3071 pane_name = first_item[MENU_ITEMS_ITEM_NAME]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3072 |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3073 /* (menu-item MENU-NAME PANE-NUMBER) */ |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3074 menu_object = Fcons (Qmenu_item, |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3075 Fcons (pane_name, |
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3076 Fcons (make_number (pane), Qnil))); |
30299
f2cd2bf063c9
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30215
diff
changeset
|
3077 show_help_echo (help_string ? build_string (help_string) : Qnil, |
30363
8f11e306dc02
(menu_help_callback): Call show_help_echo with
Gerd Moellmann <gerd@gnu.org>
parents:
30299
diff
changeset
|
3078 Qnil, menu_object, make_number (item), 1); |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3079 } |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3080 |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3081 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3082 static Lisp_Object |
11491
272baf4a077a
(xmenu_show, xdialog_show): Delete menubarp arg.
Richard M. Stallman <rms@gnu.org>
parents:
11449
diff
changeset
|
3083 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
|
3084 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
|
3085 int x, y; |
10757
2829c9840b0e
(xmenu_show, both versions): New arg for_click.
Richard M. Stallman <rms@gnu.org>
parents:
10716
diff
changeset
|
3086 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
|
3087 int keymaps; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3088 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
|
3089 char **error; |
118 | 3090 { |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3091 Window root; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3092 XMenu *menu; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3093 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
|
3094 Lisp_Object entry, pane_prefix; |
118 | 3095 char *datap; |
3096 int ulx, uly, width, height; | |
3097 int dispwidth, dispheight; | |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3098 int i, j; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3099 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
|
3100 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
|
3101 unsigned int dummy_uint; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
3102 |
3747
6506b2fd475a
(xmenu_show): Store 0 in *ERROR at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
3501
diff
changeset
|
3103 *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
|
3104 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
|
3105 return Qnil; |
1082
d24afc1bef38
(xmenu_show): If no panes, just return.
Richard M. Stallman <rms@gnu.org>
parents:
975
diff
changeset
|
3106 |
7335
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
3107 if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
3108 { |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
3109 *error = "Empty menu"; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
3110 return Qnil; |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
3111 } |
73d1276933e1
(xmenu_show): Disallow empty menus.
Karl Heuer <kwzh@gnu.org>
parents:
7334
diff
changeset
|
3112 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3113 /* 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
|
3114 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
|
3115 &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
|
3116 &dummy_uint, &dummy_uint); |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
3117 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3118 /* 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
|
3119 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
|
3120 if (menu == NULL) |
118 | 3121 { |
3122 *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
|
3123 return Qnil; |
118 | 3124 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3125 |
9572 | 3126 #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
|
3127 /* 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
|
3128 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3129 Window child; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3130 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
|
3131 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3132 /* 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
|
3133 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
|
3134 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
|
3135 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3136 BLOCK_INPUT; |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3137 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
|
3138 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3139 /* 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
|
3140 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
|
3141 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
|
3142 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3143 /* 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
|
3144 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
|
3145 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3146 /* 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
|
3147 &child); |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3148 UNBLOCK_INPUT; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3149 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
|
3150 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
|
3151 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3152 } |
9572 | 3153 #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
|
3154 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3155 /* Adjust coordinates to be root-window-relative. */ |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
3156 x += f->left_pos; |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
50938
diff
changeset
|
3157 y += f->top_pos; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3158 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3159 /* 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
|
3160 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3161 while (i < menu_items_used) |
118 | 3162 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3163 if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
118 | 3164 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3165 /* 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
|
3166 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
|
3167 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
|
3168 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3169 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
|
3170 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
|
3171 pane_string = (NILP (pane_name) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3172 ? "" : (char *) SDATA (pane_name)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3173 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
|
3174 pane_string++; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3175 |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3176 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
|
3177 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
|
3178 { |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3179 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
|
3180 *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
|
3181 return Qnil; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3182 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3183 i += MENU_ITEMS_PANE_LENGTH; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3184 |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3185 /* 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
|
3186 maxwidth = 0; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3187 j = i; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3188 while (j < menu_items_used) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3189 { |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3190 Lisp_Object item; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3191 item = XVECTOR (menu_items)->contents[j]; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3192 if (EQ (item, Qt)) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3193 break; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3194 if (NILP (item)) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3195 { |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3196 j++; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3197 continue; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3198 } |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3199 width = SBYTES (item); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3200 if (width > maxwidth) |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3201 maxwidth = width; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3202 |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3203 j += MENU_ITEMS_ITEM_LENGTH; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3204 } |
118 | 3205 } |
6746
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
3206 /* Ignore a nil in the item list. |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
3207 It's meaningful only for dialog boxes. */ |
cda1ce7952ca
(Fx_popup_dialog): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
6656
diff
changeset
|
3208 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
|
3209 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
|
3210 else |
118 | 3211 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3212 /* Create a new item within current pane. */ |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3213 Lisp_Object item_name, enable, descrip, help; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3214 unsigned char *item_data; |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3215 char *help_string; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3216 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3217 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
|
3218 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
|
3219 descrip |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3220 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3221 help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3222 help_string = STRINGP (help) ? SDATA (help) : NULL; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3223 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3224 if (!NILP (descrip)) |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3225 { |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3226 int gap = maxwidth - SBYTES (item_name); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3227 #ifdef C_ALLOCA |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3228 Lisp_Object spacer; |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3229 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
|
3230 item_name = concat2 (item_name, spacer); |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3231 item_name = concat2 (item_name, descrip); |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3232 item_data = SDATA (item_name); |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3233 #else |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3234 /* 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
|
3235 to reduce gc needs. */ |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3236 item_data |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3237 = (unsigned char *) alloca (maxwidth |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3238 + SBYTES (descrip) + 1); |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3239 bcopy (SDATA (item_name), item_data, |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3240 SBYTES (item_name)); |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3241 for (j = SCHARS (item_name); j < maxwidth; j++) |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3242 item_data[j] = ' '; |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3243 bcopy (SDATA (descrip), item_data + j, |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3244 SBYTES (descrip)); |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3245 item_data[j + SBYTES (descrip)] = 0; |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3246 #endif |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3247 } |
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3248 else |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
3249 item_data = SDATA (item_name); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3250 |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3251 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
|
3252 menu, lpane, 0, item_data, |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3253 !NILP (enable), help_string) |
118 | 3254 == XM_FAILURE) |
3255 { | |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3256 XMenuDestroy (FRAME_X_DISPLAY (f), menu); |
118 | 3257 *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
|
3258 return Qnil; |
118 | 3259 } |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3260 i += MENU_ITEMS_ITEM_LENGTH; |
118 | 3261 } |
3262 } | |
6881
796416bd7f7e
(last_menu_bar_item_end): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
6764
diff
changeset
|
3263 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3264 /* 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
|
3265 XMenuRecompute (FRAME_X_DISPLAY (f), menu); |
37255
ff709975abaf
(xmenu_show): Use FRAME_X_SCREEN_NUMBER.
Gerd Moellmann <gerd@gnu.org>
parents:
37211
diff
changeset
|
3266 dispwidth = DisplayWidth (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); |
ff709975abaf
(xmenu_show): Use FRAME_X_SCREEN_NUMBER.
Gerd Moellmann <gerd@gnu.org>
parents:
37211
diff
changeset
|
3267 dispheight = DisplayHeight (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3268 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
|
3269 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
|
3270 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
|
3271 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
|
3272 XMenuLocate (FRAME_X_DISPLAY (f), menu, 0, 0, x, y, |
118 | 3273 &ulx, &uly, &width, &height); |
3274 if (ulx+width > dispwidth) | |
3275 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3276 x -= (ulx + width) - dispwidth; |
118 | 3277 ulx = dispwidth - width; |
3278 } | |
3279 if (uly+height > dispheight) | |
3280 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3281 y -= (uly + height) - dispheight; |
118 | 3282 uly = dispheight - height; |
3283 } | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3284 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
|
3285 if (uly < 0) y -= uly; |
6526
95661fd7a320
(xmenu_show): Enable asynchronous events.
Karl Heuer <kwzh@gnu.org>
parents:
6481
diff
changeset
|
3286 |
95661fd7a320
(xmenu_show): Enable asynchronous events.
Karl Heuer <kwzh@gnu.org>
parents:
6481
diff
changeset
|
3287 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
|
3288 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
|
3289 pane = selidx = 0; |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3290 |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3291 /* Help display under X won't work because XMenuActivate contains |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3292 a loop that doesn't give Emacs a chance to process it. */ |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3293 menu_help_frame = f; |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3294 status = XMenuActivate (FRAME_X_DISPLAY (f), menu, &pane, &selidx, |
27458
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3295 x, y, ButtonReleaseMask, &datap, |
2bfd43d89c8e
(xmenu_show) [!USE_X_TOOLKIT]: Pass help to
Gerd Moellmann <gerd@gnu.org>
parents:
27425
diff
changeset
|
3296 menu_help_callback); |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
3297 |
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
3298 |
12131
fa4e74485660
(xmenu_show): If !HAVE_X_WINDOWS, don't reference X display.
Karl Heuer <kwzh@gnu.org>
parents:
12018
diff
changeset
|
3299 #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
|
3300 /* 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
|
3301 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
|
3302 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
|
3303 #endif |
10167
358d48409854
Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
Richard M. Stallman <rms@gnu.org>
parents:
9725
diff
changeset
|
3304 |
118 | 3305 switch (status) |
3306 { | |
3307 case XM_SUCCESS: | |
3308 #ifdef XDEBUG | |
3309 fprintf (stderr, "pane= %d line = %d\n", panes, selidx); | |
3310 #endif | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3311 |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3312 /* 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
|
3313 i = 0; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3314 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
|
3315 { |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3316 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
|
3317 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3318 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
|
3319 pane_prefix |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3320 = 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
|
3321 pane--; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3322 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
|
3323 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3324 else |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3325 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3326 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
|
3327 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3328 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
|
3329 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3330 entry |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3331 = 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
|
3332 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
|
3333 { |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3334 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
|
3335 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
|
3336 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
|
3337 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3338 break; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3339 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3340 selidx--; |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3341 } |
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3342 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
|
3343 } |
2747
f258c79c9162
(Fx_popup_menu): Add a vector of prefix keys for the panes.
Richard M. Stallman <rms@gnu.org>
parents:
2514
diff
changeset
|
3344 } |
118 | 3345 break; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3346 |
118 | 3347 case XM_FAILURE: |
3348 *error = "Can't activate menu"; | |
3349 case XM_IA_SELECT: | |
3350 case XM_NO_SELECT: | |
3351 entry = Qnil; | |
3352 break; | |
3353 } | |
9608
1a85137cb257
Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
3354 XMenuDestroy (FRAME_X_DISPLAY (f), menu); |
7208
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
3355 |
9572 | 3356 #ifdef HAVE_X_WINDOWS |
7208
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
3357 /* 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
|
3358 (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
|
3359 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
|
3360 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
|
3361 FRAME_X_DISPLAY_INFO (f)->grabbed = 0; |
9572 | 3362 #endif |
7208
2d3c771ff861
(xdialog_show): Clear x_mouse_grabbed.
Richard M. Stallman <rms@gnu.org>
parents:
7175
diff
changeset
|
3363 |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3364 return entry; |
118 | 3365 } |
9233
746cc6b0d28f
(widget_id_tick): Renamed from popup_id_tick.
Paul Reilly <pmr@pajato.com>
parents:
9102
diff
changeset
|
3366 |
5673
7035bc81858b
Find lwlib.h and xlwmenuP.h in ../lwlib.
Richard M. Stallman <rms@gnu.org>
parents:
5602
diff
changeset
|
3367 #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
|
3368 |
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
3369 #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
|
3370 |
21514 | 3371 void |
118 | 3372 syms_of_xmenu () |
3373 { | |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3374 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
|
3375 menu_items = Qnil; |
48113
6a09e4b41337
(unuse_menu_items): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
46753
diff
changeset
|
3376 menu_items_inuse = Qnil; |
6058
662b9cd767fe
(Fx_popup_menu): Allow t as position, meaning use mouse pos.
Richard M. Stallman <rms@gnu.org>
parents:
6018
diff
changeset
|
3377 |
12625
e2831d2f5b09
(syms_of_xmenu): Set up Qdebug_on_next_call.
Richard M. Stallman <rms@gnu.org>
parents:
12432
diff
changeset
|
3378 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
|
3379 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
|
3380 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
3381 DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39914
diff
changeset
|
3382 doc: /* Frame for which we are updating a menu. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39690
diff
changeset
|
3383 The enable predicate for a menu command should check this variable. */); |
16656
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
3384 Vmenu_updating_frame = Qnil; |
9cbbf721b91c
(Vmenu_updating_frame): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
16411
diff
changeset
|
3385 |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
3386 #ifdef USE_X_TOOLKIT |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49322
diff
changeset
|
3387 widget_id_tick = (1<<16); |
12661 | 3388 next_menubar_widget_id = 1; |
9336
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
3389 #endif |
d5ffd9c9edb0
(widget_id_tick): Move definition into conditional.
Richard M. Stallman <rms@gnu.org>
parents:
9236
diff
changeset
|
3390 |
118 | 3391 defsubr (&Sx_popup_menu); |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
3392 #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
|
3393 defsubr (&Sx_popup_dialog); |
14741
9f9c4d4581e4
Put most of file into HAVE_MENUS conditional.
Richard M. Stallman <rms@gnu.org>
parents:
14553
diff
changeset
|
3394 #endif |
118 | 3395 } |
52401 | 3396 |
3397 /* arch-tag: 92ea573c-398e-496e-ac73-2436f7d63242 | |
3398 (do not change this comment) */ |