*** empty log message ***
[bpt/emacs.git] / lwlib / lwlib-Xlw.c
CommitLineData
07bf635f
RS
1/* The lwlib interface to "xlwmenu" menus.
2 Copyright (C) 1992 Lucid, Inc.
e226063c 3 Copyright (C) 1994, 2000, 2001 Free Software Foundation, Inc.
07bf635f
RS
4
5This file is part of the Lucid Widget Library.
6
177c0ea7 7The Lucid Widget Library is free software; you can redistribute it and/or
07bf635f
RS
8modify it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 1, or (at your option)
10any later version.
11
12The Lucid Widget Library is distributed in the hope that it will be useful,
177c0ea7 13but WITHOUT ANY WARRANTY; without even the implied warranty of
07bf635f
RS
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
07bf635f 21
0f0912e6
PE
22#ifdef HAVE_CONFIG_H
23#include <config.h>
24#endif
25
e226063c 26#include "lisp.h"
2f96293d 27
07bf635f
RS
28#include "lwlib-Xlw.h"
29#include <X11/StringDefs.h>
30#include <X11/IntrinsicP.h>
31#include <X11/ObjectP.h>
32#include <X11/CompositeP.h>
33#include <X11/Shell.h>
34#include "xlwmenu.h"
35
d3a785ff
GM
36#if 0
37
38#include <stdio.h>
39
40/* Print the complete X resource name of widget WIDGET to stderr.
41 This is sometimes handy to have available. */
42
43void
44x_print_complete_resource_name (widget)
45 Widget widget;
46{
47 int i;
48 String names[100];
49
50 for (i = 0; i < 100 && widget != NULL; ++i)
51 {
52 names[i] = XtName (widget);
53 widget = XtParent (widget);
54 }
55
56 for (--i; i >= 1; --i)
57 fprintf (stderr, "%s.", names[i]);
58 fprintf (stderr, "%s\n", names[0]);
59}
60
61#endif /* 0 */
62
63
07bf635f 64\f/* Menu callbacks */
fa616ec4
GM
65
66/* Callback XtNhighlightCallback for Lucid menus. W is the menu
67 widget, CLIENT_DATA contains a pointer to the widget_instance
68 for the menu, CALL_DATA contains a pointer to the widget_value
69 structure for the highlighted menu item. The latter may be null
70 if there isn't any highlighted menu item. */
71
72static void
73highlight_hook (w, client_data, call_data)
74 Widget w;
75 XtPointer client_data;
76 XtPointer call_data;
77{
78 widget_instance *instance = (widget_instance *) client_data;
79
80 if (instance->info->highlight_cb
81 && !w->core.being_destroyed)
82 instance->info->highlight_cb (w, instance->info->id, call_data);
83}
84
07bf635f 85static void
345a94f9
RS
86pre_hook (w, client_data, call_data)
87 Widget w;
88 XtPointer client_data;
89 XtPointer call_data;
07bf635f
RS
90{
91 widget_instance* instance = (widget_instance*)client_data;
92 widget_value* val;
93
94 if (w->core.being_destroyed)
95 return;
96
97 val = lw_get_widget_value_for_widget (instance, w);
98 if (instance->info->pre_activate_cb)
99 instance->info->pre_activate_cb (w, instance->info->id,
100 val ? val->call_data : NULL);
101}
102
103static void
345a94f9
RS
104pick_hook (w, client_data, call_data)
105 Widget w;
106 XtPointer client_data;
107 XtPointer call_data;
07bf635f
RS
108{
109 widget_instance* instance = (widget_instance*)client_data;
110 widget_value* contents_val = (widget_value*)call_data;
111 widget_value* widget_val;
112 XtPointer widget_arg;
113
114 if (w->core.being_destroyed)
115 return;
116
117 if (instance->info->selection_cb && contents_val && contents_val->enabled
118 && !contents_val->contents)
119 instance->info->selection_cb (w, instance->info->id,
120 contents_val->call_data);
121
122 widget_val = lw_get_widget_value_for_widget (instance, w);
123 widget_arg = widget_val ? widget_val->call_data : NULL;
124 if (instance->info->post_activate_cb)
125 instance->info->post_activate_cb (w, instance->info->id, widget_arg);
126
127}
128
129\f/* creation functions */
0b96f00b 130
07bf635f 131static Widget
345a94f9
RS
132xlw_create_menubar (instance)
133 widget_instance* instance;
07bf635f 134{
9acc68b1 135 Widget widget;
5acc1a62 136 Arg al[5];
c52de5eb 137 int ac = 0;
9acc68b1 138
c52de5eb 139 XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
5acc1a62
PR
140#ifdef emacs
141 XtSetArg (al[ac], XtNshowGrip, 0); ac++;
142 XtSetArg (al[ac], XtNresizeToPreferred, 1); ac++;
143 XtSetArg (al[ac], XtNallowResize, 1); ac++;
144#endif
9acc68b1 145
c52de5eb
RS
146 /* This used to use XtVaCreateWidget, but an old Xt version
147 has a bug in XtVaCreateWidget that frees instance->info->name. */
364e6904 148 widget
c52de5eb
RS
149 = XtCreateWidget (instance->info->name, xlwMenuWidgetClass,
150 instance->parent, al, ac);
19240c20 151
07bf635f
RS
152 XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance);
153 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
fa616ec4
GM
154 XtAddCallback (widget, XtNhighlightCallback, highlight_hook,
155 (XtPointer)instance);
07bf635f
RS
156 return widget;
157}
158
159static Widget
345a94f9
RS
160xlw_create_popup_menu (instance)
161 widget_instance* instance;
07bf635f 162{
364e6904
RS
163 Widget popup_shell
164 = XtCreatePopupShell (instance->info->name, overrideShellWidgetClass,
165 instance->parent, NULL, 0);
177c0ea7 166
19240c20 167 Widget widget;
c52de5eb
RS
168 Arg al[2];
169 int ac = 0;
19240c20 170
c52de5eb
RS
171 XtSetArg (al[ac], XtNmenu, instance->info->val); ac++;
172 XtSetArg (al[ac], XtNhorizontal, False); ac++;
19240c20 173
c52de5eb
RS
174 /* This used to use XtVaManagedCreateWidget, but an old Xt version
175 has a bug in XtVaManagedCreateWidget that frees instance->info->name. */
364e6904 176 widget
c52de5eb
RS
177 = XtCreateManagedWidget ("popup", xlwMenuWidgetClass,
178 popup_shell, al, ac);
19240c20 179
07bf635f 180 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
fa616ec4
GM
181 XtAddCallback (widget, XtNhighlightCallback, highlight_hook,
182 (XtPointer)instance);
6b61353c 183
07bf635f
RS
184 return popup_shell;
185}
186
177c0ea7 187widget_creation_entry
07bf635f
RS
188xlw_creation_table [] =
189{
190 {"menubar", xlw_create_menubar},
191 {"popup", xlw_create_popup_menu},
192 {NULL, NULL}
193};
194
195Boolean
345a94f9
RS
196lw_lucid_widget_p (widget)
197 Widget widget;
07bf635f
RS
198{
199 WidgetClass the_class = XtClass (widget);
364e6904 200
07bf635f
RS
201 if (the_class == xlwMenuWidgetClass)
202 return True;
203 if (the_class == overrideShellWidgetClass)
364e6904
RS
204 return (XtClass (((CompositeWidget)widget)->composite.children [0])
205 == xlwMenuWidgetClass);
07bf635f
RS
206 return False;
207}
208
209void
e226063c
DL
210#ifdef PROTOTYPES
211xlw_update_one_widget (widget_instance* instance, Widget widget,
212 widget_value* val, Boolean deep_p)
213#else
345a94f9
RS
214xlw_update_one_widget (instance, widget, val, deep_p)
215 widget_instance* instance;
216 Widget widget;
217 widget_value* val;
218 Boolean deep_p;
e226063c 219#endif
07bf635f 220{
c52de5eb 221 Arg al[1];
07bf635f 222
c52de5eb
RS
223 /* This used to use XtVaSetValues, but some old Xt versions
224 that have a bug in XtVaCreateWidget might have it here too. */
225 XtSetArg (al[0], XtNmenu, instance->info->val);
226
227 XtSetValues (widget, al, 1);
07bf635f
RS
228}
229
230void
345a94f9
RS
231xlw_update_one_value (instance, widget, val)
232 widget_instance* instance;
233 Widget widget;
234 widget_value* val;
07bf635f
RS
235{
236 return;
237}
238
239void
e226063c
DL
240#ifdef PROTOTYPES
241xlw_pop_instance (widget_instance* instance, Boolean up)
242#else
345a94f9
RS
243xlw_pop_instance (instance, up)
244 widget_instance* instance;
245 Boolean up;
e226063c 246#endif
07bf635f
RS
247{
248}
249
250void
0c7c510c 251xlw_popup_menu (widget, event)
345a94f9 252 Widget widget;
0c7c510c 253 XEvent *event;
07bf635f 254{
07bf635f
RS
255 XlwMenuWidget mw;
256
257 if (!XtIsShell (widget))
258 return;
259
260 mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0];
261
0c7c510c 262 if (event)
6b61353c 263 XtCallActionProc ((Widget) mw, "start", event, NULL, 0);
0c7c510c
RS
264 else
265 {
6b61353c
KH
266 XEvent dummy;
267 XButtonPressedEvent *bd = &dummy.xbutton;
268
269 bd->type = ButtonPress;
270 bd->serial = 0;
271 bd->send_event = 0;
272 bd->display = XtDisplay (widget);
273 bd->window = XtWindow (XtParent (widget));
274 bd->time = CurrentTime;
275 bd->button = 0;
276 XQueryPointer (bd->display, bd->window, &bd->root,
277 &bd->subwindow, &bd->x_root, &bd->y_root,
278 &bd->x, &bd->y, &bd->state);
279
280 XtCallActionProc ((Widget) mw, "start", &dummy, NULL, 0);
0c7c510c 281 }
07bf635f
RS
282}
283
284\f/* Destruction of instances */
285void
345a94f9
RS
286xlw_destroy_instance (instance)
287 widget_instance* instance;
07bf635f
RS
288{
289 if (instance->widget)
290 XtDestroyWidget (instance->widget);
291}
292
6b61353c
KH
293/* arch-tag: 541e3912-477d-406e-9bf2-dbf2b7ff8c3b
294 (do not change this comment) */