annotate src/menubar-gtk.c @ 939:025200a2163c

[xemacs-hg @ 2002-07-31 07:23:39 by michaels] 2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de> Markus Kaltenbach <makalten@informatik.uni-tuebingen.de> Mike Sperber <mike@xemacs.org> configure flag to turn these changes on: --use-kkcc First we added a dumpable flag to lrecord_implementation. It shows, if the object is dumpable and should be processed by the dumper. * lrecord.h (struct lrecord_implementation): added dumpable flag (MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions to the new lrecord_implementation and their calls. Then we changed mark_object, that it no longer needs a mark method for those types that have pdump descritions. * alloc.c: (mark_object): If the object has a description, the new mark algorithm is called, and the object is marked according to its description. Otherwise it uses the mark method like before. These procedures mark objects according to their descriptions. They are modeled on the corresponding pdumper procedures. (mark_with_description): (get_indirect_count): (structure_size): (mark_struct_contents): These procedures still call mark_object, this is needed while there are Lisp_Objects without descriptions left. We added pdump descriptions for many Lisp_Objects: * extents.c: extent_auxiliary_description * database.c: database_description * gui.c: gui_item_description * scrollbar.c: scrollbar_instance_description * toolbar.c: toolbar_button_description * event-stream.c: command_builder_description * mule-charset.c: charset_description * device-msw.c: devmode_description * dialog-msw.c: mswindows_dialog_id_description * eldap.c: ldap_description * postgresql.c: pgconn_description pgresult_description * tooltalk.c: tooltalk_message_description tooltalk_pattern_description * ui-gtk.c: emacs_ffi_description emacs_gtk_object_description * events.c: * events.h: * event-stream.c: * event-Xt.c: * event-gtk.c: * event-tty.c: To write a pdump description for Lisp_Event, we converted every struct in the union event to a Lisp_Object. So we created nine new Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data, Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data, Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data. We also wrote makro selectors and mutators for the fields of the new designed Lisp_Event and added everywhere these new abstractions. We implemented XD_UNION support in (mark_with_description), so we can describe exspecially console/device specific data with XD_UNION. To describe with XD_UNION, we added a field to these objects, which holds the variant type of the object. This field is initialized in the appendant constructor. The variant is an integer, it has also to be described in an description, if XD_UNION is used. XD_UNION is used in following descriptions: * console.c: console_description (get_console_variant): returns the variant (create_console): added variant initialization * console.h (console_variant): the different console types * console-impl.h (struct console): added enum console_variant contype * device.c: device_description (Fmake_device): added variant initialization * device-impl.h (struct device): added enum console_variant devtype * objects.c: image_instance_description font_instance_description (Fmake_color_instance): added variant initialization (Fmake_font_instance): added variant initialization * objects-impl.h (struct Lisp_Color_Instance): added color_instance_type * objects-impl.h (struct Lisp_Font_Instance): added font_instance_type * process.c: process_description (make_process_internal): added variant initialization * process.h (process_variant): the different process types
author michaels
date Wed, 31 Jul 2002 07:23:39 +0000
parents 890f3cafe600
children e22b0213b713
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1 /* Implements an elisp-programmable menubar -- X interface.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2 Copyright (C) 1993, 1994 Free Software Foundation, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
3 Copyright (C) 1995 Tinker Systems and INS Engineering Corp.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
4
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5 This file is part of XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
10 later version.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
11
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
15 for more details.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
16
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
21
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22 /* Synched up with: Not in FSF. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24 /* created 16-dec-91 by jwz */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27 #include "lisp.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30 #include "commands.h" /* zmacs_regions */
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
31 #include "device.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32 #include "events.h"
876
890f3cafe600 [xemacs-hg @ 2002-06-23 09:25:11 by stephent]
stephent
parents: 872
diff changeset
33 #include "device-impl.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
34 #include "frame-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
35 #include "gui.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 #include "opaque.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37 #include "window.h"
876
890f3cafe600 [xemacs-hg @ 2002-06-23 09:25:11 by stephent]
stephent
parents: 872
diff changeset
38 #include "window-impl.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
39
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
40 #include "console-gtk-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
41 #include "gui-gtk.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
42 #include "ui-gtk.h"
876
890f3cafe600 [xemacs-hg @ 2002-06-23 09:25:11 by stephent]
stephent
parents: 872
diff changeset
43 #include "menubar.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
44
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
45 #ifdef HAVE_GNOME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
46 #include <libgnomeui/libgnomeui.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
47 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
48
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
49 #define MENUBAR_TYPE 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
50 #define SUBMENU_TYPE 1
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
51 #define POPUP_TYPE 2
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
52
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
53 static GtkWidget *menu_descriptor_to_widget_1 (Lisp_Object descr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55 #define FRAME_MENUBAR_DATA(frame) ((frame)->menubar_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56 #define XFRAME_MENUBAR_DATA_LASTBUFF(frame) (XCAR ((frame)->menubar_data))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57 #define XFRAME_MENUBAR_DATA_UPTODATE(frame) (XCDR ((frame)->menubar_data))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
58
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
59
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
60 /* This is a bogus subclass of GtkMenuBar so that the menu never tries
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
61 ** to be bigger than the text widget. This prevents weird resizing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
62 ** when jumping around between buffers with radically different menu
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
63 ** sizes.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
65
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
66 #define GTK_XEMACS_MENUBAR(obj) GTK_CHECK_CAST (obj, gtk_xemacs_menubar_get_type (), GtkXEmacsMenubar)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
67 #define GTK_XEMACS_MENUBAR_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_xemacs_menubar_get_type (), GtkXEmacsMenubarClass)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
68 #define GTK_IS_XEMACS_MENUBAR(obj) GTK_CHECK_TYPE (obj, gtk_xemacs_menubar_get_type ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
69 #define GTK_XEMACS_MENUBAR_FRAME(obj) GTK_XEMACS_MENUBAR (obj)->f
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
70
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
71 typedef struct _GtkXEmacsMenubar GtkXEmacsMenubar;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
72 typedef struct _GtkXEmacsMenubarClass GtkXEmacsMenubarClass;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
73
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
74 struct _GtkXEmacsMenubar
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76 GtkMenuBar menu;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77 struct frame *frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
78 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
79
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80 struct _GtkXEmacsMenubarClass
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
81 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 GtkMenuBarClass parent_class;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
83 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
84
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85 guint gtk_xemacs_menubar_get_type (void);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86 GtkWidget *gtk_xemacs_menubar_new (struct frame *f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 static void gtk_xemacs_menubar_class_init (GtkXEmacsMenubarClass *klass);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89 static void gtk_xemacs_menubar_init (GtkXEmacsMenubar *xemacs);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90 static void gtk_xemacs_menubar_size_request (GtkWidget *widget, GtkRequisition *requisition);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92 guint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 gtk_xemacs_menubar_get_type (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95 static guint xemacs_menubar_type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97 if (!xemacs_menubar_type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
98 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
99 static const GtkTypeInfo xemacs_menubar_info =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 "GtkXEmacsMenubar",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 sizeof (GtkXEmacsMenubar),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 sizeof (GtkXEmacsMenubarClass),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 (GtkClassInitFunc) gtk_xemacs_menubar_class_init,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 (GtkObjectInitFunc) gtk_xemacs_menubar_init,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 /* reserved_1 */ NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 /* reserved_2 */ NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 (GtkClassInitFunc) NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111 xemacs_menubar_type = gtk_type_unique (gtk_menu_bar_get_type (), &xemacs_menubar_info);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 return xemacs_menubar_type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 static GtkWidgetClass *parent_class;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 static void gtk_xemacs_menubar_class_init (GtkXEmacsMenubarClass *klass)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 GtkWidgetClass *widget_class;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 widget_class = (GtkWidgetClass*) klass;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 parent_class = (GtkWidgetClass *) gtk_type_class (gtk_menu_bar_get_type ());
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 widget_class->size_request = gtk_xemacs_menubar_size_request;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 static void gtk_xemacs_menubar_init (GtkXEmacsMenubar *xemacs)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 static void gtk_xemacs_menubar_size_request (GtkWidget *widget, GtkRequisition *requisition)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 GtkXEmacsMenubar *x = GTK_XEMACS_MENUBAR (widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 GtkRequisition frame_size;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 parent_class->size_request (widget, requisition);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 /* #### BILL!
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 ** We should really only do this if the menu has not been detached!
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 ** WMP 9/9/2000
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 gtk_widget_size_request (FRAME_GTK_TEXT_WIDGET (x->frame), &frame_size);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 requisition->width = frame_size.width;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 GtkWidget *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 gtk_xemacs_menubar_new (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 GtkXEmacsMenubar *menubar = gtk_type_new (gtk_xemacs_menubar_get_type ());
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 menubar->frame = f;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 return (GTK_WIDGET (menubar));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 /* We now return you to your regularly scheduled menus... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 int dockable_menubar;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 /* #define TEAR_OFF_MENUS */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167 #ifdef TEAR_OFF_MENUS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 int tear_off_menus;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 /* Converting from XEmacs to GTK representation */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 menu_name_to_accelerator (char *name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 while (*name) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 if (*name=='%') {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 ++name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 if (!(*name))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 if (*name=='_' && *(name+1))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 int accelerator = (int) (unsigned char) (*(name+1));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 return make_char (tolower (accelerator));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 ++name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 #define XEMACS_MENU_DESCR_TAG "xemacs::menu::description"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193 #define XEMACS_MENU_FILTER_TAG "xemacs::menu::filter"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 #define XEMACS_MENU_GUIID_TAG "xemacs::menu::gui_id"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 #define XEMACS_MENU_FIRSTTIME_TAG "xemacs::menu::first_time"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 static void __activate_menu(GtkMenuItem *, gpointer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 #ifdef TEAR_OFF_MENUS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 __torn_off_sir(GtkMenuItem *item, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 GtkWidget *menu_item = GTK_WIDGET (user_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 if (GTK_TEAROFF_MENU_ITEM (item)->torn_off)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207 /* Menu was just torn off */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 GUI_ID id = new_gui_id ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209 Lisp_Object menu_desc = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 GtkWidget *old_submenu = GTK_MENU_ITEM (menu_item)->submenu;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 809
diff changeset
212 menu_desc = VOID_TO_LISP (gtk_object_get_data (GTK_OBJECT (menu_item), XEMACS_MENU_DESCR_TAG));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 /* GCPRO all of our very own */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 gcpro_popup_callbacks (id, menu_desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217 /* Hide the now detached menu from the attentions of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 __activate_menu destroying the old submenu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 gtk_widget_ref (old_submenu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), gtk_menu_new ());
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 gtk_widget_show_all (old_submenu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 /* This is called when a menu is about to be shown... this is what
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 does the delayed creation of the menu items. We populate the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 submenu and away we go. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 __maybe_destroy (GtkWidget *child, GtkWidget *precious)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 if (GTK_IS_MENU_ITEM (child) && !GTK_IS_TEAROFF_MENU_ITEM (child))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 if (GTK_WIDGET_VISIBLE (child))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238 /* If we delete the menu item that was 'active' when the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239 menu was cancelled, GTK gets upset because it tries to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240 remove the focus rectangle from a (now) dead widget.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242 This widget will eventually get killed because it will
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243 not be visible the next time the window is shown.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 gtk_widget_set_sensitive (child, FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 gtk_widget_hide_all (child);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 gtk_widget_destroy (child);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255 /* If user_data != 0x00 then we are using a hook to build the menu. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257 __activate_menu(GtkMenuItem *item, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 Lisp_Object desc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260 gpointer force_clear = gtk_object_get_data (GTK_OBJECT (item), XEMACS_MENU_FIRSTTIME_TAG);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 gtk_object_set_data (GTK_OBJECT (item), XEMACS_MENU_FIRSTTIME_TAG, 0x00);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 /* Delete the old contents of the menu if we are the top level menubar */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 if (GTK_IS_MENU_BAR (GTK_WIDGET (item)->parent) || force_clear)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 GtkWidget *selected = gtk_menu_get_active (GTK_MENU (item->submenu));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 gtk_container_foreach (GTK_CONTAINER (item->submenu),(GtkCallback) __maybe_destroy,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 selected);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 else if (gtk_container_children (GTK_CONTAINER (item->submenu)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 809
diff changeset
277 desc = VOID_TO_LISP (gtk_object_get_data (GTK_OBJECT (item), XEMACS_MENU_DESCR_TAG));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 #ifdef TEAR_OFF_MENUS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 /* Lets stick in a detacher just for giggles */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 if (tear_off_menus && !gtk_container_children (GTK_CONTAINER (item->submenu)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 GtkWidget *w = gtk_tearoff_menu_item_new ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284 gtk_widget_show (w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285 gtk_menu_append (GTK_MENU (item->submenu), w);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 gtk_signal_connect (GTK_OBJECT (w), "activate", GTK_SIGNAL_FUNC (__torn_off_sir), item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290 if (user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 GUI_ID id = (GUI_ID) gtk_object_get_data (GTK_OBJECT (item), XEMACS_MENU_GUIID_TAG);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 Lisp_Object hook_fn;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 struct gcpro gcpro1, gcpro2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 809
diff changeset
296 hook_fn = VOID_TO_LISP (gtk_object_get_data (GTK_OBJECT (item), XEMACS_MENU_FILTER_TAG));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 GCPRO2 (desc, hook_fn);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 desc = call1 (hook_fn, desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304 ungcpro_popup_callbacks (id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 gcpro_popup_callbacks (id, desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 /* Build the child widgets */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 for (; !NILP (desc); desc = Fcdr (desc))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 GtkWidget *next = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312 Lisp_Object child = Fcar (desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 if (NILP (child)) /* the partition */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 /* Signal an error here? The NILP handling is handled a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 layer higher where appropriate */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 next = menu_descriptor_to_widget_1 (child);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 if (!next)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329 gtk_widget_show_all (next);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330 gtk_menu_append (GTK_MENU (item->submenu), next);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 /* This is called whenever an item with a GUI_ID associated with it is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 destroyed. This allows us to remove the references in gui-gtk.c
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 that made sure callbacks and such were GCPRO-ed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339 __remove_gcpro_by_id (gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 ungcpro_popup_callbacks ((GUI_ID) user_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 __kill_stupid_gtk_timer (GtkObject *obj, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 GtkMenuItem *mi = GTK_MENU_ITEM (obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349 if (mi->timer)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 gtk_timeout_remove (mi->timer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 mi->timer = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 static char *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 remove_underscores(const char *name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 char *rval = xmalloc_and_zero (strlen(name) + 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 int i,j;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 for (i = 0, j = 0; name[i]; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364 if (name[i]=='%') {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 i++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 if (!(name[i]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 if ((name[i] == '_'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 rval[j++] = name[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 return rval;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 /* This converts an entire menu into a GtkMenuItem (with an attached
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 submenu). A menu is a list of (STRING [:keyword value]+ [DESCR]+)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 DESCR is either a list (meaning a submenu), a vector, or nil (if
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 you include a :filter keyword) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 static GtkWidget *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 menu_convert (Lisp_Object desc, GtkWidget *reuse)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 GtkWidget *menu_item = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385 GtkWidget *submenu = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 Lisp_Object key, val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 Lisp_Object include_p = Qnil, hook_fn = Qnil, config_tag = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 Lisp_Object active_p = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 Lisp_Object accel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 int included_spec = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 int active_spec = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 if (STRINGP (XCAR (desc)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 accel = menu_name_to_accelerator (XSTRING_DATA (XCAR (desc)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 if (!reuse)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 char *temp_menu_name = remove_underscores (XSTRING_DATA (XCAR (desc)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 menu_item = gtk_menu_item_new_with_label (temp_menu_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401 free (temp_menu_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 menu_item = reuse;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 submenu = gtk_menu_new ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 gtk_widget_show (menu_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 gtk_widget_show (submenu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 if (!reuse)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 gtk_signal_connect (GTK_OBJECT (menu_item), "destroy",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 GTK_SIGNAL_FUNC (__kill_stupid_gtk_timer), NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 /* Without this sometimes a submenu gets left on the screen -
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 ** urk
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 if (GTK_MENU_ITEM (menu_item)->submenu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 gtk_widget_destroy (GTK_MENU_ITEM (menu_item)->submenu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), submenu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 /* We put this bogus menu item in so that GTK does the right
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427 ** thing when the menu is near the screen border.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
429 ** Aug 29, 2000
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432 GtkWidget *bogus_item = gtk_menu_item_new_with_label ("A suitably long label here...");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 gtk_object_set_data (GTK_OBJECT (menu_item), XEMACS_MENU_FIRSTTIME_TAG, (gpointer)0x01);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435 gtk_widget_show_all (bogus_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 gtk_menu_append (GTK_MENU (submenu), bogus_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 desc = Fcdr (desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 while (key = Fcar (desc), KEYWORDP (key))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 Lisp_Object cascade = desc;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 desc = Fcdr (desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 if (NILP (desc))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
446 sferror ("keyword in menu lacks a value",
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 cascade);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 val = Fcar (desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 desc = Fcdr (desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 if (EQ (key, Q_included))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 include_p = val, included_spec = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 else if (EQ (key, Q_config))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453 config_tag = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 else if (EQ (key, Q_filter))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 hook_fn = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 else if (EQ (key, Q_active))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
457 active_p = val, active_spec = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 else if (EQ (key, Q_accelerator))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
461 if ( SYMBOLP (val)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
462 || CHARP (val))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463 wv->accel = LISP_TO_VOID (val);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
465 invalid_argument ("bad keyboard accelerator", val);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
468 else if (EQ (key, Q_label))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
469 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470 /* implement in 21.2 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
471 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
473 invalid_argument ("unknown menu cascade keyword", cascade);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476 gtk_object_set_data (GTK_OBJECT (menu_item), XEMACS_MENU_DESCR_TAG, LISP_TO_VOID (desc));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477 gtk_object_set_data (GTK_OBJECT (menu_item), XEMACS_MENU_FILTER_TAG, LISP_TO_VOID (hook_fn));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 if ((!NILP (config_tag)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
480 && NILP (Fmemq (config_tag, Vmenubar_configuration)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481 || (included_spec && NILP (Feval (include_p))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 return (NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486 if (active_spec)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 active_p = Feval (active_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 gtk_widget_set_sensitive (GTK_WIDGET (menu_item), ! NILP (active_p));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
490 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
493 invalid_argument ("menu name (first element) must be a string",
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497 /* If we are reusing a widget, we need to make sure we clean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 ** everything up.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500 if (reuse)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 gpointer id = gtk_object_get_data (GTK_OBJECT (reuse), XEMACS_MENU_GUIID_TAG);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504 if (id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506 /* If the menu item had a GUI_ID that means it was a filter menu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 __remove_gcpro_by_id (id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 gtk_signal_disconnect_by_func (GTK_OBJECT (reuse),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509 GTK_SIGNAL_FUNC (__activate_menu),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510 (gpointer) 0x01 );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
511 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
514 gtk_signal_disconnect_by_func (GTK_OBJECT (reuse),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
515 GTK_SIGNAL_FUNC (__activate_menu),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
516 NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
517 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
518
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519 GTK_MENU_ITEM (reuse)->right_justify = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 if (NILP (hook_fn))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524 /* Generic menu builder */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
525 gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
526 GTK_SIGNAL_FUNC (__activate_menu),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
530 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
531 GUI_ID id = new_gui_id ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
532
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
533 gtk_object_set_data (GTK_OBJECT (menu_item), XEMACS_MENU_GUIID_TAG,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
534 (gpointer) id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
535
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
536 /* Make sure we gcpro the menu descriptions */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
537 gcpro_popup_callbacks (id, desc);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
538 gtk_object_weakref (GTK_OBJECT (menu_item), __remove_gcpro_by_id,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 (gpointer) id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541 gtk_signal_connect (GTK_OBJECT (menu_item), "activate",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 GTK_SIGNAL_FUNC (__activate_menu),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543 (gpointer) 0x01);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
545
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
546 return (menu_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
547 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 static struct frame *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
550 __get_channel (GtkWidget *w)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
551 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552 struct frame *f = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
554 for (; w; w = w->parent)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
555 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 if ((f = (struct frame *) gtk_object_get_data (GTK_OBJECT (w), "xemacs::frame")))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
557 return (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 return (selected_frame());
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 /* Called whenever a button, radio, or toggle is selected in the menu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
565 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
566 __generic_button_callback (GtkMenuItem *item, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 Lisp_Object callback, function, data, channel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
570 channel = wrap_frame (__get_channel (GTK_WIDGET (item)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 809
diff changeset
572 callback = VOID_TO_LISP (user_data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
574 get_gui_callback (callback, &function, &data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
575
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
576 signal_special_gtk_user_event (channel, function, data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
577 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
578
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579 /* Convert a single menu item descriptor to a suitable GtkMenuItem */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580 /* This function cannot GC.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 It is only called from menu_item_descriptor_to_widget_value, which
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 prohibits GC. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
583 static GtkWidget *menu_descriptor_to_widget_1 (Lisp_Object descr)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
584 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
585 if (STRINGP (descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
587 /* It is a separator. Unfortunately GTK does not allow us to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
588 specify what our separators look like, so we can't do all the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589 fancy stuff that the X code does.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 return (gtk_menu_item_new ());
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
593 else if (LISTP (descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595 /* It is a submenu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 return (menu_convert (descr, NULL));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
598 else if (VECTORP (descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
599 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
600 /* An actual menu item description! This gets yucky. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
601 Lisp_Object name = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602 Lisp_Object callback = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 Lisp_Object suffix = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
604 Lisp_Object active_p = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
605 Lisp_Object include_p = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606 Lisp_Object selected_p = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 Lisp_Object keys = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
608 Lisp_Object style = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
609 Lisp_Object config_tag = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
610 Lisp_Object accel = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 GtkWidget *main_label = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612 int length = XVECTOR_LENGTH (descr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613 Lisp_Object *contents = XVECTOR_DATA (descr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614 int plist_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
615 int selected_spec = 0, included_spec = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
616 GtkWidget *widget = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
617
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
618 if (length < 2)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
619 sferror ("button descriptors must be at least 2 long", descr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621 /* length 2: [ "name" callback ]
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
622 length 3: [ "name" callback active-p ]
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 length 4: [ "name" callback active-p suffix ]
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624 or [ "name" callback keyword value ]
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625 length 5+: [ "name" callback [ keyword value ]+ ]
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
627 plist_p = (length >= 5 || (length > 2 && KEYWORDP (contents [2])));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
628
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 if (!plist_p && length > 2)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
630 /* the old way */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
631 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
632 name = contents [0];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633 callback = contents [1];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
634 active_p = contents [2];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
635 if (length == 4)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
636 suffix = contents [3];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
637 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
638 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
639 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
640 /* the new way */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642 if (length & 1)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
643 sferror (
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644 "button descriptor has an odd number of keywords and values",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645 descr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647 name = contents [0];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
648 callback = contents [1];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
649 for (i = 2; i < length;)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
650 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
651 Lisp_Object key = contents [i++];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
652 Lisp_Object val = contents [i++];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
653 if (!KEYWORDP (key))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
654 invalid_argument_2 ("not a keyword", key, descr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
655
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
656 if (EQ (key, Q_active)) active_p = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657 else if (EQ (key, Q_suffix)) suffix = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658 else if (EQ (key, Q_keys)) keys = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659 else if (EQ (key, Q_key_sequence)) ; /* ignored for FSF compat */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
660 else if (EQ (key, Q_label)) ; /* implement for 21.0 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
661 else if (EQ (key, Q_style)) style = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
662 else if (EQ (key, Q_selected)) selected_p = val, selected_spec = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663 else if (EQ (key, Q_included)) include_p = val, included_spec = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
664 else if (EQ (key, Q_config)) config_tag = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
665 else if (EQ (key, Q_accelerator))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667 if ( SYMBOLP (val) || CHARP (val))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 accel = val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
669 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
670 invalid_argument ("bad keyboard accelerator", val);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672 else if (EQ (key, Q_filter))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
673 sferror(":filter keyword not permitted on leaf nodes", descr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
675 invalid_argument_2 ("unknown menu item keyword", key, descr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
676 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
679 #ifdef HAVE_MENUBARS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
680 if ((!NILP (config_tag) && NILP (Fmemq (config_tag, Vmenubar_configuration)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 || (included_spec && NILP (Feval (include_p))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 /* the include specification says to ignore this item. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
684 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
685 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686 #endif /* HAVE_MENUBARS */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 CHECK_STRING (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690 if (NILP (accel))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
691 accel = menu_name_to_accelerator (XSTRING_DATA (name));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
692
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693 if (!NILP (suffix))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
694 suffix = Feval (suffix);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696 if (!separator_string_p (XSTRING_DATA (name)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 char *label_buffer = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699 char *temp_label = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
700
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 if (STRINGP (suffix) && XSTRING_LENGTH (suffix))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702 {
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 833
diff changeset
703 label_buffer = ALLOCA (XSTRING_LENGTH (name) + 15 + XSTRING_LENGTH (suffix));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
704 sprintf (label_buffer, "%s %s ", XSTRING_DATA (name), XSTRING_DATA (suffix));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
705 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
706 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
707 {
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 833
diff changeset
708 label_buffer = ALLOCA (XSTRING_LENGTH (name) + 15);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709 sprintf (label_buffer, "%s ", XSTRING_DATA (name));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
710 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
712 temp_label = remove_underscores (label_buffer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
713 main_label = gtk_accel_label_new (temp_label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714 free (temp_label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
715 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
716
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 /* Evaluate the selected and active items now */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 if (selected_spec)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
719 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720 if (NILP (selected_p) || EQ (selected_p, Qt))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 /* Do nothing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
725 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726 selected_p = Feval (selected_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
729
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
730 if (NILP (active_p) || EQ (active_p, Qt))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
731 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
732 /* Do Nothing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
734 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
735 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 active_p = Feval (active_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
737 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
738
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739 if (0 ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
740 #ifdef HAVE_MENUBARS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
741 menubar_show_keybindings
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
742 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
743 )
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
745 /* Need to get keybindings */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
746 if (!NILP (keys))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
747 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 /* User-specified string to generate key bindings with */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749 CHECK_STRING (keys);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
750
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
751 keys = Fsubstitute_command_keys (keys);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 else if (SYMBOLP (callback))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
755 DECLARE_EISTRING_MALLOC (buf);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757 /* #### Warning, dependency here on current_buffer and point */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758 where_is_to_char (callback, buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759
833
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
760 if (eilen (buf) > 0)
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
761 keys = eimake_string (buf);
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
762 else
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
763 {
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
764
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
765 keys = Qnil;
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
766 }
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
767
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
768 eifree (buf);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772 /* Now we get down to the dirty business of creating the widgets */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
773 if (NILP (style) || EQ (style, Qtext) || EQ (style, Qbutton))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
774 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
775 /* A normal menu item */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776 widget = gtk_menu_item_new ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778 else if (EQ (style, Qtoggle) || EQ (style, Qradio))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
779 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
780 /* They are radio or toggle buttons.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
781
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782 XEmacs' menu descriptions are fairly lame in that they do
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
783 not have the idea of a 'group' of radio buttons. They
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
784 are exactly like toggle buttons except that they get
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785 drawn differently.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
787 GTK rips us a new one again. If you have a radio button
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
788 in a group by itself, it always draws it as highlighted.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
789 So we dummy up and create a second radio button that does
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
790 not get added to the menu, but gets invisibly set/unset
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
791 when the other gets unset/set. *sigh*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
793 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
794 if (EQ (style, Qradio))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
796 GtkWidget *dummy_sibling = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
797 GSList *group = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
798
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
799 dummy_sibling = gtk_radio_menu_item_new (group);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
800 group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (dummy_sibling));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
801 widget = gtk_radio_menu_item_new (group);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
802
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
803 /* We need to notice when the 'real' one gets destroyed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
804 so we can clean up the dummy as well. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
805 gtk_object_weakref (GTK_OBJECT (widget),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
806 (GtkDestroyNotify) gtk_widget_destroy,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
807 dummy_sibling);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
808 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
810 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
811 widget = gtk_check_menu_item_new ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
812 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
813
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
814 /* What horrible defaults you have GTK dear! The default
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
815 for a toggle menu item is to not show the toggle unless it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
816 is turned on or actively highlighted. How absolutely
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
817 hideous. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
818 gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
819 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
820 NILP (selected_p) ? FALSE : TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
823 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
824 invalid_argument_2 ("unknown style", style, descr);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
825 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
826
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
827 gtk_widget_set_sensitive (widget, ! NILP (active_p));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
828
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
829 gtk_signal_connect (GTK_OBJECT (widget), "activate-item",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
830 GTK_SIGNAL_FUNC (__generic_button_callback),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 LISP_TO_VOID (callback));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
832
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
833 gtk_signal_connect (GTK_OBJECT (widget), "activate",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
834 GTK_SIGNAL_FUNC (__generic_button_callback),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
835 LISP_TO_VOID (callback));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
836
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
837 /* We cheat here... GtkAccelLabel usually builds its
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
838 `accel_string' from the widget it is attached to, but we do
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839 not want to go thru the overhead of converting our nice
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840 string back into the modifier + key format that requires,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
841 just so that they can convert it back into a (possibly
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
842 different/wrong) string
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
843
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
844 We set the label string manually, and things should 'just
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
845 work'
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
846
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 In an ideal world we would just subclass GtkLabel ourselves,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
848 but I have known for a very long time that this is not an
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
849 ideal world.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
850
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
851 #### Should do menu shortcuts `correctly' one of these days.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854 if (main_label)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
855 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
856 GtkAccelLabel *l = GTK_ACCEL_LABEL (main_label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
858 gtk_container_add (GTK_CONTAINER (widget), main_label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
860 gtk_accel_label_set_accel_widget (l, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861 gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863 if (STRINGP (keys) && XSTRING_LENGTH (keys))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864 {
833
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
865 C_STRING_TO_EXTERNAL_MALLOC (XSTRING_DATA (keys), l->accel_string,
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
866 Qctext);
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
867 stderr_out ("accel: %s\n", l->accel_string);
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
868 }
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
869 else
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
870 {
ee2d33cfc3c1 [xemacs-hg @ 2002-05-09 13:49:39 by wmperry]
wmperry
parents: 826
diff changeset
871 // l->accel_string = "";
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
872 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 return (widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
877 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
878 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 return (NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 /* abort (); ???? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
881 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
882 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
883
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
884 static GtkWidget *menu_descriptor_to_widget (Lisp_Object descr)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
885 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
886 GtkWidget *rval = NULL;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 714
diff changeset
887 int count = begin_gc_forbidden ();
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
888
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
889 /* Cannot GC from here on out... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
890 rval = menu_descriptor_to_widget_1 (descr);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 714
diff changeset
891 unbind_to (count);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
892 return (rval);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
893
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
894 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
895
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
896 static gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897 menu_can_reuse_widget (GtkWidget *child, const char *label)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
898 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
899 /* Everything up at the top level was done using
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
900 ** gtk_menu_item_new_with_label(), but we still double check to make
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901 ** sure we don't seriously foobar ourselves.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
903 char *temp_label = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
904 gpointer possible_child = g_list_nth_data (gtk_container_children (GTK_CONTAINER (child)), 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
905
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
906 if (possible_child && GTK_IS_LABEL (possible_child))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
907 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
908 if (!temp_label) temp_label = remove_underscores (label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
909 if (!strcmp (GTK_LABEL (possible_child)->label, temp_label))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
910 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
911 free (temp_label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
914 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
915 if (temp_label) free (temp_label);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
918
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
919 /* Converts a menubar description into a GtkMenuBar... a menubar is a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920 list of menus or buttons
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
923 menu_create_menubar (struct frame *f, Lisp_Object descr)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
924 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
925 gboolean right_justify = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
926 Lisp_Object tail = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 Lisp_Object value = descr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
928 Lisp_Object item_descr = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929 GtkWidget *menubar = FRAME_GTK_MENUBAR_WIDGET (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 GUI_ID id = (GUI_ID) gtk_object_get_data (GTK_OBJECT (menubar), XEMACS_MENU_GUIID_TAG);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931 guint menu_position = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
933 /* Remove any existing protection for old menu items */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
934 ungcpro_popup_callbacks (id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
935
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
936 /* GCPRO the whole damn thing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
937 gcpro_popup_callbacks (id, descr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
938
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
939 EXTERNAL_LIST_LOOP (tail, value)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
940 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
941 gpointer current_child = g_list_nth_data (GTK_MENU_SHELL (menubar)->children, menu_position);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
942
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
943 item_descr = XCAR (tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
944
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
945 if (NILP (item_descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
946 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
947 /* Need to start right-justifying menus */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
948 right_justify = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
949 menu_position--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
950 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951 else if (VECTORP (item_descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953 /* It is a button description */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954 GtkWidget *item;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956 item = menu_descriptor_to_widget (item_descr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957 gtk_widget_set_name (item, "XEmacsMenuButton");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 if (!item)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961 item = gtk_menu_item_new_with_label ("ITEM CREATION ERROR");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
963
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964 gtk_widget_show_all (item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965 if (current_child) gtk_widget_destroy (GTK_WIDGET (current_child));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 gtk_menu_bar_insert (GTK_MENU_BAR (menubar), item, menu_position);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
967 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
968 else if (LISTP (item_descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
969 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
970 /* Need to actually convert it into a menu and slap it in */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 GtkWidget *widget;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972 gboolean reused_p = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974 /* We may be able to reuse the widget, let's at least check. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 if (current_child && menu_can_reuse_widget (GTK_WIDGET (current_child),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
976 XSTRING_DATA (XCAR (item_descr))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978 widget = menu_convert (item_descr, GTK_WIDGET (current_child));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
979 reused_p = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 widget = menu_convert (item_descr, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984 if (current_child) gtk_widget_destroy (GTK_WIDGET (current_child));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 gtk_menu_bar_insert (GTK_MENU_BAR (menubar), widget, menu_position);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
986 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
987
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988 if (widget)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
989 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
990 if (right_justify) gtk_menu_item_right_justify (GTK_MENU_ITEM (widget));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
991 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
992 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
993 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
994 widget = gtk_menu_item_new_with_label ("ERROR");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
995 /* abort() */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
996 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 gtk_widget_show_all (widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 else if (STRINGP (item_descr))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001 /* Do I really want to be this careful? Anything else in a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002 menubar description is illegal */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 menu_position++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007 /* Need to delete any menu items that were past the bounds of the new one */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1008 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009 GList *l = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1011 while ((l = g_list_nth (GTK_MENU_SHELL (menubar)->children, menu_position)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1012 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013 gpointer data = l->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 g_list_remove_link (GTK_MENU_SHELL (menubar)->children, l);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016 if (data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1018 gtk_widget_destroy (GTK_WIDGET (data));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1019 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1020 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1024
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1025 /* Deal with getting/setting the menubar */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026 #ifndef GNOME_IS_APP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1027 #define GNOME_IS_APP(x) 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1028 #define gnome_app_set_menus(x,y)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1029 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031 static gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1032 run_menubar_hook (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 if (!GTK_MENU_SHELL(widget)->active)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1036 run_hook (Qactivate_menubar_hook);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1037 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 return(FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1041 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042 create_menubar_widget (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1044 GUI_ID id = new_gui_id ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1045 GtkWidget *handlebox = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 GtkWidget *menubar = gtk_xemacs_menubar_new (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1047
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1048 if (GNOME_IS_APP (FRAME_GTK_SHELL_WIDGET (f)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1049 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050 gnome_app_set_menus (GNOME_APP (FRAME_GTK_SHELL_WIDGET (f)), GTK_MENU_BAR (menubar));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1051 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1052 else if (dockable_menubar)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1053 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1054 handlebox = gtk_handle_box_new ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1055 gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (handlebox), GTK_POS_LEFT);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1056 gtk_container_add (GTK_CONTAINER (handlebox), menubar);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1057 gtk_box_pack_start (GTK_BOX (FRAME_GTK_CONTAINER_WIDGET (f)), handlebox, FALSE, FALSE, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1058 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1059 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1060 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1061 gtk_box_pack_start (GTK_BOX (FRAME_GTK_CONTAINER_WIDGET (f)), menubar, FALSE, FALSE, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1062 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1064 gtk_signal_connect (GTK_OBJECT (menubar), "button-press-event",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1065 GTK_SIGNAL_FUNC (run_menubar_hook), NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1066
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1067 FRAME_GTK_MENUBAR_WIDGET (f) = menubar;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068 gtk_object_set_data (GTK_OBJECT (menubar), XEMACS_MENU_GUIID_TAG, (gpointer) id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1069 gtk_object_weakref (GTK_OBJECT (menubar), __remove_gcpro_by_id, (gpointer) id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1070 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1071
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 set_frame_menubar (struct frame *f, int first_time_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1074 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1075 Lisp_Object menubar;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1076 int menubar_visible;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1077 /* As for the toolbar, the minibuffer does not have its own menubar. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078 struct window *w = XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080 if (! FRAME_GTK_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1082
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1083 /***** first compute the contents of the menubar *****/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1085 if (! first_time_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1086 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1087 /* evaluate `current-menubar' in the buffer of the selected window
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1088 of the frame in question. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1089 menubar = symbol_value_in_buffer (Qcurrent_menubar, w->buffer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 /* That's a little tricky the first time since the frame isn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094 fully initialized yet. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095 menubar = Fsymbol_value (Qcurrent_menubar);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1097
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1098 if (NILP (menubar))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 menubar = Vblank_menubar;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 menubar_visible = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1103 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1104 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105 menubar_visible = !NILP (w->menubar_visible_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1108 if (!FRAME_GTK_MENUBAR_WIDGET (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1109 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1110 create_menubar_widget (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1111 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1112
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113 /* Populate the menubar, but nothing is shown yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1114 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1115 Lisp_Object old_buffer;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1116 int count = specpdl_depth ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1117
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1118 old_buffer = Fcurrent_buffer ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1119 record_unwind_protect (Fset_buffer, old_buffer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1120 Fset_buffer (XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1121
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1122 menu_create_menubar (f, menubar);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1123
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1124 Fset_buffer (old_buffer);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 714
diff changeset
1125 unbind_to (count);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1126 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1127
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1128 FRAME_MENUBAR_DATA (f) = Fcons (XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f))->buffer, Qt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130 return (menubar_visible);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1132
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133 /* Called from gtk_create_widgets() to create the inital menubar of a frame
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 before it is mapped, so that the window is mapped with the menubar already
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 there instead of us tacking it on later and thrashing the window after it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136 is visible. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137 int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1138 gtk_initialize_frame_menubar (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1139 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140 create_menubar_widget (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141 return set_frame_menubar (f, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1144
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1145 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1146 gtk_update_frame_menubar_internal (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1147 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1148 /* We assume the menubar contents has changed if the global flag is set,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1149 or if the current buffer has changed, or if the menubar has never
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1150 been updated before.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1151 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1152 int menubar_contents_changed =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1153 (f->menubar_changed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1154 || NILP (FRAME_MENUBAR_DATA (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1155 || (!EQ (XFRAME_MENUBAR_DATA_LASTBUFF (f),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1156 XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f))->buffer)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1157
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1158 gboolean menubar_was_visible = GTK_WIDGET_VISIBLE (FRAME_GTK_MENUBAR_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1159 gboolean menubar_will_be_visible = menubar_was_visible;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1160 gboolean menubar_visibility_changed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1161
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1162 if (menubar_contents_changed)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1163 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1164 menubar_will_be_visible = set_frame_menubar (f, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1165 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1166
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1167 menubar_visibility_changed = menubar_was_visible != menubar_will_be_visible;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1168
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169 if (!menubar_visibility_changed)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1171 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1172 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 /* We hide and show the menubar's parent (which is actually the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1175 GtkHandleBox)... this is to simplify the code that destroys old
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1176 menu items, etc. There is no easy way to get the child out of a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1177 handle box, and I didn't want to add yet another stupid widget
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1178 slot to struct gtk_frame. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1179 if (menubar_will_be_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1180 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1181 gtk_widget_show_all (FRAME_GTK_MENUBAR_WIDGET (f)->parent);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185 gtk_widget_hide_all (FRAME_GTK_MENUBAR_WIDGET (f)->parent);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1187
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1188 MARK_FRAME_SIZE_SLIPPED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1189 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1190
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1191 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1192 gtk_update_frame_menubars (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 GtkWidget *menubar = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1196 assert (FRAME_GTK_P (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1197
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1198 menubar = FRAME_GTK_MENUBAR_WIDGET (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1199
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200 if ((GTK_MENU_SHELL (menubar)->active) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201 (GTK_MENU_SHELL (menubar)->have_grab) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1202 (GTK_MENU_SHELL (menubar)->have_xgrab))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1204 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1205 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1206
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1207 gtk_update_frame_menubar_internal (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211 gtk_free_frame_menubars (struct frame *f)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213 GtkWidget *menubar_widget;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1214
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215 assert (FRAME_GTK_P (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217 menubar_widget = FRAME_GTK_MENUBAR_WIDGET (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218 if (menubar_widget)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1219 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1220 gtk_widget_destroy (menubar_widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1223
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224 static void popdown_menu_cb (GtkMenuShell *menu, gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226 popup_up_p--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1229 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1230 gtk_popup_menu (Lisp_Object menu_desc, Lisp_Object event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 struct Lisp_Event *eev = NULL;
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1233 GtkWidget *widget = NULL;
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1234 GtkWidget *menu = NULL;
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1235 gpointer id = NULL;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1237 /* Do basic error checking first... */
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1238 if (SYMBOLP (menu_desc))
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1239 menu_desc = Fsymbol_value (menu_desc);
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1240 CHECK_CONS (menu_desc);
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1241 CHECK_STRING (XCAR (menu_desc));
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1242
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1243 /* Now lets get down to business... */
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1244 widget = menu_descriptor_to_widget (menu_desc);
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1245 menu = GTK_MENU_ITEM (widget)->submenu;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1246 gtk_widget_set_name (widget, "XEmacsPopupMenu");
714
02339d4ebed4 [xemacs-hg @ 2001-12-23 20:28:19 by wmperry]
wmperry
parents: 563
diff changeset
1247 id = gtk_object_get_data (GTK_OBJECT (widget), XEMACS_MENU_GUIID_TAG);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1248
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1249 __activate_menu (GTK_MENU_ITEM (widget), id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1250
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1251 if (!NILP (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1252 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1253 CHECK_LIVE_EVENT (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1254 eev = XEVENT (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1255
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1256 if ((eev->event_type != button_press_event) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1257 (eev->event_type != button_release_event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1258 wrong_type_argument (Qmouse_event_p, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1259 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1260 else if (!NILP (Vthis_command_keys))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1261 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1262 /* If an event wasn't passed, use the last event of the event
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1263 sequence currently being executed, if that event is a mouse
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1264 event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1265 eev = XEVENT (Vthis_command_keys);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1266 if ((eev->event_type != button_press_event) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1267 (eev->event_type != button_release_event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1268 eev = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1269 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1270
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1271 gtk_widget_show (menu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1272
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1273 popup_up_p++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1274 gtk_signal_connect (GTK_OBJECT (menu), "deactivate",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1275 GTK_SIGNAL_FUNC (popdown_menu_cb), NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1276
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1277 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1278 eev ? eev->event.button.button : 0,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1279 eev ? eev->timestamp : GDK_CURRENT_TIME);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1280 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1281
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1282 DEFUN ("gtk-build-xemacs-menu", Fgtk_build_xemacs_menu, 1, 1, 0, /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1283 Returns a GTK menu item from MENU, a standard XEmacs menu description.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1284 See the definition of `popup-menu' for more information on the format of MENU.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1285 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1286 (menu))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1287 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1288 GtkWidget *w = menu_descriptor_to_widget (menu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1289
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1290 return (w ? build_gtk_object (GTK_OBJECT (w)) : Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1291 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1292
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1293
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1294 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1295 syms_of_menubar_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297 DEFSUBR (Fgtk_build_xemacs_menu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1300 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1301 console_type_create_menubar_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1302 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1303 CONSOLE_HAS_METHOD (gtk, update_frame_menubars);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1304 CONSOLE_HAS_METHOD (gtk, free_frame_menubars);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1305 CONSOLE_HAS_METHOD (gtk, popup_menu);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1306 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1307
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1308 void reinit_vars_of_menubar_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1309 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1310 dockable_menubar = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1311 #ifdef TEAR_OFF_MENUS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1312 tear_off_menus = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1313 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1314 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1315
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1316 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1317 vars_of_menubar_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1318 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1319 Fprovide (intern ("gtk-menubars"));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 DEFVAR_BOOL ("menubar-dockable-p", &dockable_menubar /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 If non-nil, the frame menubar can be detached into its own top-level window.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 #ifdef TEAR_OFF_MENUS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324 DEFVAR_BOOL ("menubar-tearable-p", &tear_off_menus /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325 If non-nil, menus can be torn off into their own top-level windows.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1326 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1327 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 reinit_vars_of_menubar_gtk ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329 }