Mercurial > emacs
annotate src/w32menu.c @ 42135:dfc99f4ae55e
Conditionally include fcntl.h.
author | Dave Love <fx@gnu.org> |
---|---|
date | Tue, 18 Dec 2001 16:02:14 +0000 |
parents | d5fc57bcb0f2 |
children | b575cbf7f94e |
rev | line source |
---|---|
16884
36babc489b0c
Change all uses of win95, winnt, and win32
Geoff Voelker <voelker@cs.washington.edu>
parents:
16860
diff
changeset
|
1 /* Menu support for GNU Emacs on the Microsoft W32 API. |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25646
diff
changeset
|
2 Copyright (C) 1986, 88, 93, 94, 96, 98, 1999 Free Software Foundation, Inc. |
13434 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 2, or (at your option) | |
9 any later version. | |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
13434 | 20 |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25646
diff
changeset
|
21 #include <config.h> |
13434 | 22 #include <signal.h> |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
23 |
13434 | 24 #include <stdio.h> |
25 #include "lisp.h" | |
26 #include "termhooks.h" | |
31114
cd392fdf0e9f
Include keyboard.h before frame.h. Fix compile
Andrew Innes <andrewi@gnu.org>
parents:
30989
diff
changeset
|
27 #include "keyboard.h" |
39690
38c1890338cc
(keymap_panes, Fx_popup_menu): Use Fkeymap_prompt.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
28 #include "keymap.h" |
13434 | 29 #include "frame.h" |
30 #include "window.h" | |
31 #include "blockinput.h" | |
15276 | 32 #include "buffer.h" |
29320
33aa00975055
(single_submenu, w32_menu_show): Call ENCODE_SYSTEM on menu strings.
Jason Rumney <jasonr@gnu.org>
parents:
28275
diff
changeset
|
33 #include "charset.h" |
33aa00975055
(single_submenu, w32_menu_show): Call ENCODE_SYSTEM on menu strings.
Jason Rumney <jasonr@gnu.org>
parents:
28275
diff
changeset
|
34 #include "coding.h" |
13434 | 35 |
36 /* This may include sys/types.h, and that somehow loses | |
37 if this is not done before the other system files. */ | |
38 #include "w32term.h" | |
39 | |
40 /* Load sys/types.h if not already loaded. | |
41 In some systems loading it twice is suicidal. */ | |
42 #ifndef makedev | |
43 #include <sys/types.h> | |
44 #endif | |
45 | |
46 #include "dispextern.h" | |
47 | |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
48 #undef HAVE_MULTILINGUAL_MENU |
33971
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
49 #undef HAVE_DIALOGS /* TODO: Implement native dialogs. */ |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
50 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
51 /******************************************************************/ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
52 /* Definitions copied from lwlib.h */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
53 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
54 typedef void * XtPointer; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
55 typedef char Boolean; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
56 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
57 enum button_type |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
58 { |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
59 BUTTON_TYPE_NONE, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
60 BUTTON_TYPE_TOGGLE, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
61 BUTTON_TYPE_RADIO |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
62 }; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
63 |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
64 /* This structure is based on the one in ../lwlib/lwlib.h, modified |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
65 for Windows. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
66 typedef struct _widget_value |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
67 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
68 /* name of widget */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
69 char* name; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
70 /* value (meaning depend on widget type) */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
71 char* value; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
72 /* keyboard equivalent. no implications for XtTranslations */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
73 char* key; |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
74 /* Help string or nil if none. |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
75 GC finds this string through the frame's menu_bar_vector |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
76 or through menu_items. */ |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
77 Lisp_Object help; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
78 /* true if enabled */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
79 Boolean enabled; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
80 /* true if selected */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
81 Boolean selected; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
82 /* The type of a button. */ |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
83 enum button_type button_type; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
84 /* true if menu title */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
85 Boolean title; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
86 #if 0 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
87 /* true if was edited (maintained by get_value) */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
88 Boolean edited; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
89 /* true if has changed (maintained by lw library) */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
90 change_type change; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
91 /* true if this widget itself has changed, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
92 but not counting the other widgets found in the `next' field. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
93 change_type this_one_change; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
94 #endif |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
95 /* Contents of the sub-widgets, also selected slot for checkbox */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
96 struct _widget_value* contents; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
97 /* data passed to callback */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
98 XtPointer call_data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
99 /* next one in the list */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
100 struct _widget_value* next; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
101 #if 0 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
102 /* slot for the toolkit dependent part. Always initialize to NULL. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
103 void* toolkit_data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
104 /* tell us if we should free the toolkit data slot when freeing the |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
105 widget_value itself. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
106 Boolean free_toolkit_data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
107 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
108 /* we resource the widget_value structures; this points to the next |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
109 one on the free list if this one has been deallocated. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
110 */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
111 struct _widget_value *free_list; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
112 #endif |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
113 } widget_value; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
114 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
115 /* LocalAlloc/Free is a reasonably good allocator. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
116 #define malloc_widget_value() (void*)LocalAlloc (LMEM_ZEROINIT, sizeof (widget_value)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
117 #define free_widget_value(wv) LocalFree (wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
118 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
119 /******************************************************************/ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
120 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
121 #ifndef TRUE |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
122 #define TRUE 1 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
123 #define FALSE 0 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
124 #endif /* no TRUE */ |
13434 | 125 |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
126 static HMENU current_popup_menu; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
127 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
128 FARPROC get_menu_item_info; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
129 FARPROC set_menu_item_info; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
130 |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
131 Lisp_Object Vmenu_updating_frame; |
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
132 |
15276 | 133 Lisp_Object Qdebug_on_next_call; |
134 | |
13434 | 135 extern Lisp_Object Qmenu_bar; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
136 extern Lisp_Object Qmouse_click, Qevent_kind; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
137 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
138 extern Lisp_Object QCtoggle, QCradio; |
13434 | 139 |
15276 | 140 extern Lisp_Object Voverriding_local_map; |
141 extern Lisp_Object Voverriding_local_map_menu_flag; | |
142 | |
143 extern Lisp_Object Qoverriding_local_map, Qoverriding_terminal_local_map; | |
144 | |
145 extern Lisp_Object Qmenu_bar_update_hook; | |
146 | |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
147 void set_frame_menubar (); |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
148 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
149 static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
150 Lisp_Object, Lisp_Object, Lisp_Object, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
151 Lisp_Object, Lisp_Object)); |
41637
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
152 #ifdef HAVE_DIALOGS |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
153 static Lisp_Object w32_dialog_show (); |
41637
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
154 #endif |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
155 static Lisp_Object w32_menu_show (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
156 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
157 static void keymap_panes (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
158 static void single_keymap_panes (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
159 static void single_menu_item (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
160 static void list_of_panes (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
161 static void list_of_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
162 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
163 /* This holds a Lisp vector that holds the results of decoding |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
164 the keymaps or alist-of-alists that specify a menu. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
165 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
166 It describes the panes and items within the panes. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
167 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
168 Each pane is described by 3 elements in the vector: |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
169 t, the pane name, the pane's prefix key. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
170 Then follow the pane's items, with 5 elements per item: |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
171 the item string, the enable flag, the item's value, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
172 the definition, and the equivalent keyboard key's description string. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
173 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
174 In some cases, multiple levels of menus may be described. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
175 A single vector slot containing nil indicates the start of a submenu. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
176 A single vector slot containing lambda indicates the end of a submenu. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
177 The submenu follows a menu item which is the way to reach the submenu. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
178 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
179 A single vector slot containing quote indicates that the |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
180 following items should appear on the right of a dialog box. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
181 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
182 Using a Lisp vector to hold this information while we decode it |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
183 takes care of protecting all the data from GC. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
184 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
185 #define MENU_ITEMS_PANE_NAME 1 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
186 #define MENU_ITEMS_PANE_PREFIX 2 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
187 #define MENU_ITEMS_PANE_LENGTH 3 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
188 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
189 enum menu_item_idx |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
190 { |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
191 MENU_ITEMS_ITEM_NAME = 0, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
192 MENU_ITEMS_ITEM_ENABLE, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
193 MENU_ITEMS_ITEM_VALUE, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
194 MENU_ITEMS_ITEM_EQUIV_KEY, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
195 MENU_ITEMS_ITEM_DEFINITION, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
196 MENU_ITEMS_ITEM_TYPE, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
197 MENU_ITEMS_ITEM_SELECTED, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
198 MENU_ITEMS_ITEM_HELP, |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
199 MENU_ITEMS_ITEM_LENGTH |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
200 }; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
201 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
202 static Lisp_Object menu_items; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
203 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
204 /* Number of slots currently allocated in menu_items. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
205 static int menu_items_allocated; |
13434 | 206 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
207 /* This is the index in menu_items of the first empty slot. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
208 static int menu_items_used; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
209 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
210 /* The number of panes currently recorded in menu_items, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
211 excluding those within submenus. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
212 static int menu_items_n_panes; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
213 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
214 /* Current depth within submenus. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
215 static int menu_items_submenu_depth; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
216 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
217 /* Flag which when set indicates a dialog or menu has been posted by |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
218 Xt on behalf of one of the widget sets. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
219 static int popup_activated_flag; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
220 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
221 static int next_menubar_widget_id; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
222 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
223 /* This is set nonzero after the user activates the menu bar, and set |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
224 to zero again after the menu bars are redisplayed by prepare_menu_bar. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
225 While it is nonzero, all calls to set_frame_menubar go deep. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
226 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
227 I don't understand why this is needed, but it does seem to be |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
228 needed on Motif, according to Marcus Daniels <marcus@sysc.pdx.edu>. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
229 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
230 int pending_menu_activation; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
231 |
13434 | 232 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
233 /* Return the frame whose ->output_data.w32->menubar_widget equals |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
234 ID, or 0 if none. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
235 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
236 static struct frame * |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
237 menubar_id_to_frame (id) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
238 HMENU id; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
239 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
240 Lisp_Object tail, frame; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
241 FRAME_PTR f; |
13434 | 242 |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
243 for (tail = Vframe_list; GC_CONSP (tail); tail = XCDR (tail)) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
244 { |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
245 frame = XCAR (tail); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
246 if (!GC_FRAMEP (frame)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
247 continue; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
248 f = XFRAME (frame); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
249 if (!FRAME_WINDOW_P (f)) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
250 continue; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
251 if (f->output_data.w32->menubar_widget == id) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
252 return f; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
253 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
254 return 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
255 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
256 |
13434 | 257 /* Initialize the menu_items structure if we haven't already done so. |
258 Also mark it as currently empty. */ | |
259 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
260 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
261 init_menu_items () |
13434 | 262 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
263 if (NILP (menu_items)) |
13434 | 264 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
265 menu_items_allocated = 60; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
266 menu_items = Fmake_vector (make_number (menu_items_allocated), Qnil); |
13434 | 267 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
268 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
269 menu_items_used = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
270 menu_items_n_panes = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
271 menu_items_submenu_depth = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
272 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
273 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
274 /* Call at the end of generating the data in menu_items. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
275 This fills in the number of items in the last pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
276 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
277 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
278 finish_menu_items () |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
279 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
280 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
281 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
282 /* Call when finished using the data for the current menu |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
283 in menu_items. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
284 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
285 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
286 discard_menu_items () |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
287 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
288 /* Free the structure if it is especially large. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
289 Otherwise, hold on to it, to save time. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
290 if (menu_items_allocated > 200) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
291 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
292 menu_items = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
293 menu_items_allocated = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
294 } |
13434 | 295 } |
296 | |
297 /* Make the menu_items vector twice as large. */ | |
298 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
299 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
300 grow_menu_items () |
13434 | 301 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
302 Lisp_Object old; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
303 int old_size = menu_items_allocated; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
304 old = menu_items; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
305 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
306 menu_items_allocated *= 2; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
307 menu_items = Fmake_vector (make_number (menu_items_allocated), Qnil); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
308 bcopy (XVECTOR (old)->contents, XVECTOR (menu_items)->contents, |
13434 | 309 old_size * sizeof (Lisp_Object)); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
310 } |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
311 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
312 /* Begin a submenu. */ |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
313 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
314 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
315 push_submenu_start () |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
316 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
317 if (menu_items_used + 1 > menu_items_allocated) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
318 grow_menu_items (); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
319 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
320 XVECTOR (menu_items)->contents[menu_items_used++] = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
321 menu_items_submenu_depth++; |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
322 } |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
323 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
324 /* End a submenu. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
325 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
326 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
327 push_submenu_end () |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
328 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
329 if (menu_items_used + 1 > menu_items_allocated) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
330 grow_menu_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
331 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
332 XVECTOR (menu_items)->contents[menu_items_used++] = Qlambda; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
333 menu_items_submenu_depth--; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
334 } |
13434 | 335 |
336 /* Indicate boundary between left and right. */ | |
337 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
338 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
339 push_left_right_boundary () |
13434 | 340 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
341 if (menu_items_used + 1 > menu_items_allocated) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
342 grow_menu_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
343 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
344 XVECTOR (menu_items)->contents[menu_items_used++] = Qquote; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
345 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
346 |
41251
e6612d08452f
(w32_menu_show, push_menu_pane): Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
41108
diff
changeset
|
347 /* Start a new menu pane in menu_items. |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
348 NAME is the pane name. PREFIX_VEC is a prefix key for this pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
349 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
350 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
351 push_menu_pane (name, prefix_vec) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
352 Lisp_Object name, prefix_vec; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
353 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
354 if (menu_items_used + MENU_ITEMS_PANE_LENGTH > menu_items_allocated) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
355 grow_menu_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
356 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
357 if (menu_items_submenu_depth == 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
358 menu_items_n_panes++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
359 XVECTOR (menu_items)->contents[menu_items_used++] = Qt; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
360 XVECTOR (menu_items)->contents[menu_items_used++] = name; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
361 XVECTOR (menu_items)->contents[menu_items_used++] = prefix_vec; |
13434 | 362 } |
363 | |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
364 /* Push one menu item into the current pane. NAME is the string to |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
365 display. ENABLE if non-nil means this item can be selected. KEY |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
366 is the key generated by choosing this item, or nil if this item |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
367 doesn't really have a definition. DEF is the definition of this |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
368 item. EQUIV is the textual description of the keyboard equivalent |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
369 for this item (or nil if none). TYPE is the type of this menu |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
370 item, one of nil, `toggle' or `radio'. */ |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
371 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
372 static void |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
373 push_menu_item (name, enable, key, def, equiv, type, selected, help) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
374 Lisp_Object name, enable, key, def, equiv, type, selected, help; |
13434 | 375 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
376 if (menu_items_used + MENU_ITEMS_ITEM_LENGTH > menu_items_allocated) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
377 grow_menu_items (); |
13434 | 378 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
379 XVECTOR (menu_items)->contents[menu_items_used++] = name; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
380 XVECTOR (menu_items)->contents[menu_items_used++] = enable; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
381 XVECTOR (menu_items)->contents[menu_items_used++] = key; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
382 XVECTOR (menu_items)->contents[menu_items_used++] = equiv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
383 XVECTOR (menu_items)->contents[menu_items_used++] = def; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
384 XVECTOR (menu_items)->contents[menu_items_used++] = type; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
385 XVECTOR (menu_items)->contents[menu_items_used++] = selected; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
386 XVECTOR (menu_items)->contents[menu_items_used++] = help; |
13434 | 387 } |
388 | |
389 /* Look through KEYMAPS, a vector of keymaps that is NMAPS long, | |
390 and generate menu panes for them in menu_items. | |
391 If NOTREAL is nonzero, | |
392 don't bother really computing whether an item is enabled. */ | |
393 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
394 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
395 keymap_panes (keymaps, nmaps, notreal) |
13434 | 396 Lisp_Object *keymaps; |
397 int nmaps; | |
398 int notreal; | |
399 { | |
400 int mapno; | |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
401 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
402 init_menu_items (); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
403 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
404 /* Loop over the given keymaps, making a pane for each map. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
405 But don't make a pane that is empty--ignore that map instead. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
406 P is the number of panes we have made so far. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
407 for (mapno = 0; mapno < nmaps; mapno++) |
30989
2152817050ff
(keymap_panes): Pass the keymap's prompt as the pane name to
Jason Rumney <jasonr@gnu.org>
parents:
30238
diff
changeset
|
408 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
|
409 Fkeymap_prompt (keymaps[mapno]), Qnil, notreal, 10); |
13434 | 410 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
411 finish_menu_items (); |
13434 | 412 } |
413 | |
414 /* This is a recursive subroutine of keymap_panes. | |
415 It handles one keymap, KEYMAP. | |
416 The other arguments are passed along | |
417 or point to local variables of the previous function. | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
418 If NOTREAL is nonzero, only check for equivalent key bindings, don't |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
419 evaluate expressions in menu items and don't make any menu. |
13434 | 420 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
421 If we encounter submenus deeper than MAXDEPTH levels, ignore them. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
422 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
423 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
424 single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth) |
13434 | 425 Lisp_Object keymap; |
426 Lisp_Object pane_name; | |
427 Lisp_Object prefix; | |
428 int notreal; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
429 int maxdepth; |
13434 | 430 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
431 Lisp_Object pending_maps = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
432 Lisp_Object tail, item; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
433 struct gcpro gcpro1, gcpro2; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
434 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
435 if (maxdepth <= 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
436 return; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
437 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
438 push_menu_pane (pane_name, prefix); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
439 |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
440 for (tail = keymap; CONSP (tail); tail = XCDR (tail)) |
13434 | 441 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
442 GCPRO2 (keymap, pending_maps); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
443 /* Look at each key binding, and if it is a menu item add it |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
444 to this menu. */ |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
445 item = XCAR (tail); |
13434 | 446 if (CONSP (item)) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
447 single_menu_item (XCAR (item), XCDR (item), |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
448 &pending_maps, notreal, maxdepth); |
13434 | 449 else if (VECTORP (item)) |
450 { | |
451 /* Loop over the char values represented in the vector. */ | |
452 int len = XVECTOR (item)->size; | |
453 int c; | |
454 for (c = 0; c < len; c++) | |
455 { | |
456 Lisp_Object character; | |
457 XSETFASTINT (character, c); | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
458 single_menu_item (character, XVECTOR (item)->contents[c], |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
459 &pending_maps, notreal, maxdepth); |
13434 | 460 } |
461 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
462 UNGCPRO; |
13434 | 463 } |
464 | |
465 /* Process now any submenus which want to be panes at this level. */ | |
466 while (!NILP (pending_maps)) | |
467 { | |
468 Lisp_Object elt, eltcdr, string; | |
469 elt = Fcar (pending_maps); | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
470 eltcdr = XCDR (elt); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
471 string = XCAR (eltcdr); |
13434 | 472 /* We no longer discard the @ from the beginning of the string here. |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
473 Instead, we do this in w32_menu_show. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
474 single_keymap_panes (Fcar (elt), string, |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
22750
diff
changeset
|
475 XCDR (eltcdr), notreal, maxdepth - 1); |
13434 | 476 pending_maps = Fcdr (pending_maps); |
477 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
478 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
479 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
480 /* This is a subroutine of single_keymap_panes that handles one |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
481 keymap entry. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
482 KEY is a key in a keymap and ITEM is its binding. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
483 PENDING_MAPS_PTR points to a list of keymaps waiting to be made into |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
484 separate panes. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
485 If NOTREAL is nonzero, only check for equivalent key bindings, don't |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
486 evaluate expressions in menu items and don't make any menu. |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
487 If we encounter submenus deeper than MAXDEPTH levels, ignore them. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
488 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
489 static void |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
490 single_menu_item (key, item, pending_maps_ptr, notreal, maxdepth) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
491 Lisp_Object key, item; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
492 Lisp_Object *pending_maps_ptr; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
493 int maxdepth, notreal; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
494 { |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
495 Lisp_Object map, item_string, enabled; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
496 struct gcpro gcpro1, gcpro2; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
497 int res; |
13434 | 498 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
499 /* Parse the menu item and leave the result in item_properties. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
500 GCPRO2 (key, item); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
501 res = parse_menu_item (item, notreal, 0); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
502 UNGCPRO; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
503 if (!res) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
504 return; /* Not a menu item. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
505 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
506 map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
507 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
508 if (notreal) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
509 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
510 /* We don't want to make a menu, just traverse the keymaps to |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
511 precompute equivalent key bindings. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
512 if (!NILP (map)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
513 single_keymap_panes (map, Qnil, key, 1, maxdepth - 1); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
514 return; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
515 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
516 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
517 enabled = XVECTOR (item_properties)->contents[ITEM_PROPERTY_ENABLE]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
518 item_string = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
519 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
520 if (!NILP (map) && XSTRING (item_string)->data[0] == '@') |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
521 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
522 if (!NILP (enabled)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
523 /* An enabled separate pane. Remember this to handle it later. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
524 *pending_maps_ptr = Fcons (Fcons (map, Fcons (item_string, key)), |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
525 *pending_maps_ptr); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
526 return; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
527 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
528 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
529 push_menu_item (item_string, enabled, key, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
530 XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF], |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
531 XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ], |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
532 XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE], |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
533 XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED], |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
534 XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP]); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
535 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
536 /* Display a submenu using the toolkit. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
537 if (! (NILP (map) || NILP (enabled))) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
538 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
539 push_submenu_start (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
540 single_keymap_panes (map, Qnil, key, 0, maxdepth - 1); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
541 push_submenu_end (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
542 } |
13434 | 543 } |
544 | |
14036 | 545 /* Push all the panes and items of a menu described by the |
13434 | 546 alist-of-alists MENU. |
547 This handles old-fashioned calls to x-popup-menu. */ | |
548 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
549 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
550 list_of_panes (menu) |
13434 | 551 Lisp_Object menu; |
552 { | |
553 Lisp_Object tail; | |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
554 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
555 init_menu_items (); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
556 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
557 for (tail = menu; !NILP (tail); tail = Fcdr (tail)) |
13434 | 558 { |
559 Lisp_Object elt, pane_name, pane_data; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
560 elt = Fcar (tail); |
13434 | 561 pane_name = Fcar (elt); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
562 CHECK_STRING (pane_name); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
563 push_menu_pane (pane_name, Qnil); |
13434 | 564 pane_data = Fcdr (elt); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
565 CHECK_CONS (pane_data); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
566 list_of_items (pane_data); |
13434 | 567 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
568 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
569 finish_menu_items (); |
13434 | 570 } |
571 | |
572 /* Push the items in a single pane defined by the alist PANE. */ | |
573 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
574 static void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
575 list_of_items (pane) |
13434 | 576 Lisp_Object pane; |
577 { | |
578 Lisp_Object tail, item, item1; | |
579 | |
580 for (tail = pane; !NILP (tail); tail = Fcdr (tail)) | |
581 { | |
582 item = Fcar (tail); | |
583 if (STRINGP (item)) | |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
584 push_menu_item (item, Qnil, Qnil, Qt, Qnil, Qnil, Qnil, Qnil); |
13434 | 585 else if (NILP (item)) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
586 push_left_right_boundary (); |
13434 | 587 else |
588 { | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
589 CHECK_CONS (item); |
13434 | 590 item1 = Fcar (item); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
591 CHECK_STRING (item1); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
592 push_menu_item (item1, Qt, Fcdr (item), Qt, Qnil, Qnil, Qnil, Qnil); |
13434 | 593 } |
594 } | |
595 } | |
596 | |
597 DEFUN ("x-popup-menu", Fx_popup_menu, Sx_popup_menu, 2, 2, 0, | |
40962
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
598 doc: /* Pop up a deck-of-cards menu and return user's selection. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
599 POSITION is a position specification. This is either a mouse button |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
600 event or a list ((XOFFSET YOFFSET) WINDOW) where XOFFSET and YOFFSET |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
601 are positions in pixels from the top left corner of WINDOW's frame |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
602 \(WINDOW may be a frame object instead of a window). This controls the |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
603 position of the center of the first line in the first pane of the |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
604 menu, not the top left of the menu as a whole. If POSITION is t, it |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
605 means to use the current mouse position. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
606 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
607 MENU is a specifier for a menu. For the simplest case, MENU is a keymap. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
608 The menu items come from key bindings that have a menu string as well as |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
609 a definition; actually, the \"definition\" in such a key binding looks like |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
610 \(STRING . REAL-DEFINITION). To give the menu a title, put a string into |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
611 the keymap as a top-level element. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
612 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
613 If REAL-DEFINITION is nil, that puts a nonselectable string in the menu. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
614 Otherwise, REAL-DEFINITION should be a valid key binding definition. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
615 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
616 You can also use a list of keymaps as MENU. Then each keymap makes a |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
617 separate pane. When MENU is a keymap or a list of keymaps, the return |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
618 value is a list of events. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
619 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
620 Alternatively, you can specify a menu of multiple panes with a list of |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
621 the form (TITLE PANE1 PANE2...), where each pane is a list of |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
622 form (TITLE ITEM1 ITEM2...). |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
623 Each ITEM is normally a cons cell (STRING . VALUE); but a string can |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
624 appear as an item--that makes a nonselectable line in the menu. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
625 With this form of menu, the return value is VALUE from the chosen item. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
626 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
627 If POSITION is nil, don't display the menu at all, just precalculate the |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
628 cached information about equivalent key sequences. */) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
629 (position, menu) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
630 Lisp_Object position, menu; |
13434 | 631 { |
632 Lisp_Object keymap, tem; | |
40476
18b1b133e5c1
(Fx_popup_menu): Explicitly init f, xpos, and ypos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40119
diff
changeset
|
633 int xpos = 0, ypos = 0; |
13434 | 634 Lisp_Object title; |
635 char *error_name; | |
636 Lisp_Object selection; | |
40476
18b1b133e5c1
(Fx_popup_menu): Explicitly init f, xpos, and ypos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40119
diff
changeset
|
637 FRAME_PTR f = NULL; |
13434 | 638 Lisp_Object x, y, window; |
639 int keymaps = 0; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
640 int for_click = 0; |
13434 | 641 struct gcpro gcpro1; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
642 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
643 #ifdef HAVE_MENUS |
13434 | 644 if (! NILP (position)) |
645 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
646 check_w32 (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
647 |
13434 | 648 /* Decode the first argument: find the window and the coordinates. */ |
16860
247f0b107588
(x-popup-menu): Pass in insist flag to mouse_position_hook.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16729
diff
changeset
|
649 if (EQ (position, Qt) |
32671
bbd3be4db5f2
(add_menu_item): Do not use MF_OWNERDRAW for titles, as it has stopped working.
Jason Rumney <jasonr@gnu.org>
parents:
31114
diff
changeset
|
650 || (CONSP (position) && (EQ (XCAR (position), Qmenu_bar) |
bbd3be4db5f2
(add_menu_item): Do not use MF_OWNERDRAW for titles, as it has stopped working.
Jason Rumney <jasonr@gnu.org>
parents:
31114
diff
changeset
|
651 || EQ (XCAR (position), Qtool_bar)))) |
13434 | 652 { |
653 /* Use the mouse's current position. */ | |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
654 FRAME_PTR new_f = SELECTED_FRAME (); |
13434 | 655 Lisp_Object bar_window; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
656 enum scroll_bar_part part; |
13434 | 657 unsigned long time; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
658 |
13434 | 659 if (mouse_position_hook) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
660 (*mouse_position_hook) (&new_f, 1, &bar_window, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
661 &part, &x, &y, &time); |
13434 | 662 if (new_f != 0) |
663 XSETFRAME (window, new_f); | |
664 else | |
665 { | |
666 window = selected_window; | |
667 XSETFASTINT (x, 0); | |
668 XSETFASTINT (y, 0); | |
669 } | |
670 } | |
671 else | |
672 { | |
673 tem = Fcar (position); | |
674 if (CONSP (tem)) | |
675 { | |
676 window = Fcar (Fcdr (position)); | |
677 x = Fcar (tem); | |
678 y = Fcar (Fcdr (tem)); | |
679 } | |
680 else | |
681 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
682 for_click = 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
683 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
684 window = Fcar (tem); /* POSN_WINDOW (tem) */ |
13434 | 685 tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */ |
686 x = Fcar (tem); | |
687 y = Fcdr (tem); | |
688 } | |
689 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
690 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
691 CHECK_NUMBER (x); |
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
692 CHECK_NUMBER (y); |
13434 | 693 |
694 /* Decode where to put the menu. */ | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
695 |
13434 | 696 if (FRAMEP (window)) |
697 { | |
698 f = XFRAME (window); | |
699 xpos = 0; | |
700 ypos = 0; | |
701 } | |
702 else if (WINDOWP (window)) | |
703 { | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
704 CHECK_LIVE_WINDOW (window); |
13434 | 705 f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
706 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
707 xpos = (FONT_WIDTH (FRAME_FONT (f)) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
708 * XFASTINT (XWINDOW (window)->left)); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
709 ypos = (FRAME_LINE_HEIGHT (f) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
710 * XFASTINT (XWINDOW (window)->top)); |
13434 | 711 } |
712 else | |
713 /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME, | |
714 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:
40476
diff
changeset
|
715 CHECK_WINDOW (window); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
716 |
13434 | 717 xpos += XINT (x); |
718 ypos += XINT (y); | |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
719 |
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
720 XSETFRAME (Vmenu_updating_frame, f); |
13434 | 721 } |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
722 Vmenu_updating_frame = Qnil; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
723 #endif /* HAVE_MENUS */ |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
724 |
13434 | 725 title = Qnil; |
726 GCPRO1 (title); | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
727 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
728 /* Decode the menu items from what was specified. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
729 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
730 keymap = get_keymap (menu, 0, 0); |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
731 if (CONSP (keymap)) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
732 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
733 /* We were given a keymap. Extract menu info from the keymap. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
734 Lisp_Object prompt; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
735 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
736 /* Extract the detailed info to make one pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
737 keymap_panes (&menu, 1, NILP (position)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
738 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
739 /* Search for a string appearing directly as an element of the keymap. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
740 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
|
741 prompt = Fkeymap_prompt (keymap); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
742 if (NILP (title) && !NILP (prompt)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
743 title = prompt; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
744 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
745 /* Make that be the pane title of the first pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
746 if (!NILP (prompt) && menu_items_n_panes >= 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
747 XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME] = prompt; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
748 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
749 keymaps = 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
750 } |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
751 else if (CONSP (menu) && KEYMAPP (XCAR (menu))) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
752 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
753 /* We were given a list of keymaps. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
754 int nmaps = XFASTINT (Flength (menu)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
755 Lisp_Object *maps |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
756 = (Lisp_Object *) alloca (nmaps * sizeof (Lisp_Object)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
757 int i; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
758 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
759 title = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
760 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
761 /* The first keymap that has a prompt string |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
762 supplies the menu title. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
763 for (tem = menu, i = 0; CONSP (tem); tem = Fcdr (tem)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
764 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
765 Lisp_Object prompt; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
766 |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
767 maps[i++] = keymap = get_keymap (Fcar (tem), 1, 0); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
768 |
39690
38c1890338cc
(keymap_panes, Fx_popup_menu): Use Fkeymap_prompt.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
39682
diff
changeset
|
769 prompt = Fkeymap_prompt (keymap); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
770 if (NILP (title) && !NILP (prompt)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
771 title = prompt; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
772 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
773 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
774 /* Extract the detailed info to make one pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
775 keymap_panes (maps, nmaps, NILP (position)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
776 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
777 /* Make the title be the pane title of the first pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
778 if (!NILP (title) && menu_items_n_panes >= 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
779 XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME] = title; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
780 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
781 keymaps = 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
782 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
783 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
784 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
785 /* We were given an old-fashioned menu. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
786 title = Fcar (menu); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
787 CHECK_STRING (title); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
788 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
789 list_of_panes (Fcdr (menu)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
790 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
791 keymaps = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
792 } |
13434 | 793 |
794 if (NILP (position)) | |
795 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
796 discard_menu_items (); |
13434 | 797 UNGCPRO; |
798 return Qnil; | |
799 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
800 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
801 #ifdef HAVE_MENUS |
13434 | 802 /* Display them in a menu. */ |
803 BLOCK_INPUT; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
804 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
805 selection = w32_menu_show (f, xpos, ypos, for_click, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
806 keymaps, title, &error_name); |
13434 | 807 UNBLOCK_INPUT; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
808 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
809 discard_menu_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
810 |
13434 | 811 UNGCPRO; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
812 #endif /* HAVE_MENUS */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
813 |
13434 | 814 if (error_name) error (error_name); |
815 return selection; | |
816 } | |
817 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
818 #ifdef HAVE_MENUS |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
819 |
13434 | 820 DEFUN ("x-popup-dialog", Fx_popup_dialog, Sx_popup_dialog, 2, 2, 0, |
40962
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
821 doc: /* Pop up a dialog box and return user's selection. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
822 POSITION specifies which frame to use. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
823 This is normally a mouse button event or a window or frame. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
824 If POSITION is t, it means to use the frame the mouse is on. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
825 The dialog box appears in the middle of the specified frame. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
826 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
827 CONTENTS specifies the alternatives to display in the dialog box. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
828 It is a list of the form (TITLE ITEM1 ITEM2...). |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
829 Each ITEM is a cons cell (STRING . VALUE). |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
830 The return value is VALUE from the chosen item. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
831 |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
832 An ITEM may also be just a string--that makes a nonselectable item. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
833 An ITEM may also be nil--that means to put all preceding items |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
834 on the left of the dialog box and all following items on the right. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
835 \(By default, approximately half appear on each side.) */) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
836 (position, contents) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
837 Lisp_Object position, contents; |
13434 | 838 { |
40476
18b1b133e5c1
(Fx_popup_menu): Explicitly init f, xpos, and ypos.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40119
diff
changeset
|
839 FRAME_PTR f = NULL; |
13434 | 840 Lisp_Object window; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
841 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
842 check_w32 (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
843 |
13434 | 844 /* Decode the first argument: find the window or frame to use. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
845 if (EQ (position, Qt) |
32671
bbd3be4db5f2
(add_menu_item): Do not use MF_OWNERDRAW for titles, as it has stopped working.
Jason Rumney <jasonr@gnu.org>
parents:
31114
diff
changeset
|
846 || (CONSP (position) && (EQ (XCAR (position), Qmenu_bar) |
bbd3be4db5f2
(add_menu_item): Do not use MF_OWNERDRAW for titles, as it has stopped working.
Jason Rumney <jasonr@gnu.org>
parents:
31114
diff
changeset
|
847 || EQ (XCAR (position), Qtool_bar)))) |
13434 | 848 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
849 #if 0 /* Using the frame the mouse is on may not be right. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
850 /* Use the mouse's current position. */ |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
851 FRAME_PTR new_f = SELECTED_FRAME (); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
852 Lisp_Object bar_window; |
31114
cd392fdf0e9f
Include keyboard.h before frame.h. Fix compile
Andrew Innes <andrewi@gnu.org>
parents:
30989
diff
changeset
|
853 enum scroll_bar_part part; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
854 unsigned long time; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
855 Lisp_Object x, y; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
856 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
857 (*mouse_position_hook) (&new_f, 1, &bar_window, &part, &x, &y, &time); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
858 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
859 if (new_f != 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
860 XSETFRAME (window, new_f); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
861 else |
13434 | 862 window = selected_window; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
863 #endif |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
864 window = selected_window; |
13434 | 865 } |
866 else if (CONSP (position)) | |
867 { | |
868 Lisp_Object tem; | |
869 tem = Fcar (position); | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
870 if (CONSP (tem)) |
13434 | 871 window = Fcar (Fcdr (position)); |
872 else | |
873 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
874 tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
875 window = Fcar (tem); /* POSN_WINDOW (tem) */ |
13434 | 876 } |
877 } | |
878 else if (WINDOWP (position) || FRAMEP (position)) | |
879 window = position; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
880 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
881 window = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
882 |
13434 | 883 /* Decode where to put the menu. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
884 |
13434 | 885 if (FRAMEP (window)) |
886 f = XFRAME (window); | |
887 else if (WINDOWP (window)) | |
888 { | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
889 CHECK_LIVE_WINDOW (window); |
13434 | 890 f = XFRAME (WINDOW_FRAME (XWINDOW (window))); |
891 } | |
892 else | |
893 /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME, | |
894 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:
40476
diff
changeset
|
895 CHECK_WINDOW (window); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
896 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
897 #ifndef HAVE_DIALOGS |
13434 | 898 /* Display a menu with these alternatives |
899 in the middle of frame F. */ | |
900 { | |
901 Lisp_Object x, y, frame, newpos; | |
902 XSETFRAME (frame, f); | |
903 XSETINT (x, x_pixel_width (f) / 2); | |
904 XSETINT (y, x_pixel_height (f) / 2); | |
905 newpos = Fcons (Fcons (x, Fcons (y, Qnil)), Fcons (frame, Qnil)); | |
906 | |
907 return Fx_popup_menu (newpos, | |
908 Fcons (Fcar (contents), Fcons (contents, Qnil))); | |
909 } | |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
910 #else /* HAVE_DIALOGS */ |
13434 | 911 { |
912 Lisp_Object title; | |
913 char *error_name; | |
914 Lisp_Object selection; | |
915 | |
916 /* Decode the dialog items from what was specified. */ | |
917 title = Fcar (contents); | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40476
diff
changeset
|
918 CHECK_STRING (title); |
13434 | 919 |
920 list_of_panes (Fcons (contents, Qnil)); | |
921 | |
922 /* Display them in a dialog box. */ | |
923 BLOCK_INPUT; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
924 selection = w32_dialog_show (f, 0, title, &error_name); |
13434 | 925 UNBLOCK_INPUT; |
926 | |
927 discard_menu_items (); | |
928 | |
929 if (error_name) error (error_name); | |
930 return selection; | |
931 } | |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
932 #endif /* HAVE_DIALOGS */ |
13434 | 933 } |
934 | |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
935 /* Activate the menu bar of frame F. |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
936 This is called from keyboard.c when it gets the |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
937 menu_bar_activate_event out of the Emacs event queue. |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
938 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
939 To activate the menu bar, we signal to the input thread that it can |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
940 return from the WM_INITMENU message, allowing the normal Windows |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
941 processing of the menus. |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
942 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
943 But first we recompute the menu bar contents (the whole tree). |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
944 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
945 This way we can safely execute Lisp code. */ |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
946 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
947 void |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
948 x_activate_menubar (f) |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
949 FRAME_PTR f; |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
950 { |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
951 set_frame_menubar (f, 0, 1); |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
952 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
953 /* Lock out further menubar changes while active. */ |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
954 f->output_data.w32->menubar_active = 1; |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
955 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
956 /* Signal input thread to return from WM_INITMENU. */ |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
957 complete_deferred_msg (FRAME_W32_WINDOW (f), WM_INITMENU, 0); |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
958 } |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
959 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
960 /* This callback is called from the menu bar pulldown menu |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
961 when the user makes a selection. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
962 Figure out what the user chose |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
963 and put the appropriate events into the keyboard buffer. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
964 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
965 void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
966 menubar_selection_callback (FRAME_PTR f, void * client_data) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
967 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
968 Lisp_Object prefix, entry; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
969 Lisp_Object vector; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
970 Lisp_Object *subprefix_stack; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
971 int submenu_depth = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
972 int i; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
973 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
974 if (!f) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
975 return; |
38371
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
976 entry = Qnil; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
977 subprefix_stack = (Lisp_Object *) alloca (f->menu_bar_items_used * sizeof (Lisp_Object)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
978 vector = f->menu_bar_vector; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
979 prefix = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
980 i = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
981 while (i < f->menu_bar_items_used) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
982 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
983 if (EQ (XVECTOR (vector)->contents[i], Qnil)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
984 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
985 subprefix_stack[submenu_depth++] = prefix; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
986 prefix = entry; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
987 i++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
988 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
989 else if (EQ (XVECTOR (vector)->contents[i], Qlambda)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
990 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
991 prefix = subprefix_stack[--submenu_depth]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
992 i++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
993 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
994 else if (EQ (XVECTOR (vector)->contents[i], Qt)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
995 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
996 prefix = XVECTOR (vector)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
997 i += MENU_ITEMS_PANE_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
998 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
999 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1000 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1001 entry = XVECTOR (vector)->contents[i + MENU_ITEMS_ITEM_VALUE]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1002 /* The EMACS_INT cast avoids a warning. There's no problem |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1003 as long as pointers have enough bits to hold small integers. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1004 if ((int) (EMACS_INT) client_data == i) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1005 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1006 int j; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1007 struct input_event buf; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1008 Lisp_Object frame; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1009 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1010 XSETFRAME (frame, f); |
30178
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1011 buf.kind = MENU_BAR_EVENT; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1012 buf.frame_or_window = frame; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1013 buf.arg = frame; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1014 kbd_buffer_store_event (&buf); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1015 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1016 for (j = 0; j < submenu_depth; j++) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1017 if (!NILP (subprefix_stack[j])) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1018 { |
30178
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1019 buf.kind = MENU_BAR_EVENT; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1020 buf.frame_or_window = frame; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1021 buf.arg = subprefix_stack[j]; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1022 kbd_buffer_store_event (&buf); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1023 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1024 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1025 if (!NILP (prefix)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1026 { |
30178
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1027 buf.kind = MENU_BAR_EVENT; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1028 buf.frame_or_window = frame; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1029 buf.arg = prefix; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1030 kbd_buffer_store_event (&buf); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1031 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1032 |
30178
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1033 buf.kind = MENU_BAR_EVENT; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1034 buf.frame_or_window = frame; |
6d045b9631ad
(menubar_selection_callback): Use the `arg' slot of
Gerd Moellmann <gerd@gnu.org>
parents:
30145
diff
changeset
|
1035 buf.arg = entry; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1036 kbd_buffer_store_event (&buf); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1037 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1038 return; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1039 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1040 i += MENU_ITEMS_ITEM_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1041 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1042 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1043 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1044 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1045 /* Allocate a widget_value, blocking input. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1046 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1047 widget_value * |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1048 xmalloc_widget_value () |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1049 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1050 widget_value *value; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1051 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1052 BLOCK_INPUT; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1053 value = malloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1054 UNBLOCK_INPUT; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1055 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1056 return value; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1057 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1058 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1059 /* This recursively calls free_widget_value on the tree of widgets. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1060 It must free all data that was malloc'ed for these widget_values. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1061 In Emacs, many slots are pointers into the data of Lisp_Strings, and |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1062 must be left alone. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1063 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1064 void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1065 free_menubar_widget_value_tree (wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1066 widget_value *wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1067 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1068 if (! wv) return; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1069 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1070 wv->name = wv->value = wv->key = (char *) 0xDEADBEEF; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1071 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1072 if (wv->contents && (wv->contents != (widget_value*)1)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1073 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1074 free_menubar_widget_value_tree (wv->contents); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1075 wv->contents = (widget_value *) 0xDEADBEEF; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1076 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1077 if (wv->next) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1078 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1079 free_menubar_widget_value_tree (wv->next); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1080 wv->next = (widget_value *) 0xDEADBEEF; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1081 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1082 BLOCK_INPUT; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1083 free_widget_value (wv); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1084 UNBLOCK_INPUT; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1085 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1086 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1087 /* Return a tree of widget_value structures for a menu bar item |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1088 whose event type is ITEM_KEY (with string ITEM_NAME) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1089 and whose contents come from the list of keymaps MAPS. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1090 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1091 static widget_value * |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1092 single_submenu (item_key, item_name, maps) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1093 Lisp_Object item_key, item_name, maps; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1094 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1095 widget_value *wv, *prev_wv, *save_wv, *first_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1096 int i; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1097 int submenu_depth = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1098 Lisp_Object length; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1099 int len; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1100 Lisp_Object *mapvec; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1101 widget_value **submenu_stack; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1102 int previous_items = menu_items_used; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1103 int top_level_items = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1104 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1105 length = Flength (maps); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1106 len = XINT (length); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1107 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1108 /* Convert the list MAPS into a vector MAPVEC. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1109 mapvec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1110 for (i = 0; i < len; i++) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1111 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1112 mapvec[i] = Fcar (maps); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1113 maps = Fcdr (maps); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1114 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1115 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1116 menu_items_n_panes = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1117 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1118 /* Loop over the given keymaps, making a pane for each map. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1119 But don't make a pane that is empty--ignore that map instead. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1120 for (i = 0; i < len; i++) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1121 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1122 if (SYMBOLP (mapvec[i]) |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
1123 || (CONSP (mapvec[i]) && !KEYMAPP (mapvec[i]))) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1124 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1125 /* Here we have a command at top level in the menu bar |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1126 as opposed to a submenu. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1127 top_level_items = 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1128 push_menu_pane (Qnil, Qnil); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1129 push_menu_item (item_name, Qt, item_key, mapvec[i], |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1130 Qnil, Qnil, Qnil, Qnil); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1131 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1132 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1133 single_keymap_panes (mapvec[i], item_name, item_key, 0, 10); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1134 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1135 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1136 /* Create a tree of widget_value objects |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1137 representing the panes and their items. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1138 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1139 submenu_stack |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1140 = (widget_value **) alloca (menu_items_used * sizeof (widget_value *)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1141 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1142 wv->name = "menu"; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1143 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1144 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1145 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1146 first_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1147 save_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1148 prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1149 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1150 /* Loop over all panes and items made during this call |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1151 and construct a tree of widget_value objects. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1152 Ignore the panes and items made by previous calls to |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1153 single_submenu, even though those are also in menu_items. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1154 i = previous_items; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1155 while (i < menu_items_used) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1156 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1157 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1158 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1159 submenu_stack[submenu_depth++] = save_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1160 save_wv = prev_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1161 prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1162 i++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1163 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1164 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1165 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1166 prev_wv = save_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1167 save_wv = submenu_stack[--submenu_depth]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1168 i++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1169 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1170 else if (EQ (XVECTOR (menu_items)->contents[i], Qt) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1171 && submenu_depth != 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1172 i += MENU_ITEMS_PANE_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1173 /* Ignore a nil in the item list. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1174 It's meaningful only for dialog boxes. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1175 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1176 i += 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1177 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1178 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1179 /* Create a new pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1180 Lisp_Object pane_name, prefix; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1181 char *pane_string; |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1182 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1183 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1184 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1185 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1186 #ifndef HAVE_MULTILINGUAL_MENU |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1187 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1188 { |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1189 pane_name = ENCODE_SYSTEM (pane_name); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1190 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1191 } |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1192 #endif |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1193 pane_string = (NILP (pane_name) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1194 ? "" : (char *) XSTRING (pane_name)->data); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1195 /* If there is just one top-level pane, put all its items directly |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1196 under the top-level menu. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1197 if (menu_items_n_panes == 1) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1198 pane_string = ""; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1199 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1200 /* If the pane has a meaningful name, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1201 make the pane a top-level menu item |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1202 with its items as a submenu beneath it. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1203 if (strcmp (pane_string, "")) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1204 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1205 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1206 if (save_wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1207 save_wv->next = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1208 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1209 first_wv->contents = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1210 wv->name = pane_string; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1211 /* Ignore the @ that means "separate pane". |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1212 This is a kludge, but this isn't worth more time. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1213 if (!NILP (prefix) && wv->name[0] == '@') |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1214 wv->name++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1215 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1216 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1217 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1218 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1219 save_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1220 prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1221 i += MENU_ITEMS_PANE_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1222 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1223 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1224 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1225 /* Create a new item within current pane. */ |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1226 Lisp_Object item_name, enable, descrip, def, type, selected; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1227 Lisp_Object help; |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
1228 |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1229 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1230 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1231 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1232 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1233 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1234 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1235 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1236 |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1237 #ifndef HAVE_MULTILINGUAL_MENU |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1238 if (STRING_MULTIBYTE (item_name)) |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1239 { |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1240 item_name = ENCODE_SYSTEM (item_name); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1241 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1242 } |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1243 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1244 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1245 { |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1246 descrip = ENCODE_SYSTEM (descrip); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1247 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1248 } |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1249 #endif /* not HAVE_MULTILINGUAL_MENU */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1250 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1251 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1252 if (prev_wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1253 prev_wv->next = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1254 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1255 save_wv->contents = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1256 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1257 wv->name = (char *) XSTRING (item_name)->data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1258 if (!NILP (descrip)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1259 wv->key = (char *) XSTRING (descrip)->data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1260 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1261 /* The EMACS_INT cast avoids a warning. There's no problem |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1262 as long as pointers have enough bits to hold small integers. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1263 wv->call_data = (!NILP (def) ? (void *) (EMACS_INT) i : 0); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1264 wv->enabled = !NILP (enable); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1265 |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1266 if (NILP (type)) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1267 wv->button_type = BUTTON_TYPE_NONE; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1268 else if (EQ (type, QCradio)) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1269 wv->button_type = BUTTON_TYPE_RADIO; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1270 else if (EQ (type, QCtoggle)) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1271 wv->button_type = BUTTON_TYPE_TOGGLE; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1272 else |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1273 abort (); |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1274 |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1275 wv->selected = !NILP (selected); |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1276 if (!STRINGP (help)) |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1277 help = Qnil; |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1278 |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1279 wv->help = help; |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
1280 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1281 prev_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1282 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1283 i += MENU_ITEMS_ITEM_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1284 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1285 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1286 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1287 /* If we have just one "menu item" |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1288 that was originally a button, return it by itself. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1289 if (top_level_items && first_wv->contents && first_wv->contents->next == 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1290 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1291 wv = first_wv->contents; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1292 free_widget_value (first_wv); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1293 return wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1294 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1295 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1296 return first_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1297 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1298 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1299 /* Set the contents of the menubar widgets of frame F. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1300 The argument FIRST_TIME is currently ignored; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1301 it is set the first time this is called, from initialize_frame_menubar. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1302 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1303 void |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1304 set_frame_menubar (f, first_time, deep_p) |
13434 | 1305 FRAME_PTR f; |
1306 int first_time; | |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1307 int deep_p; |
13434 | 1308 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1309 HMENU menubar_widget = f->output_data.w32->menubar_widget; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1310 Lisp_Object items; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1311 widget_value *wv, *first_wv, *prev_wv = 0; |
13434 | 1312 int i; |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
1313 |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1314 /* We must not change the menubar when actually in use. */ |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1315 if (f->output_data.w32->menubar_active) |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1316 return; |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1317 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1318 XSETFRAME (Vmenu_updating_frame, f); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1319 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1320 if (! menubar_widget) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1321 deep_p = 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1322 else if (pending_menu_activation && !deep_p) |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1323 deep_p = 1; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1324 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1325 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1326 wv->name = "menubar"; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1327 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1328 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1329 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1330 first_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1331 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1332 if (deep_p) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1333 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1334 /* Make a widget-value tree representing the entire menu trees. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1335 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1336 struct buffer *prev = current_buffer; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1337 Lisp_Object buffer; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1338 int specpdl_count = specpdl_ptr - specpdl; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1339 int previous_menu_items_used = f->menu_bar_items_used; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1340 Lisp_Object *previous_items |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1341 = (Lisp_Object *) alloca (previous_menu_items_used |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1342 * sizeof (Lisp_Object)); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1343 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1344 /* If we are making a new widget, its contents are empty, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1345 do always reinitialize them. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1346 if (! menubar_widget) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1347 previous_menu_items_used = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1348 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1349 buffer = XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1350 specbind (Qinhibit_quit, Qt); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1351 /* Don't let the debugger step into this code |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1352 because it is not reentrant. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1353 specbind (Qdebug_on_next_call, Qnil); |
15276 | 1354 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1355 record_unwind_protect (Fset_match_data, Fmatch_data (Qnil, Qnil)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1356 if (NILP (Voverriding_local_map_menu_flag)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1357 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1358 specbind (Qoverriding_terminal_local_map, Qnil); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1359 specbind (Qoverriding_local_map, Qnil); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1360 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1361 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1362 set_buffer_internal_1 (XBUFFER (buffer)); |
15276 | 1363 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1364 /* Run the Lucid hook. */ |
36313
77093a87f2de
* w32menu.c (set_frame_menubar): Run activate-menu-bar-hook with
Jason Rumney <jasonr@gnu.org>
parents:
33971
diff
changeset
|
1365 safe_run_hooks (Qactivate_menubar_hook); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1366 /* If it has changed current-menubar from previous value, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1367 really recompute the menubar from the value. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1368 if (! NILP (Vlucid_menu_bar_dirty_flag)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1369 call0 (Qrecompute_lucid_menubar); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1370 safe_run_hooks (Qmenu_bar_update_hook); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1371 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1372 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1373 items = FRAME_MENU_BAR_ITEMS (f); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1374 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1375 inhibit_garbage_collection (); |
15276 | 1376 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1377 /* Save the frame's previous menu bar contents data. */ |
39507
24530f82048e
(set_frame_menubar): Take into account that
Andrew Innes <andrewi@gnu.org>
parents:
38371
diff
changeset
|
1378 if (previous_menu_items_used) |
24530f82048e
(set_frame_menubar): Take into account that
Andrew Innes <andrewi@gnu.org>
parents:
38371
diff
changeset
|
1379 bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items, |
24530f82048e
(set_frame_menubar): Take into account that
Andrew Innes <andrewi@gnu.org>
parents:
38371
diff
changeset
|
1380 previous_menu_items_used * sizeof (Lisp_Object)); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1381 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1382 /* Fill in the current menu bar contents. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1383 menu_items = f->menu_bar_vector; |
39507
24530f82048e
(set_frame_menubar): Take into account that
Andrew Innes <andrewi@gnu.org>
parents:
38371
diff
changeset
|
1384 menu_items_allocated = VECTORP (menu_items) ? ASIZE (menu_items) : 0; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1385 init_menu_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1386 for (i = 0; i < XVECTOR (items)->size; i += 4) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1387 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1388 Lisp_Object key, string, maps; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1389 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1390 key = XVECTOR (items)->contents[i]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1391 string = XVECTOR (items)->contents[i + 1]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1392 maps = XVECTOR (items)->contents[i + 2]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1393 if (NILP (string)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1394 break; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1395 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1396 wv = single_submenu (key, string, maps); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1397 if (prev_wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1398 prev_wv->next = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1399 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1400 first_wv->contents = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1401 /* Don't set wv->name here; GC during the loop might relocate it. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1402 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1403 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1404 prev_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1405 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1406 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1407 finish_menu_items (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1408 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1409 set_buffer_internal_1 (prev); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1410 unbind_to (specpdl_count, Qnil); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1411 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1412 /* If there has been no change in the Lisp-level contents |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1413 of the menu bar, skip redisplaying it. Just exit. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1414 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1415 for (i = 0; i < previous_menu_items_used; i++) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1416 if (menu_items_used == i |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1417 || (!EQ (previous_items[i], XVECTOR (menu_items)->contents[i]))) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1418 break; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1419 if (i == menu_items_used && i == previous_menu_items_used && i != 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1420 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1421 free_menubar_widget_value_tree (first_wv); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1422 menu_items = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1423 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1424 return; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1425 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1426 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1427 /* Now GC cannot happen during the lifetime of the widget_value, |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
1428 so it's safe to store data from a Lisp_String, as long as |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
1429 local copies are made when the actual menu is created. |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
1430 Windows takes care of this for normal string items, but |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
1431 not for owner-drawn items or additional item-info. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1432 wv = first_wv->contents; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1433 for (i = 0; i < XVECTOR (items)->size; i += 4) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1434 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1435 Lisp_Object string; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1436 string = XVECTOR (items)->contents[i + 1]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1437 if (NILP (string)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1438 break; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1439 wv->name = (char *) XSTRING (string)->data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1440 wv = wv->next; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1441 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1442 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1443 f->menu_bar_vector = menu_items; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1444 f->menu_bar_items_used = menu_items_used; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1445 menu_items = Qnil; |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1446 } |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1447 else |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1448 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1449 /* Make a widget-value tree containing |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1450 just the top level menu bar strings. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1451 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1452 items = FRAME_MENU_BAR_ITEMS (f); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1453 for (i = 0; i < XVECTOR (items)->size; i += 4) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1454 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1455 Lisp_Object string; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1456 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1457 string = XVECTOR (items)->contents[i + 1]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1458 if (NILP (string)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1459 break; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1460 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1461 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1462 wv->name = (char *) XSTRING (string)->data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1463 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1464 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1465 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1466 /* This prevents lwlib from assuming this |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1467 menu item is really supposed to be empty. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1468 /* The EMACS_INT cast avoids a warning. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1469 This value just has to be different from small integers. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1470 wv->call_data = (void *) (EMACS_INT) (-1); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1471 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1472 if (prev_wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1473 prev_wv->next = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1474 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1475 first_wv->contents = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1476 prev_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1477 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1478 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1479 /* Forget what we thought we knew about what is in the |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1480 detailed contents of the menu bar menus. |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1481 Changing the top level always destroys the contents. */ |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1482 f->menu_bar_items_used = 0; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1483 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1484 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1485 /* Create or update the menu bar widget. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1486 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1487 BLOCK_INPUT; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1488 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1489 if (menubar_widget) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1490 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1491 /* Empty current menubar, rather than creating a fresh one. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1492 while (DeleteMenu (menubar_widget, 0, MF_BYPOSITION)) |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1493 ; |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1494 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1495 else |
13434 | 1496 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1497 menubar_widget = CreateMenu (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1498 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1499 fill_in_menu (menubar_widget, first_wv->contents); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1500 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1501 free_menubar_widget_value_tree (first_wv); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1502 |
13434 | 1503 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1504 HMENU old_widget = f->output_data.w32->menubar_widget; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1505 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1506 f->output_data.w32->menubar_widget = menubar_widget; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1507 SetMenu (FRAME_W32_WINDOW (f), f->output_data.w32->menubar_widget); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1508 /* Causes flicker when menu bar is updated |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1509 DrawMenuBar (FRAME_W32_WINDOW (f)); */ |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1510 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1511 /* Force the window size to be recomputed so that the frame's text |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1512 area remains the same, if menubar has just been created. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1513 if (old_widget == NULL) |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1514 x_set_window_size (f, 0, FRAME_WIDTH (f), FRAME_HEIGHT (f)); |
13434 | 1515 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1516 |
13434 | 1517 UNBLOCK_INPUT; |
1518 } | |
1519 | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1520 /* Called from Fx_create_frame to create the initial menubar of a frame |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1521 before it is mapped, so that the window is mapped with the menubar already |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1522 there instead of us tacking it on later and thrashing the window after it |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1523 is visible. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1524 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1525 void |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1526 initialize_frame_menubar (f) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1527 FRAME_PTR f; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1528 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1529 /* This function is called before the first chance to redisplay |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1530 the frame. It has to be, so the frame will have the right size. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1531 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1532 set_frame_menubar (f, 1, 1); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1533 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1534 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1535 /* Get rid of the menu bar of frame F, and free its storage. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1536 This is used when deleting a frame, and when turning off the menu bar. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1537 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1538 void |
13434 | 1539 free_frame_menubar (f) |
1540 FRAME_PTR f; | |
1541 { | |
1542 BLOCK_INPUT; | |
1543 | |
1544 { | |
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15276
diff
changeset
|
1545 HMENU old = GetMenu (FRAME_W32_WINDOW (f)); |
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15276
diff
changeset
|
1546 SetMenu (FRAME_W32_WINDOW (f), NULL); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1547 f->output_data.w32->menubar_widget = NULL; |
13434 | 1548 DestroyMenu (old); |
1549 } | |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1550 |
13434 | 1551 UNBLOCK_INPUT; |
1552 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1553 |
13434 | 1554 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1555 /* w32_menu_show actually displays a menu using the panes and items in |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1556 menu_items and returns the value selected from it; we assume input |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1557 is blocked by the caller. */ |
13434 | 1558 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1559 /* F is the frame the menu is for. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1560 X and Y are the frame-relative specified position, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1561 relative to the inside upper left corner of the frame F. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1562 FOR_CLICK is nonzero if this menu was invoked for a mouse click. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1563 KEYMAPS is 1 if this menu was specified with keymaps; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1564 in that case, we return a list containing the chosen item's value |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1565 and perhaps also the pane's prefix. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1566 TITLE is the specified menu title. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1567 ERROR is a place to store an error message string in case of failure. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1568 (We return nil on failure, but the value doesn't actually matter.) */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1569 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1570 static Lisp_Object |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1571 w32_menu_show (f, x, y, for_click, keymaps, title, error) |
13434 | 1572 FRAME_PTR f; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1573 int x; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1574 int y; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1575 int for_click; |
13434 | 1576 int keymaps; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1577 Lisp_Object title; |
13434 | 1578 char **error; |
1579 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1580 int i; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1581 int menu_item_selection; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1582 HMENU menu; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1583 POINT pos; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1584 widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1585 widget_value **submenu_stack |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1586 = (widget_value **) alloca (menu_items_used * sizeof (widget_value *)); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1587 Lisp_Object *subprefix_stack |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1588 = (Lisp_Object *) alloca (menu_items_used * sizeof (Lisp_Object)); |
13434 | 1589 int submenu_depth = 0; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1590 int first_pane; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1591 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1592 *error = NULL; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1593 |
13434 | 1594 if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) |
1595 { | |
1596 *error = "Empty menu"; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1597 return Qnil; |
13434 | 1598 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1599 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1600 /* Create a tree of widget_value objects |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1601 representing the panes and their items. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1602 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1603 wv->name = "menu"; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1604 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1605 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1606 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1607 first_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1608 first_pane = 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1609 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1610 /* Loop over all panes and items, filling in the tree. */ |
13434 | 1611 i = 0; |
1612 while (i < menu_items_used) | |
1613 { | |
1614 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) | |
1615 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1616 submenu_stack[submenu_depth++] = save_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1617 save_wv = prev_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1618 prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1619 first_pane = 1; |
13434 | 1620 i++; |
1621 } | |
1622 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) | |
1623 { | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1624 prev_wv = save_wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1625 save_wv = submenu_stack[--submenu_depth]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1626 first_pane = 0; |
13434 | 1627 i++; |
1628 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1629 else if (EQ (XVECTOR (menu_items)->contents[i], Qt) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1630 && submenu_depth != 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1631 i += MENU_ITEMS_PANE_LENGTH; |
13434 | 1632 /* Ignore a nil in the item list. |
1633 It's meaningful only for dialog boxes. */ | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1634 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1635 i += 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1636 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1637 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1638 /* Create a new pane. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1639 Lisp_Object pane_name, prefix; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1640 char *pane_string; |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1641 pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1642 prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1643 #ifndef HAVE_MULTILINGUAL_MENU |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1644 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1645 { |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1646 pane_name = ENCODE_SYSTEM (pane_name); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1647 AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1648 } |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1649 #endif |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1650 pane_string = (NILP (pane_name) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1651 ? "" : (char *) XSTRING (pane_name)->data); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1652 /* If there is just one top-level pane, put all its items directly |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1653 under the top-level menu. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1654 if (menu_items_n_panes == 1) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1655 pane_string = ""; |
13434 | 1656 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1657 /* If the pane has a meaningful name, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1658 make the pane a top-level menu item |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1659 with its items as a submenu beneath it. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1660 if (!keymaps && strcmp (pane_string, "")) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1661 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1662 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1663 if (save_wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1664 save_wv->next = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1665 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1666 first_wv->contents = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1667 wv->name = pane_string; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1668 if (keymaps && !NILP (prefix)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1669 wv->name++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1670 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1671 wv->enabled = 1; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1672 wv->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1673 save_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1674 prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1675 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1676 else if (first_pane) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1677 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1678 save_wv = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1679 prev_wv = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1680 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1681 first_pane = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1682 i += MENU_ITEMS_PANE_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1683 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1684 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1685 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1686 /* Create a new item within current pane. */ |
27896
75f296b1a872
(single_submenu): Set up help string.
Jason Rumney <jasonr@gnu.org>
parents:
27400
diff
changeset
|
1687 Lisp_Object item_name, enable, descrip, def, type, selected, help; |
75f296b1a872
(single_submenu): Set up help string.
Jason Rumney <jasonr@gnu.org>
parents:
27400
diff
changeset
|
1688 |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1689 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1690 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1691 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1692 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1693 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1694 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1695 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1696 |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1697 #ifndef HAVE_MULTILINGUAL_MENU |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1698 if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1699 { |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1700 item_name = ENCODE_SYSTEM (item_name); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1701 AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1702 } |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1703 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) |
40119
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1704 { |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1705 descrip = ENCODE_SYSTEM (descrip); |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1706 AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1707 } |
bf81460680f2
(single_submenu, w32_menu_show) [!HAVE_MULTILINGUAL_MENU]:
Jason Rumney <jasonr@gnu.org>
parents:
39690
diff
changeset
|
1708 #endif /* not HAVE_MULTILINGUAL_MENU */ |
13434 | 1709 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1710 wv = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1711 if (prev_wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1712 prev_wv->next = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1713 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1714 save_wv->contents = wv; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1715 wv->name = (char *) XSTRING (item_name)->data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1716 if (!NILP (descrip)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1717 wv->key = (char *) XSTRING (descrip)->data; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1718 wv->value = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1719 /* Use the contents index as call_data, since we are |
41251
e6612d08452f
(w32_menu_show, push_menu_pane): Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
41108
diff
changeset
|
1720 restricted to 16-bits. */ |
22737
41e01b5de7cc
(w32_menu_show): Set widget call_data to 0 if definition is nil.
Andrew Innes <andrewi@gnu.org>
parents:
21741
diff
changeset
|
1721 wv->call_data = !NILP (def) ? (void *) (EMACS_INT) i : 0; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1722 wv->enabled = !NILP (enable); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1723 |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1724 if (NILP (type)) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1725 wv->button_type = BUTTON_TYPE_NONE; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1726 else if (EQ (type, QCtoggle)) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1727 wv->button_type = BUTTON_TYPE_TOGGLE; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1728 else if (EQ (type, QCradio)) |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1729 wv->button_type = BUTTON_TYPE_RADIO; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1730 else |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1731 abort (); |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1732 |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1733 wv->selected = !NILP (selected); |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1734 if (!STRINGP (help)) |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1735 help = Qnil; |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1736 |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
1737 wv->help = help; |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
1738 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1739 prev_wv = wv; |
13434 | 1740 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1741 i += MENU_ITEMS_ITEM_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1742 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1743 } |
13434 | 1744 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1745 /* Deal with the title, if it is non-nil. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1746 if (!NILP (title)) |
13434 | 1747 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1748 widget_value *wv_title = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1749 widget_value *wv_sep = xmalloc_widget_value (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1750 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1751 /* Maybe replace this separator with a bitmap or owner-draw item |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1752 so that it looks better. Having two separators looks odd. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1753 wv_sep->name = "--"; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1754 wv_sep->next = first_wv->contents; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1755 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1756 #ifndef HAVE_MULTILINGUAL_MENU |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1757 if (STRING_MULTIBYTE (title)) |
29320
33aa00975055
(single_submenu, w32_menu_show): Call ENCODE_SYSTEM on menu strings.
Jason Rumney <jasonr@gnu.org>
parents:
28275
diff
changeset
|
1758 title = ENCODE_SYSTEM (title); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1759 #endif |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1760 wv_title->name = (char *) XSTRING (title)->data; |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
1761 wv_title->enabled = TRUE; |
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
1762 wv_title->title = TRUE; |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1763 wv_title->button_type = BUTTON_TYPE_NONE; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1764 wv_title->next = wv_sep; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1765 first_wv->contents = wv_title; |
13434 | 1766 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1767 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1768 /* Actually create the menu. */ |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
1769 current_popup_menu = menu = CreatePopupMenu (); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1770 fill_in_menu (menu, first_wv->contents); |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
1771 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1772 /* Adjust coordinates to be root-window-relative. */ |
13434 | 1773 pos.x = x; |
1774 pos.y = y; | |
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15276
diff
changeset
|
1775 ClientToScreen (FRAME_W32_WINDOW (f), &pos); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1776 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1777 /* No selection has been chosen yet. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1778 menu_item_selection = 0; |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1779 |
13434 | 1780 /* Display the menu. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1781 menu_item_selection = SendMessage (FRAME_W32_WINDOW (f), |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1782 WM_EMACS_TRACKPOPUPMENU, |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1783 (WPARAM)menu, (LPARAM)&pos); |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1784 |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1785 /* Clean up extraneous mouse events which might have been generated |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1786 during the call. */ |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1787 discard_mouse_events (); |
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1788 |
30238
4a3b87cc6f04
(w32_menu_show): Call free_menubar_widget_value_tree after menu is
Jason Rumney <jasonr@gnu.org>
parents:
30178
diff
changeset
|
1789 /* Free the widget_value objects we used to specify the contents. */ |
4a3b87cc6f04
(w32_menu_show): Call free_menubar_widget_value_tree after menu is
Jason Rumney <jasonr@gnu.org>
parents:
30178
diff
changeset
|
1790 free_menubar_widget_value_tree (first_wv); |
4a3b87cc6f04
(w32_menu_show): Call free_menubar_widget_value_tree after menu is
Jason Rumney <jasonr@gnu.org>
parents:
30178
diff
changeset
|
1791 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1792 DestroyMenu (menu); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1793 |
13434 | 1794 /* Find the selected item, and its pane, to return |
1795 the proper value. */ | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1796 if (menu_item_selection != 0) |
13434 | 1797 { |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1798 Lisp_Object prefix, entry; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1799 |
38371
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
1800 prefix = entry = Qnil; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1801 i = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1802 while (i < menu_items_used) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1803 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1804 if (EQ (XVECTOR (menu_items)->contents[i], Qnil)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1805 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1806 subprefix_stack[submenu_depth++] = prefix; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1807 prefix = entry; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1808 i++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1809 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1810 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1811 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1812 prefix = subprefix_stack[--submenu_depth]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1813 i++; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1814 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1815 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1816 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1817 prefix |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1818 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1819 i += MENU_ITEMS_PANE_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1820 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1821 /* Ignore a nil in the item list. |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1822 It's meaningful only for dialog boxes. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1823 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1824 i += 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1825 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1826 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1827 entry |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1828 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_VALUE]; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1829 if (menu_item_selection == i) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1830 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1831 if (keymaps != 0) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1832 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1833 int j; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1834 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1835 entry = Fcons (entry, Qnil); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1836 if (!NILP (prefix)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1837 entry = Fcons (prefix, entry); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1838 for (j = submenu_depth - 1; j >= 0; j--) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1839 if (!NILP (subprefix_stack[j])) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1840 entry = Fcons (subprefix_stack[j], entry); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1841 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1842 return entry; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1843 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1844 i += MENU_ITEMS_ITEM_LENGTH; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1845 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1846 } |
13434 | 1847 } |
19711
dc9694ee3f70
(init_menu_items): Disable code.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16884
diff
changeset
|
1848 |
13434 | 1849 return Qnil; |
1850 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1851 |
13434 | 1852 |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
1853 #ifdef HAVE_DIALOGS |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1854 static char * button_names [] = { |
13434 | 1855 "button1", "button2", "button3", "button4", "button5", |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1856 "button6", "button7", "button8", "button9", "button10" }; |
13434 | 1857 |
1858 static Lisp_Object | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1859 w32_dialog_show (f, keymaps, title, error) |
13434 | 1860 FRAME_PTR f; |
1861 int keymaps; | |
1862 Lisp_Object title; | |
1863 char **error; | |
1864 { | |
1865 int i, nb_buttons=0; | |
1866 char dialog_name[6]; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1867 int menu_item_selection; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1868 |
38371
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
1869 widget_value *wv, *first_wv = 0, *prev_wv = 0; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1870 |
13434 | 1871 /* Number of elements seen so far, before boundary. */ |
1872 int left_count = 0; | |
1873 /* 1 means we've seen the boundary between left-hand elts and right-hand. */ | |
1874 int boundary_seen = 0; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1875 |
13434 | 1876 *error = NULL; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1877 |
13434 | 1878 if (menu_items_n_panes > 1) |
1879 { | |
1880 *error = "Multiple panes in dialog box"; | |
1881 return Qnil; | |
1882 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1883 |
13434 | 1884 /* Create a tree of widget_value objects |
1885 representing the text label and buttons. */ | |
1886 { | |
1887 Lisp_Object pane_name, prefix; | |
1888 char *pane_string; | |
1889 pane_name = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_NAME]; | |
1890 prefix = XVECTOR (menu_items)->contents[MENU_ITEMS_PANE_PREFIX]; | |
1891 pane_string = (NILP (pane_name) | |
1892 ? "" : (char *) XSTRING (pane_name)->data); | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1893 prev_wv = xmalloc_widget_value (); |
13434 | 1894 prev_wv->value = pane_string; |
1895 if (keymaps && !NILP (prefix)) | |
1896 prev_wv->name++; | |
1897 prev_wv->enabled = 1; | |
1898 prev_wv->name = "message"; | |
1899 first_wv = prev_wv; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1900 |
13434 | 1901 /* Loop over all panes and items, filling in the tree. */ |
1902 i = MENU_ITEMS_PANE_LENGTH; | |
1903 while (i < menu_items_used) | |
1904 { | |
1905 | |
1906 /* Create a new item within current pane. */ | |
27896
75f296b1a872
(single_submenu): Set up help string.
Jason Rumney <jasonr@gnu.org>
parents:
27400
diff
changeset
|
1907 Lisp_Object item_name, enable, descrip, help; |
75f296b1a872
(single_submenu): Set up help string.
Jason Rumney <jasonr@gnu.org>
parents:
27400
diff
changeset
|
1908 |
13434 | 1909 item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; |
1910 enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; | |
1911 descrip | |
1912 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; | |
27896
75f296b1a872
(single_submenu): Set up help string.
Jason Rumney <jasonr@gnu.org>
parents:
27400
diff
changeset
|
1913 help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; |
13434 | 1914 |
1915 if (NILP (item_name)) | |
1916 { | |
1917 free_menubar_widget_value_tree (first_wv); | |
1918 *error = "Submenu in dialog items"; | |
1919 return Qnil; | |
1920 } | |
1921 if (EQ (item_name, Qquote)) | |
1922 { | |
1923 /* This is the boundary between left-side elts | |
1924 and right-side elts. Stop incrementing right_count. */ | |
1925 boundary_seen = 1; | |
1926 i++; | |
1927 continue; | |
1928 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1929 if (nb_buttons >= 9) |
13434 | 1930 { |
1931 free_menubar_widget_value_tree (first_wv); | |
1932 *error = "Too many dialog items"; | |
1933 return Qnil; | |
1934 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1935 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1936 wv = xmalloc_widget_value (); |
13434 | 1937 prev_wv->next = wv; |
1938 wv->name = (char *) button_names[nb_buttons]; | |
1939 if (!NILP (descrip)) | |
1940 wv->key = (char *) XSTRING (descrip)->data; | |
1941 wv->value = (char *) XSTRING (item_name)->data; | |
1942 wv->call_data = (void *) &XVECTOR (menu_items)->contents[i]; | |
1943 wv->enabled = !NILP (enable); | |
1944 prev_wv = wv; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1945 |
13434 | 1946 if (! boundary_seen) |
1947 left_count++; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1948 |
13434 | 1949 nb_buttons++; |
1950 i += MENU_ITEMS_ITEM_LENGTH; | |
1951 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1952 |
13434 | 1953 /* If the boundary was not specified, |
1954 by default put half on the left and half on the right. */ | |
1955 if (! boundary_seen) | |
1956 left_count = nb_buttons - nb_buttons / 2; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1957 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1958 wv = xmalloc_widget_value (); |
13434 | 1959 wv->name = dialog_name; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1960 |
13434 | 1961 /* Dialog boxes use a really stupid name encoding |
1962 which specifies how many buttons to use | |
1963 and how many buttons are on the right. | |
1964 The Q means something also. */ | |
1965 dialog_name[0] = 'Q'; | |
1966 dialog_name[1] = '0' + nb_buttons; | |
1967 dialog_name[2] = 'B'; | |
1968 dialog_name[3] = 'R'; | |
1969 /* Number of buttons to put on the right. */ | |
1970 dialog_name[4] = '0' + nb_buttons - left_count; | |
1971 dialog_name[5] = 0; | |
1972 wv->contents = first_wv; | |
1973 first_wv = wv; | |
1974 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1975 |
13434 | 1976 /* Actually create the dialog. */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1977 dialog_id = widget_id_tick++; |
13434 | 1978 menu = lw_create_widget (first_wv->name, "dialog", dialog_id, first_wv, |
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15276
diff
changeset
|
1979 f->output_data.w32->widget, 1, 0, |
13434 | 1980 dialog_selection_callback, 0); |
32988
c3435dc00ed7
* lisp.h (KEYMAPP): New macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32671
diff
changeset
|
1981 lw_modify_all_widgets (dialog_id, first_wv->contents, TRUE); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1982 |
13434 | 1983 /* Free the widget_value objects we used to specify the contents. */ |
1984 free_menubar_widget_value_tree (first_wv); | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1985 |
13434 | 1986 /* No selection has been chosen yet. */ |
1987 menu_item_selection = 0; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1988 |
13434 | 1989 /* Display the menu. */ |
1990 lw_pop_up_all_widgets (dialog_id); | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1991 popup_activated_flag = 1; |
13434 | 1992 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1993 /* Process events that apply to the menu. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1994 popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), dialog_id); |
13434 | 1995 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1996 lw_destroy_all_widgets (dialog_id); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
1997 |
13434 | 1998 /* Find the selected item, and its pane, to return |
1999 the proper value. */ | |
2000 if (menu_item_selection != 0) | |
2001 { | |
2002 Lisp_Object prefix; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2003 |
13434 | 2004 prefix = Qnil; |
2005 i = 0; | |
2006 while (i < menu_items_used) | |
2007 { | |
2008 Lisp_Object entry; | |
2009 | |
2010 if (EQ (XVECTOR (menu_items)->contents[i], Qt)) | |
2011 { | |
2012 prefix | |
2013 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; | |
2014 i += MENU_ITEMS_PANE_LENGTH; | |
2015 } | |
2016 else | |
2017 { | |
2018 entry | |
2019 = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_VALUE]; | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2020 if (menu_item_selection == i) |
13434 | 2021 { |
2022 if (keymaps != 0) | |
2023 { | |
2024 entry = Fcons (entry, Qnil); | |
2025 if (!NILP (prefix)) | |
2026 entry = Fcons (prefix, entry); | |
2027 } | |
2028 return entry; | |
2029 } | |
2030 i += MENU_ITEMS_ITEM_LENGTH; | |
2031 } | |
2032 } | |
2033 } | |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2034 |
13434 | 2035 return Qnil; |
2036 } | |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2037 #endif /* HAVE_DIALOGS */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2038 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2039 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2040 /* Is this item a separator? */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2041 static int |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2042 name_is_separator (name) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2043 char *name; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2044 { |
38371
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2045 char *start = name; |
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2046 |
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2047 /* Check if name string consists of only dashes ('-'). */ |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2048 while (*name == '-') name++; |
38371
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2049 /* Separators can also be of the form "--:TripleSuperMegaEtched" |
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2050 or "--deep-shadow". We don't implement them yet, se we just treat |
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2051 them like normal separators. */ |
eb915f0b1d6e
(menubar_selection_callback, w32_menu_show): Initialize `entry' to nil.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
36677
diff
changeset
|
2052 return (*name == '\0' || start + 2 == name); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2053 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2054 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2055 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2056 /* Indicate boundary between left and right. */ |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2057 static int |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2058 add_left_right_boundary (HMENU menu) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2059 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2060 return AppendMenu (menu, MF_MENUBARBREAK, 0, NULL); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2061 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2062 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2063 static int |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2064 add_menu_item (HMENU menu, widget_value *wv, HMENU item) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2065 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2066 UINT fuFlags; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2067 char *out_string; |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2068 int return_value; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2069 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2070 if (name_is_separator (wv->name)) |
33971
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
2071 { |
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
2072 fuFlags = MF_SEPARATOR; |
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
2073 out_string = NULL; |
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
2074 } |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2075 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2076 { |
22750
b38cb406ed80
(add_menu_item): Draw menu items like titles if call_data is 0.
Andrew Innes <andrewi@gnu.org>
parents:
22737
diff
changeset
|
2077 if (wv->enabled) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2078 fuFlags = MF_STRING; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2079 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2080 fuFlags = MF_STRING | MF_GRAYED; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2081 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2082 if (wv->key != NULL) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2083 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2084 out_string = alloca (strlen (wv->name) + strlen (wv->key) + 2); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2085 strcpy (out_string, wv->name); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2086 strcat (out_string, "\t"); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2087 strcat (out_string, wv->key); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2088 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2089 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2090 out_string = wv->name; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2091 |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2092 if (item != NULL) |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2093 fuFlags = MF_POPUP; |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2094 else if (wv->title || wv->call_data == 0) |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2095 { |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2096 /* Only use MF_OWNERDRAW if GetMenuItemInfo is usable, since |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2097 we can't deallocate the memory otherwise. */ |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2098 if (get_menu_item_info) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2099 { |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2100 out_string = (char *) LocalAlloc (LPTR, strlen (wv->name) + 1); |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2101 #ifdef MENU_DEBUG |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2102 DebPrint ("Menu: allocing %ld for owner-draw", info.dwItemData); |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2103 #endif |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2104 strcpy (out_string, wv->name); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2105 fuFlags = MF_OWNERDRAW | MF_DISABLED; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2106 } |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2107 else |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2108 fuFlags = MF_DISABLED; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2109 } |
41637
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2110 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2111 /* Draw radio buttons and tickboxes. */ |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2112 else if (wv->selected && (wv->button_type == BUTTON_TYPE_TOGGLE || |
41108
ef7a153a2c68
(add-menu-item): Make help_echo and radio buttons
Jason Rumney <jasonr@gnu.org>
parents:
40962
diff
changeset
|
2113 wv->button_type == BUTTON_TYPE_RADIO)) |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2114 fuFlags |= MF_CHECKED; |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2115 else |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2116 fuFlags |= MF_UNCHECKED; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2117 } |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2118 |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2119 return_value = |
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2120 AppendMenu (menu, |
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2121 fuFlags, |
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2122 item != NULL ? (UINT) item : (UINT) wv->call_data, |
33971
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
2123 out_string ); |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2124 |
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2125 /* This must be done after the menu item is created. */ |
41108
ef7a153a2c68
(add-menu-item): Make help_echo and radio buttons
Jason Rumney <jasonr@gnu.org>
parents:
40962
diff
changeset
|
2126 if (!wv->title && wv->call_data != 0) |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2127 { |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2128 if (set_menu_item_info) |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2129 { |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2130 MENUITEMINFO info; |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2131 bzero (&info, sizeof (info)); |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2132 info.cbSize = sizeof (info); |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2133 info.fMask = MIIM_DATA; |
32671
bbd3be4db5f2
(add_menu_item): Do not use MF_OWNERDRAW for titles, as it has stopped working.
Jason Rumney <jasonr@gnu.org>
parents:
31114
diff
changeset
|
2134 |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2135 /* Set help string for menu item. Leave it as a Lisp_Object |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2136 until it is ready to be displayed, since GC can happen while |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2137 menus are active. */ |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2138 if (wv->help) |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2139 info.dwItemData = (DWORD) wv->help; |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2140 |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2141 if (wv->button_type == BUTTON_TYPE_RADIO) |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2142 { |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2143 /* CheckMenuRadioItem allows us to differentiate TOGGLE and |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2144 RADIO items, but is not available on NT 3.51 and earlier. */ |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2145 info.fMask |= MIIM_TYPE | MIIM_STATE; |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2146 info.fType = MFT_RADIOCHECK | MFT_STRING; |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2147 info.dwTypeData = out_string; |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2148 info.fState = wv->selected ? MFS_CHECKED : MFS_UNCHECKED; |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2149 } |
33971
c33b80a45f6a
(add_menu_item): Reset menu item text when changing type to radio button.
Jason Rumney <jasonr@gnu.org>
parents:
32988
diff
changeset
|
2150 |
36677
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2151 set_menu_item_info (menu, |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2152 item != NULL ? (UINT) item : (UINT) wv->call_data, |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2153 FALSE, &info); |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2154 } |
eb7af01c7f27
(add_menu_item): Fix problems with using ownerdraw for
Andrew Innes <andrewi@gnu.org>
parents:
36313
diff
changeset
|
2155 } |
27932
a590f8d0dbd2
[HAVE_BOXES]: Remove #undef.
Jason Rumney <jasonr@gnu.org>
parents:
27896
diff
changeset
|
2156 return return_value; |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2157 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2158 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2159 /* Construct native Windows menu(bar) based on widget_value tree. */ |
31114
cd392fdf0e9f
Include keyboard.h before frame.h. Fix compile
Andrew Innes <andrewi@gnu.org>
parents:
30989
diff
changeset
|
2160 int |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2161 fill_in_menu (HMENU menu, widget_value *wv) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2162 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2163 int items_added = 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2164 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2165 for ( ; wv != NULL; wv = wv->next) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2166 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2167 if (wv->contents) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2168 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2169 HMENU sub_menu = CreatePopupMenu (); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2170 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2171 if (sub_menu == NULL) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2172 return 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2173 |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2174 if (!fill_in_menu (sub_menu, wv->contents) || |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2175 !add_menu_item (menu, wv, sub_menu)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2176 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2177 DestroyMenu (sub_menu); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2178 return 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2179 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2180 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2181 else |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2182 { |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2183 if (!add_menu_item (menu, wv, NULL)) |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2184 return 0; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2185 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2186 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2187 return 1; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2188 } |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2189 |
27400
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2190 int |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2191 popup_activated () |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2192 { |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2193 /* popup_activated_flag not actually used on W32 */ |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2194 return 0; |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2195 } |
da3ee40952bf
Add skeleton support for help strings on menus.
Jason Rumney <jasonr@gnu.org>
parents:
26729
diff
changeset
|
2196 |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2197 /* Display help string for currently pointed to menu item. Not |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2198 supported on NT 3.51 and earlier, as GetMenuItemInfo is not |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2199 available. */ |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2200 void |
41646
258fa72efab7
(w32_menu_display_help): Actually add the new argument
Andrew Innes <andrewi@gnu.org>
parents:
41637
diff
changeset
|
2201 w32_menu_display_help (HWND owner, HMENU menu, UINT item, UINT flags) |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2202 { |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2203 if (get_menu_item_info) |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2204 { |
41637
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2205 struct frame *f = x_window_to_frame (&one_w32_display_info, owner); |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2206 Lisp_Object frame, help; |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2207 |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2208 // No help echo on owner-draw menu items. |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2209 if (flags & MF_OWNERDRAW || flags & MF_POPUP) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2210 help = Qnil; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2211 else |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2212 { |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2213 MENUITEMINFO info; |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2214 |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2215 bzero (&info, sizeof (info)); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2216 info.cbSize = sizeof (info); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2217 info.fMask = MIIM_DATA; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2218 get_menu_item_info (menu, item, FALSE, &info); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2219 |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2220 help = info.dwItemData ? (Lisp_Object) info.dwItemData : Qnil; |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2221 } |
30989
2152817050ff
(keymap_panes): Pass the keymap's prompt as the pane name to
Jason Rumney <jasonr@gnu.org>
parents:
30238
diff
changeset
|
2222 |
41637
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2223 /* Store the help echo in the keyboard buffer as the X toolkit |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2224 version does, rather than directly showing it. This seems to |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2225 solve the GC problems that were present when we based the |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2226 Windows code on the non-toolkit version. */ |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2227 if (f) |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2228 { |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2229 XSETFRAME (frame, f); |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2230 kbd_buffer_store_help_event (frame, help); |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2231 } |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2232 else |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2233 /* X version has a loop through frames here, which doesn't |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2234 appear to do anything, unless it has some side effect. */ |
d797ce338b4b
(add_menu_item): Do not use owner-draw for disabled menu items.
Jason Rumney <jasonr@gnu.org>
parents:
41251
diff
changeset
|
2235 show_help_echo (help, Qnil, Qnil, Qnil, 1); |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2236 } |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2237 } |
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2238 |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2239 /* Free memory used by owner-drawn strings. */ |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2240 static void |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2241 w32_free_submenu_strings (menu) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2242 HMENU menu; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2243 { |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2244 int i, num = GetMenuItemCount (menu); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2245 for (i = 0; i < num; i++) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2246 { |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2247 MENUITEMINFO info; |
41930
d5fc57bcb0f2
(w32_free_submenu_strings): Clear menu item struct
Jason Rumney <jasonr@gnu.org>
parents:
41908
diff
changeset
|
2248 bzero (&info, sizeof (info)); |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2249 info.cbSize = sizeof (info); |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2250 info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_SUBMENU; |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2251 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2252 get_menu_item_info (menu, i, TRUE, &info); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2253 |
41908
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2254 /* Owner-drawn names are held in dwItemData. */ |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2255 if ((info.fType & MF_OWNERDRAW) && info.dwItemData) |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2256 { |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2257 #ifdef MENU_DEBUG |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2258 DebPrint ("Menu: freeing %ld for owner-draw", info.dwItemData); |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2259 #endif |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2260 LocalFree (info.dwItemData); |
4d8905b9ee49
(_widget_value): Make `help' field a Lisp_Object. Add
Jason Rumney <jasonr@gnu.org>
parents:
41733
diff
changeset
|
2261 } |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2262 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2263 /* Recurse down submenus. */ |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2264 if (info.hSubMenu) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2265 w32_free_submenu_strings (info.hSubMenu); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2266 } |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2267 } |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2268 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2269 void |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2270 w32_free_menu_strings (hwnd) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2271 HWND hwnd; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2272 { |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2273 HMENU menu = current_popup_menu; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2274 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2275 if (get_menu_item_info) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2276 { |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2277 /* If there is no popup menu active, free the strings from the frame's |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2278 menubar. */ |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2279 if (!menu) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2280 menu = GetMenu (hwnd); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2281 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2282 if (menu) |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2283 w32_free_submenu_strings (menu); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2284 } |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2285 |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2286 current_popup_menu = NULL; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2287 } |
28275
2c8492145fc8
(single_submenu): Set help string to NULL if none.
Jason Rumney <jasonr@gnu.org>
parents:
27932
diff
changeset
|
2288 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2289 #endif /* HAVE_MENUS */ |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2290 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2291 |
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15276
diff
changeset
|
2292 syms_of_w32menu () |
13434 | 2293 { |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2294 /* See if Get/SetMenuItemInfo functions are available. */ |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2295 HMODULE user32 = GetModuleHandle ("user32.dll"); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2296 get_menu_item_info = GetProcAddress (user32, "GetMenuItemInfoA"); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2297 set_menu_item_info = GetProcAddress (user32, "SetMenuItemInfoA"); |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2298 |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2299 staticpro (&menu_items); |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2300 menu_items = Qnil; |
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2301 |
41733
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2302 current_popup_menu = NULL; |
917737801660
(current_popup_menu, get_menu_item_info):
Jason Rumney <jasonr@gnu.org>
parents:
41646
diff
changeset
|
2303 |
15276 | 2304 Qdebug_on_next_call = intern ("debug-on-next-call"); |
2305 staticpro (&Qdebug_on_next_call); | |
2306 | |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
2307 DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, |
40962
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
2308 doc: /* Frame for which we are updating a menu. |
f66d09d1bb2f
Change doc-string comments to `new style'. [w/`doc:' keyword]. Doc fixes.
Jason Rumney <jasonr@gnu.org>
parents:
40656
diff
changeset
|
2309 The enable predicate for a menu command should check this variable. */); |
21612
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
2310 Vmenu_updating_frame = Qnil; |
24a01af0cd38
(Vmenu_updating_frame): New variable.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21450
diff
changeset
|
2311 |
13434 | 2312 defsubr (&Sx_popup_menu); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2313 #ifdef HAVE_MENUS |
13434 | 2314 defsubr (&Sx_popup_dialog); |
21741
3d1ce72aa7b9
Replace code with a new version written from scratch
Geoff Voelker <voelker@cs.washington.edu>
parents:
21612
diff
changeset
|
2315 #endif |
13434 | 2316 } |