annotate src/menu.c @ 96088:bdeece3f0482

*** empty log message ***
author Kenichi Handa <handa@m17n.org>
date Fri, 20 Jun 2008 06:12:33 +0000
parents ce4bece7ab52
children 127e54f8220e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
95646
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1 /* Platform-independent code for terminal communications.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2 Copyright (C) 1986, 1988, 1993, 1994, 1996, 1999, 2000, 2001, 2002, 2003,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
4
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
5 This file is part of GNU Emacs.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
6
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
7 GNU Emacs is free software: you can redistribute it and/or modify
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
10 (at your option) any later version.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
11
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
15 GNU General Public License for more details.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
16
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
19
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
20 #include <config.h>
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
21 #include <stdio.h>
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
22
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
23 #include "lisp.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
24 #include "keyboard.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
25 #include "keymap.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
26 #include "frame.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
27 #include "termhooks.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
28 #include "blockinput.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
29 #include "dispextern.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
30
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
31 #ifdef USE_X_TOOLKIT
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
32 #include "../lwlib/lwlib.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
33 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
34
95657
c4f5f8f64d1f * menu.c [HAVE_X_WINDOWS]: Include "xterm.h".
Andreas Schwab <schwab@suse.de>
parents: 95646
diff changeset
35 #ifdef HAVE_X_WINDOWS
c4f5f8f64d1f * menu.c [HAVE_X_WINDOWS]: Include "xterm.h".
Andreas Schwab <schwab@suse.de>
parents: 95646
diff changeset
36 #include "xterm.h"
c4f5f8f64d1f * menu.c [HAVE_X_WINDOWS]: Include "xterm.h".
Andreas Schwab <schwab@suse.de>
parents: 95646
diff changeset
37 #endif
c4f5f8f64d1f * menu.c [HAVE_X_WINDOWS]: Include "xterm.h".
Andreas Schwab <schwab@suse.de>
parents: 95646
diff changeset
38
95646
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
39 #ifdef USE_GTK
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
40 #include "gtkutil.h"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
41 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
42
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
43 #ifdef HAVE_NTGUI
95711
1c2b64c79c32 Include w32term.h, move widget related
Jason Rumney <jasonr@gnu.org>
parents: 95684
diff changeset
44 #include "w32term.h"
95646
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
45
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
46 extern AppendMenuW_Proc unicode_append_menu;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
47
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
48 #endif /* HAVE_NTGUI */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
49
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
50
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
51 /* Define HAVE_BOXES if menus can handle radio and toggle buttons. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
52 #if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NTGUI)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
53 #define HAVE_BOXES 1
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
54 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
55
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
56 extern Lisp_Object QCtoggle, QCradio;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
57
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
58 Lisp_Object menu_items;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
59
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
60 /* If non-nil, means that the global vars defined here are already in use.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
61 Used to detect cases where we try to re-enter this non-reentrant code. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
62 Lisp_Object menu_items_inuse;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
63
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
64 /* Number of slots currently allocated in menu_items. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
65 int menu_items_allocated;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
66
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
67 /* This is the index in menu_items of the first empty slot. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
68 int menu_items_used;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
69
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
70 /* The number of panes currently recorded in menu_items,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
71 excluding those within submenus. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
72 int menu_items_n_panes;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
73
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
74 /* Current depth within submenus. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
75 static int menu_items_submenu_depth;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
76
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
77 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
78 init_menu_items ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
79 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
80 if (!NILP (menu_items_inuse))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
81 error ("Trying to use a menu from within a menu-entry");
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
82
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
83 if (NILP (menu_items))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
84 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
85 menu_items_allocated = 60;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
86 menu_items = Fmake_vector (make_number (menu_items_allocated), Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
87 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
88
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
89 menu_items_inuse = Qt;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
90 menu_items_used = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
91 menu_items_n_panes = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
92 menu_items_submenu_depth = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
93 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
94
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
95 /* Call at the end of generating the data in menu_items. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
96
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
97 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
98 finish_menu_items ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
99 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
100 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
101
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
102 Lisp_Object
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
103 unuse_menu_items (dummy)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
104 Lisp_Object dummy;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
105 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
106 return menu_items_inuse = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
107 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
108
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
109 /* Call when finished using the data for the current menu
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
110 in menu_items. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
111
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
112 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
113 discard_menu_items ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
114 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
115 /* Free the structure if it is especially large.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
116 Otherwise, hold on to it, to save time. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
117 if (menu_items_allocated > 200)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
118 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
119 menu_items = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
120 menu_items_allocated = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
121 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
122 xassert (NILP (menu_items_inuse));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
123 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
124
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
125 /* This undoes save_menu_items, and it is called by the specpdl unwind
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
126 mechanism. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
127
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
128 static Lisp_Object
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
129 restore_menu_items (saved)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
130 Lisp_Object saved;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
131 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
132 menu_items = XCAR (saved);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
133 menu_items_inuse = (! NILP (menu_items) ? Qt : Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
134 menu_items_allocated = (VECTORP (menu_items) ? ASIZE (menu_items) : 0);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
135 saved = XCDR (saved);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
136 menu_items_used = XINT (XCAR (saved));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
137 saved = XCDR (saved);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
138 menu_items_n_panes = XINT (XCAR (saved));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
139 saved = XCDR (saved);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
140 menu_items_submenu_depth = XINT (XCAR (saved));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
141 return Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
142 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
143
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
144 /* Push the whole state of menu_items processing onto the specpdl.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
145 It will be restored when the specpdl is unwound. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
146
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
147 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
148 save_menu_items ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
149 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
150 Lisp_Object saved = list4 (!NILP (menu_items_inuse) ? menu_items : Qnil,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
151 make_number (menu_items_used),
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
152 make_number (menu_items_n_panes),
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
153 make_number (menu_items_submenu_depth));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
154 record_unwind_protect (restore_menu_items, saved);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
155 menu_items_inuse = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
156 menu_items = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
157 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
158
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
159
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
160 /* Make the menu_items vector twice as large. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
161
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
162 static void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
163 grow_menu_items ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
164 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
165 menu_items_allocated *= 2;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
166 menu_items = larger_vector (menu_items, menu_items_allocated, Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
167 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
168
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
169 /* Begin a submenu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
170
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
171 static void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
172 push_submenu_start ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
173 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
174 if (menu_items_used + 1 > menu_items_allocated)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
175 grow_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
176
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
177 XVECTOR (menu_items)->contents[menu_items_used++] = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
178 menu_items_submenu_depth++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
179 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
180
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
181 /* End a submenu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
182
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
183 static void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
184 push_submenu_end ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
185 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
186 if (menu_items_used + 1 > menu_items_allocated)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
187 grow_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
188
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
189 XVECTOR (menu_items)->contents[menu_items_used++] = Qlambda;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
190 menu_items_submenu_depth--;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
191 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
192
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
193 /* Indicate boundary between left and right. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
194
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
195 static void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
196 push_left_right_boundary ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
197 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
198 if (menu_items_used + 1 > menu_items_allocated)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
199 grow_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
200
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
201 XVECTOR (menu_items)->contents[menu_items_used++] = Qquote;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
202 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
203
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
204 /* Start a new menu pane in menu_items.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
205 NAME is the pane name. PREFIX_VEC is a prefix key for this pane. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
206
95726
ce4bece7ab52 (single_keymap_panes, push_menu_pane, push_menu_item): Make static again.
Jason Rumney <jasonr@gnu.org>
parents: 95714
diff changeset
207 static void
95646
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
208 push_menu_pane (name, prefix_vec)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
209 Lisp_Object name, prefix_vec;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
210 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
211 if (menu_items_used + MENU_ITEMS_PANE_LENGTH > menu_items_allocated)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
212 grow_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
213
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
214 if (menu_items_submenu_depth == 0)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
215 menu_items_n_panes++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
216 XVECTOR (menu_items)->contents[menu_items_used++] = Qt;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
217 XVECTOR (menu_items)->contents[menu_items_used++] = name;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
218 XVECTOR (menu_items)->contents[menu_items_used++] = prefix_vec;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
219 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
220
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
221 /* Push one menu item into the current pane. NAME is the string to
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
222 display. ENABLE if non-nil means this item can be selected. KEY
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
223 is the key generated by choosing this item, or nil if this item
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
224 doesn't really have a definition. DEF is the definition of this
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
225 item. EQUIV is the textual description of the keyboard equivalent
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
226 for this item (or nil if none). TYPE is the type of this menu
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
227 item, one of nil, `toggle' or `radio'. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
228
95726
ce4bece7ab52 (single_keymap_panes, push_menu_pane, push_menu_item): Make static again.
Jason Rumney <jasonr@gnu.org>
parents: 95714
diff changeset
229 static void
95646
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
230 push_menu_item (name, enable, key, def, equiv, type, selected, help)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
231 Lisp_Object name, enable, key, def, equiv, type, selected, help;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
232 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
233 if (menu_items_used + MENU_ITEMS_ITEM_LENGTH > menu_items_allocated)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
234 grow_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
235
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
236 XVECTOR (menu_items)->contents[menu_items_used++] = name;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
237 XVECTOR (menu_items)->contents[menu_items_used++] = enable;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
238 XVECTOR (menu_items)->contents[menu_items_used++] = key;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
239 XVECTOR (menu_items)->contents[menu_items_used++] = equiv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
240 XVECTOR (menu_items)->contents[menu_items_used++] = def;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
241 XVECTOR (menu_items)->contents[menu_items_used++] = type;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
242 XVECTOR (menu_items)->contents[menu_items_used++] = selected;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
243 XVECTOR (menu_items)->contents[menu_items_used++] = help;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
244 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
245
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
246 /* Args passed between single_keymap_panes and single_menu_item. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
247 struct skp
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
248 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
249 Lisp_Object pending_maps;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
250 int maxdepth, notreal;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
251 int notbuttons;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
252 };
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
253
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
254 static void single_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
255 void *));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
256
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
257 /* This is a recursive subroutine of keymap_panes.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
258 It handles one keymap, KEYMAP.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
259 The other arguments are passed along
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
260 or point to local variables of the previous function.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
261 If NOTREAL is nonzero, only check for equivalent key bindings, don't
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
262 evaluate expressions in menu items and don't make any menu.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
263
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
264 If we encounter submenus deeper than MAXDEPTH levels, ignore them. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
265
95726
ce4bece7ab52 (single_keymap_panes, push_menu_pane, push_menu_item): Make static again.
Jason Rumney <jasonr@gnu.org>
parents: 95714
diff changeset
266 static void
95646
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
267 single_keymap_panes (keymap, pane_name, prefix, notreal, maxdepth)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
268 Lisp_Object keymap;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
269 Lisp_Object pane_name;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
270 Lisp_Object prefix;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
271 int notreal;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
272 int maxdepth;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
273 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
274 struct skp skp;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
275 struct gcpro gcpro1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
276
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
277 skp.pending_maps = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
278 skp.maxdepth = maxdepth;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
279 skp.notreal = notreal;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
280 skp.notbuttons = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
281
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
282 if (maxdepth <= 0)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
283 return;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
284
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
285 push_menu_pane (pane_name, prefix);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
286
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
287 #ifndef HAVE_BOXES
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
288 /* Remember index for first item in this pane so we can go back and
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
289 add a prefix when (if) we see the first button. After that, notbuttons
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
290 is set to 0, to mark that we have seen a button and all non button
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
291 items need a prefix. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
292 skp.notbuttons = menu_items_used;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
293 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
294
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
295 GCPRO1 (skp.pending_maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
296 map_keymap_canonical (keymap, single_menu_item, Qnil, &skp);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
297 UNGCPRO;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
298
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
299 /* Process now any submenus which want to be panes at this level. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
300 while (CONSP (skp.pending_maps))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
301 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
302 Lisp_Object elt, eltcdr, string;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
303 elt = XCAR (skp.pending_maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
304 eltcdr = XCDR (elt);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
305 string = XCAR (eltcdr);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
306 /* We no longer discard the @ from the beginning of the string here.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
307 Instead, we do this in *menu_show. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
308 single_keymap_panes (Fcar (elt), string,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
309 XCDR (eltcdr), notreal, maxdepth - 1);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
310 skp.pending_maps = XCDR (skp.pending_maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
311 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
312 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
313
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
314 /* This is a subroutine of single_keymap_panes that handles one
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
315 keymap entry.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
316 KEY is a key in a keymap and ITEM is its binding.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
317 SKP->PENDING_MAPS_PTR is a list of keymaps waiting to be made into
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
318 separate panes.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
319 If SKP->NOTREAL is nonzero, only check for equivalent key bindings, don't
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
320 evaluate expressions in menu items and don't make any menu.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
321 If we encounter submenus deeper than SKP->MAXDEPTH levels, ignore them. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
322
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
323 static void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
324 single_menu_item (key, item, dummy, skp_v)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
325 Lisp_Object key, item, dummy;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
326 void *skp_v;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
327 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
328 Lisp_Object map, item_string, enabled;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
329 struct gcpro gcpro1, gcpro2;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
330 int res;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
331 struct skp *skp = skp_v;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
332
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
333 /* Parse the menu item and leave the result in item_properties. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
334 GCPRO2 (key, item);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
335 res = parse_menu_item (item, skp->notreal, 0);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
336 UNGCPRO;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
337 if (!res)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
338 return; /* Not a menu item. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
339
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
340 map = XVECTOR (item_properties)->contents[ITEM_PROPERTY_MAP];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
341
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
342 if (skp->notreal)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
343 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
344 /* We don't want to make a menu, just traverse the keymaps to
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
345 precompute equivalent key bindings. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
346 if (!NILP (map))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
347 single_keymap_panes (map, Qnil, key, 1, skp->maxdepth - 1);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
348 return;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
349 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
350
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
351 enabled = XVECTOR (item_properties)->contents[ITEM_PROPERTY_ENABLE];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
352 item_string = XVECTOR (item_properties)->contents[ITEM_PROPERTY_NAME];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
353
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
354 if (!NILP (map) && SREF (item_string, 0) == '@')
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
355 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
356 if (!NILP (enabled))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
357 /* An enabled separate pane. Remember this to handle it later. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
358 skp->pending_maps = Fcons (Fcons (map, Fcons (item_string, key)),
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
359 skp->pending_maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
360 return;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
361 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
362
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
363 #ifdef HAVE_X_WINDOWS
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
364 #ifndef HAVE_BOXES
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
365 /* Simulate radio buttons and toggle boxes by putting a prefix in
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
366 front of them. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
367 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
368 Lisp_Object prefix = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
369 Lisp_Object type = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
370 if (!NILP (type))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
371 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
372 Lisp_Object selected
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
373 = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
374
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
375 if (skp->notbuttons)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
376 /* The first button. Line up previous items in this menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
377 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
378 int index = skp->notbuttons; /* Index for first item this menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
379 int submenu = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
380 Lisp_Object tem;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
381 while (index < menu_items_used)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
382 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
383 tem
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
384 = XVECTOR (menu_items)->contents[index + MENU_ITEMS_ITEM_NAME];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
385 if (NILP (tem))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
386 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
387 index++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
388 submenu++; /* Skip sub menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
389 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
390 else if (EQ (tem, Qlambda))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
391 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
392 index++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
393 submenu--; /* End sub menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
394 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
395 else if (EQ (tem, Qt))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
396 index += 3; /* Skip new pane marker. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
397 else if (EQ (tem, Qquote))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
398 index++; /* Skip a left, right divider. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
399 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
400 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
401 if (!submenu && SREF (tem, 0) != '\0'
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
402 && SREF (tem, 0) != '-')
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
403 XVECTOR (menu_items)->contents[index + MENU_ITEMS_ITEM_NAME]
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
404 = concat2 (build_string (" "), tem);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
405 index += MENU_ITEMS_ITEM_LENGTH;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
406 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
407 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
408 skp->notbuttons = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
409 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
410
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
411 /* Calculate prefix, if any, for this item. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
412 if (EQ (type, QCtoggle))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
413 prefix = build_string (NILP (selected) ? "[ ] " : "[X] ");
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
414 else if (EQ (type, QCradio))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
415 prefix = build_string (NILP (selected) ? "( ) " : "(*) ");
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
416 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
417 /* Not a button. If we have earlier buttons, then we need a prefix. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
418 else if (!skp->notbuttons && SREF (item_string, 0) != '\0'
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
419 && SREF (item_string, 0) != '-')
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
420 prefix = build_string (" ");
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
421
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
422 if (!NILP (prefix))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
423 item_string = concat2 (prefix, item_string);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
424 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
425 #endif /* not HAVE_BOXES */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
426
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
427 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
428 if (!NILP (map))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
429 /* Indicate visually that this is a submenu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
430 item_string = concat2 (item_string, build_string (" >"));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
431 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
432
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
433 #endif /* HAVE_X_WINDOWS */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
434
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
435 push_menu_item (item_string, enabled, key,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
436 XVECTOR (item_properties)->contents[ITEM_PROPERTY_DEF],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
437 XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
438 XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
439 XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
440 XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP]);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
441
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
442 #if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NTGUI)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
443 /* Display a submenu using the toolkit. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
444 if (! (NILP (map) || NILP (enabled)))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
445 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
446 push_submenu_start ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
447 single_keymap_panes (map, Qnil, key, 0, skp->maxdepth - 1);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
448 push_submenu_end ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
449 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
450 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
451 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
452
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
453 /* Look through KEYMAPS, a vector of keymaps that is NMAPS long,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
454 and generate menu panes for them in menu_items.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
455 If NOTREAL is nonzero,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
456 don't bother really computing whether an item is enabled. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
457
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
458 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
459 keymap_panes (keymaps, nmaps, notreal)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
460 Lisp_Object *keymaps;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
461 int nmaps;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
462 int notreal;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
463 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
464 int mapno;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
465
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
466 init_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
467
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
468 /* Loop over the given keymaps, making a pane for each map.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
469 But don't make a pane that is empty--ignore that map instead.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
470 P is the number of panes we have made so far. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
471 for (mapno = 0; mapno < nmaps; mapno++)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
472 single_keymap_panes (keymaps[mapno],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
473 Fkeymap_prompt (keymaps[mapno]), Qnil, notreal, 10);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
474
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
475 finish_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
476 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
477
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
478
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
479 /* Push the items in a single pane defined by the alist PANE. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
480 static void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
481 list_of_items (pane)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
482 Lisp_Object pane;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
483 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
484 Lisp_Object tail, item, item1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
485
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
486 for (tail = pane; CONSP (tail); tail = XCDR (tail))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
487 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
488 item = XCAR (tail);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
489 if (STRINGP (item))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
490 push_menu_item (ENCODE_MENU_STRING (item), Qnil, Qnil, Qt,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
491 Qnil, Qnil, Qnil, Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
492 else if (CONSP (item))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
493 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
494 item1 = XCAR (item);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
495 CHECK_STRING (item1);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
496 push_menu_item (ENCODE_MENU_STRING (item1), Qt, XCDR (item),
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
497 Qt, Qnil, Qnil, Qnil, Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
498 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
499 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
500 push_left_right_boundary ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
501
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
502 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
503 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
504
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
505 /* Push all the panes and items of a menu described by the
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
506 alist-of-alists MENU.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
507 This handles old-fashioned calls to x-popup-menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
508 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
509 list_of_panes (menu)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
510 Lisp_Object menu;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
511 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
512 Lisp_Object tail;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
513
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
514 init_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
515
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
516 for (tail = menu; CONSP (tail); tail = XCDR (tail))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
517 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
518 Lisp_Object elt, pane_name, pane_data;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
519 elt = XCAR (tail);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
520 pane_name = Fcar (elt);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
521 CHECK_STRING (pane_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
522 push_menu_pane (ENCODE_MENU_STRING (pane_name), Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
523 pane_data = Fcdr (elt);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
524 CHECK_CONS (pane_data);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
525 list_of_items (pane_data);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
526 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
527
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
528 finish_menu_items ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
529 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
530
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
531 /* Set up data in menu_items for a menu bar item
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
532 whose event type is ITEM_KEY (with string ITEM_NAME)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
533 and whose contents come from the list of keymaps MAPS. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
534 int
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
535 parse_single_submenu (item_key, item_name, maps)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
536 Lisp_Object item_key, item_name, maps;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
537 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
538 Lisp_Object length;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
539 int len;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
540 Lisp_Object *mapvec;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
541 int i;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
542 int top_level_items = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
543
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
544 length = Flength (maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
545 len = XINT (length);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
546
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
547 /* Convert the list MAPS into a vector MAPVEC. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
548 mapvec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
549 for (i = 0; i < len; i++)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
550 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
551 mapvec[i] = Fcar (maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
552 maps = Fcdr (maps);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
553 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
554
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
555 /* Loop over the given keymaps, making a pane for each map.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
556 But don't make a pane that is empty--ignore that map instead. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
557 for (i = 0; i < len; i++)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
558 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
559 if (!KEYMAPP (mapvec[i]))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
560 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
561 /* Here we have a command at top level in the menu bar
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
562 as opposed to a submenu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
563 top_level_items = 1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
564 push_menu_pane (Qnil, Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
565 push_menu_item (item_name, Qt, item_key, mapvec[i],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
566 Qnil, Qnil, Qnil, Qnil);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
567 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
568 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
569 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
570 Lisp_Object prompt;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
571 prompt = Fkeymap_prompt (mapvec[i]);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
572 single_keymap_panes (mapvec[i],
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
573 !NILP (prompt) ? prompt : item_name,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
574 item_key, 0, 10);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
575 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
576 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
577
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
578 return top_level_items;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
579 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
580
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
581
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
582 #if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NTGUI)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
583
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
584 /* Allocate a widget_value, blocking input. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
585
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
586 widget_value *
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
587 xmalloc_widget_value ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
588 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
589 widget_value *value;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
590
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
591 BLOCK_INPUT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
592 value = malloc_widget_value ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
593 UNBLOCK_INPUT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
594
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
595 return value;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
596 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
597
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
598 /* This recursively calls free_widget_value on the tree of widgets.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
599 It must free all data that was malloc'ed for these widget_values.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
600 In Emacs, many slots are pointers into the data of Lisp_Strings, and
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
601 must be left alone. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
602
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
603 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
604 free_menubar_widget_value_tree (wv)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
605 widget_value *wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
606 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
607 if (! wv) return;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
608
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
609 wv->name = wv->value = wv->key = (char *) 0xDEADBEEF;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
610
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
611 if (wv->contents && (wv->contents != (widget_value*)1))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
612 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
613 free_menubar_widget_value_tree (wv->contents);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
614 wv->contents = (widget_value *) 0xDEADBEEF;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
615 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
616 if (wv->next)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
617 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
618 free_menubar_widget_value_tree (wv->next);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
619 wv->next = (widget_value *) 0xDEADBEEF;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
620 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
621 BLOCK_INPUT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
622 free_widget_value (wv);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
623 UNBLOCK_INPUT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
624 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
625
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
626 /* Create a tree of widget_value objects
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
627 representing the panes and items
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
628 in menu_items starting at index START, up to index END. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
629
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
630 widget_value *
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
631 digest_single_submenu (start, end, top_level_items)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
632 int start, end, top_level_items;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
633 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
634 widget_value *wv, *prev_wv, *save_wv, *first_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
635 int i;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
636 int submenu_depth = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
637 widget_value **submenu_stack;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
638 int panes_seen = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
639
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
640 submenu_stack
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
641 = (widget_value **) alloca (menu_items_used * sizeof (widget_value *));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
642 wv = xmalloc_widget_value ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
643 wv->name = "menu";
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
644 wv->value = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
645 wv->enabled = 1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
646 wv->button_type = BUTTON_TYPE_NONE;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
647 wv->help = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
648 first_wv = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
649 save_wv = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
650 prev_wv = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
651
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
652 /* Loop over all panes and items made by the preceding call
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
653 to parse_single_submenu and construct a tree of widget_value objects.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
654 Ignore the panes and items used by previous calls to
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
655 digest_single_submenu, even though those are also in menu_items. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
656 i = start;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
657 while (i < end)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
658 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
659 if (EQ (XVECTOR (menu_items)->contents[i], Qnil))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
660 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
661 submenu_stack[submenu_depth++] = save_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
662 save_wv = prev_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
663 prev_wv = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
664 i++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
665 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
666 else if (EQ (XVECTOR (menu_items)->contents[i], Qlambda))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
667 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
668 prev_wv = save_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
669 save_wv = submenu_stack[--submenu_depth];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
670 i++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
671 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
672 else if (EQ (XVECTOR (menu_items)->contents[i], Qt)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
673 && submenu_depth != 0)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
674 i += MENU_ITEMS_PANE_LENGTH;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
675 /* Ignore a nil in the item list.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
676 It's meaningful only for dialog boxes. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
677 else if (EQ (XVECTOR (menu_items)->contents[i], Qquote))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
678 i += 1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
679 else if (EQ (XVECTOR (menu_items)->contents[i], Qt))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
680 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
681 /* Create a new pane. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
682 Lisp_Object pane_name, prefix;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
683 char *pane_string;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
684
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
685 panes_seen++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
686
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
687 pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
688 prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
689
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
690 #ifdef HAVE_NTGUI
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
691 if (STRINGP (pane_name))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
692 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
693 if (unicode_append_menu)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
694 /* Encode as UTF-8 for now. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
695 pane_name = ENCODE_UTF_8 (pane_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
696 else if (STRING_MULTIBYTE (pane_name))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
697 pane_name = ENCODE_SYSTEM (pane_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
698
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
699 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
700 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
701 #elif !defined (HAVE_MULTILINGUAL_MENU)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
702 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
703 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
704 pane_name = ENCODE_MENU_STRING (pane_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
705 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
706 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
707 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
708
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
709 pane_string = (NILP (pane_name)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
710 ? "" : (char *) SDATA (pane_name));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
711 /* If there is just one top-level pane, put all its items directly
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
712 under the top-level menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
713 if (menu_items_n_panes == 1)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
714 pane_string = "";
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
715
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
716 /* If the pane has a meaningful name,
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
717 make the pane a top-level menu item
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
718 with its items as a submenu beneath it. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
719 if (strcmp (pane_string, ""))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
720 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
721 wv = xmalloc_widget_value ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
722 if (save_wv)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
723 save_wv->next = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
724 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
725 first_wv->contents = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
726 wv->lname = pane_name;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
727 /* Set value to 1 so update_submenu_strings can handle '@' */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
728 wv->value = (char *)1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
729 wv->enabled = 1;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
730 wv->button_type = BUTTON_TYPE_NONE;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
731 wv->help = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
732 save_wv = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
733 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
734 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
735 save_wv = first_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
736
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
737 prev_wv = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
738 i += MENU_ITEMS_PANE_LENGTH;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
739 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
740 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
741 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
742 /* Create a new item within current pane. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
743 Lisp_Object item_name, enable, descrip, def, type, selected;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
744 Lisp_Object help;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
745
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
746 /* All items should be contained in panes. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
747 if (panes_seen == 0)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
748 abort ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
749
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
750 item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
751 enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
752 descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
753 def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
754 type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
755 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
756 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
757
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
758 #ifdef HAVE_NTGUI
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
759 if (STRINGP (item_name))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
760 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
761 if (unicode_append_menu)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
762 item_name = ENCODE_UTF_8 (item_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
763 else if (STRING_MULTIBYTE (item_name))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
764 item_name = ENCODE_SYSTEM (item_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
765
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
766 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
767 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
768
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
769 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
770 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
771 descrip = ENCODE_SYSTEM (descrip);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
772 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
773 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
774 #elif !defined (HAVE_MULTILINGUAL_MENU)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
775 if (STRING_MULTIBYTE (item_name))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
776 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
777 item_name = ENCODE_MENU_STRING (item_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
778 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
779 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
780
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
781 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
782 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
783 descrip = ENCODE_MENU_STRING (descrip);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
784 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
785 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
786 #endif
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
787
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
788 wv = xmalloc_widget_value ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
789 if (prev_wv)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
790 prev_wv->next = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
791 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
792 save_wv->contents = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
793
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
794 wv->lname = item_name;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
795 if (!NILP (descrip))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
796 wv->lkey = descrip;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
797 wv->value = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
798 /* The EMACS_INT cast avoids a warning. There's no problem
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
799 as long as pointers have enough bits to hold small integers. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
800 wv->call_data = (!NILP (def) ? (void *) (EMACS_INT) i : 0);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
801 wv->enabled = !NILP (enable);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
802
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
803 if (NILP (type))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
804 wv->button_type = BUTTON_TYPE_NONE;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
805 else if (EQ (type, QCradio))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
806 wv->button_type = BUTTON_TYPE_RADIO;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
807 else if (EQ (type, QCtoggle))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
808 wv->button_type = BUTTON_TYPE_TOGGLE;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
809 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
810 abort ();
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
811
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
812 wv->selected = !NILP (selected);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
813 if (! STRINGP (help))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
814 help = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
815
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
816 wv->help = help;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
817
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
818 prev_wv = wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
819
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
820 i += MENU_ITEMS_ITEM_LENGTH;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
821 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
822 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
823
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
824 /* If we have just one "menu item"
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
825 that was originally a button, return it by itself. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
826 if (top_level_items && first_wv->contents && first_wv->contents->next == 0)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
827 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
828 wv = first_wv->contents;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
829 free_widget_value (first_wv);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
830 return wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
831 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
832
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
833 return first_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
834 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
835
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
836 /* Walk through the widget_value tree starting at FIRST_WV and update
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
837 the char * pointers from the corresponding lisp values.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
838 We do this after building the whole tree, since GC may happen while the
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
839 tree is constructed, and small strings are relocated. So we must wait
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
840 until no GC can happen before storing pointers into lisp values. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
841 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
842 update_submenu_strings (first_wv)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
843 widget_value *first_wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
844 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
845 widget_value *wv;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
846
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
847 for (wv = first_wv; wv; wv = wv->next)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
848 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
849 if (STRINGP (wv->lname))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
850 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
851 wv->name = (char *) SDATA (wv->lname);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
852
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
853 /* Ignore the @ that means "separate pane".
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
854 This is a kludge, but this isn't worth more time. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
855 if (wv->value == (char *)1)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
856 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
857 if (wv->name[0] == '@')
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
858 wv->name++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
859 wv->value = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
860 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
861 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
862
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
863 if (STRINGP (wv->lkey))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
864 wv->key = (char *) SDATA (wv->lkey);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
865
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
866 if (wv->contents)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
867 update_submenu_strings (wv->contents);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
868 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
869 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
870
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
871 /* Find the menu selection and store it in the keyboard buffer.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
872 F is the frame the menu is on.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
873 MENU_BAR_ITEMS_USED is the length of VECTOR.
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
874 VECTOR is an array of menu events for the whole menu. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
875
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
876 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
877 find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
878 FRAME_PTR f;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
879 EMACS_INT menu_bar_items_used;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
880 Lisp_Object vector;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
881 void *client_data;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
882 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
883 Lisp_Object prefix, entry;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
884 Lisp_Object *subprefix_stack;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
885 int submenu_depth = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
886 int i;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
887
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
888 entry = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
889 subprefix_stack = (Lisp_Object *) alloca (menu_bar_items_used * sizeof (Lisp_Object));
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
890 prefix = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
891 i = 0;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
892
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
893 while (i < menu_bar_items_used)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
894 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
895 if (EQ (XVECTOR (vector)->contents[i], Qnil))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
896 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
897 subprefix_stack[submenu_depth++] = prefix;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
898 prefix = entry;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
899 i++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
900 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
901 else if (EQ (XVECTOR (vector)->contents[i], Qlambda))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
902 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
903 prefix = subprefix_stack[--submenu_depth];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
904 i++;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
905 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
906 else if (EQ (XVECTOR (vector)->contents[i], Qt))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
907 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
908 prefix = XVECTOR (vector)->contents[i + MENU_ITEMS_PANE_PREFIX];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
909 i += MENU_ITEMS_PANE_LENGTH;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
910 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
911 else
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
912 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
913 entry = XVECTOR (vector)->contents[i + MENU_ITEMS_ITEM_VALUE];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
914 /* The EMACS_INT cast avoids a warning. There's no problem
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
915 as long as pointers have enough bits to hold small integers. */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
916 if ((int) (EMACS_INT) client_data == i)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
917 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
918 int j;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
919 struct input_event buf;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
920 Lisp_Object frame;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
921 EVENT_INIT (buf);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
922
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
923 XSETFRAME (frame, f);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
924 buf.kind = MENU_BAR_EVENT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
925 buf.frame_or_window = frame;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
926 buf.arg = frame;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
927 kbd_buffer_store_event (&buf);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
928
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
929 for (j = 0; j < submenu_depth; j++)
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
930 if (!NILP (subprefix_stack[j]))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
931 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
932 buf.kind = MENU_BAR_EVENT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
933 buf.frame_or_window = frame;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
934 buf.arg = subprefix_stack[j];
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
935 kbd_buffer_store_event (&buf);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
936 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
937
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
938 if (!NILP (prefix))
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
939 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
940 buf.kind = MENU_BAR_EVENT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
941 buf.frame_or_window = frame;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
942 buf.arg = prefix;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
943 kbd_buffer_store_event (&buf);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
944 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
945
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
946 buf.kind = MENU_BAR_EVENT;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
947 buf.frame_or_window = frame;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
948 buf.arg = entry;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
949 kbd_buffer_store_event (&buf);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
950
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
951 return;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
952 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
953 i += MENU_ITEMS_ITEM_LENGTH;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
954 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
955 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
956 }
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
957
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
958 #endif /* USE_X_TOOLKIT || USE_GTK || HAVE_NTGUI */
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
959
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
960 void
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
961 syms_of_menu ()
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
962 {
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
963 staticpro (&menu_items);
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
964 menu_items = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
965 menu_items_inuse = Qnil;
816ec0114c3c * menu.c: New file. Relocate platform-independent menu definitions
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
966 }
95684
4ab45b5c92cd Add arch tagline
Miles Bader <miles@gnu.org>
parents: 95657
diff changeset
967
4ab45b5c92cd Add arch tagline
Miles Bader <miles@gnu.org>
parents: 95657
diff changeset
968 /* arch-tag: 78bbc7cf-8025-4156-aa8a-6c7fd99bf51d
4ab45b5c92cd Add arch tagline
Miles Bader <miles@gnu.org>
parents: 95657
diff changeset
969 (do not change this comment) */