Mercurial > emacs
annotate lwlib/lwlib-Xlw.c @ 6009:f68004daa523
*** empty log message ***
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 19 Feb 1994 20:53:26 +0000 |
parents | 5feb28cb62c8 |
children | 7988b8acd29f |
rev | line source |
---|---|
5626 | 1 /* The lwlib interface to "xlwmenu" menus. |
2 Copyright (C) 1992 Lucid, Inc. | |
3 | |
4 This file is part of the Lucid Widget Library. | |
5 | |
6 The Lucid Widget Library is free software; you can redistribute it and/or | |
7 modify it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 1, or (at your option) | |
9 any later version. | |
10 | |
11 The Lucid Widget Library is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
19 | |
20 #include "lwlib-Xlw.h" | |
21 #include <X11/StringDefs.h> | |
22 #include <X11/IntrinsicP.h> | |
23 #include <X11/ObjectP.h> | |
24 #include <X11/CompositeP.h> | |
25 #include <X11/Shell.h> | |
26 #include "xlwmenu.h" | |
27 | |
28 /* Menu callbacks */ | |
29 static void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
30 pre_hook (w, client_data, call_data) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
31 Widget w; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
32 XtPointer client_data; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
33 XtPointer call_data; |
5626 | 34 { |
35 widget_instance* instance = (widget_instance*)client_data; | |
36 widget_value* val; | |
37 | |
38 if (w->core.being_destroyed) | |
39 return; | |
40 | |
41 val = lw_get_widget_value_for_widget (instance, w); | |
42 if (instance->info->pre_activate_cb) | |
43 instance->info->pre_activate_cb (w, instance->info->id, | |
44 val ? val->call_data : NULL); | |
45 } | |
46 | |
47 static void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
48 pick_hook (w, client_data, call_data) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
49 Widget w; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
50 XtPointer client_data; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
51 XtPointer call_data; |
5626 | 52 { |
53 widget_instance* instance = (widget_instance*)client_data; | |
54 widget_value* contents_val = (widget_value*)call_data; | |
55 widget_value* widget_val; | |
56 XtPointer widget_arg; | |
57 | |
58 if (w->core.being_destroyed) | |
59 return; | |
60 | |
61 if (instance->info->selection_cb && contents_val && contents_val->enabled | |
62 && !contents_val->contents) | |
63 instance->info->selection_cb (w, instance->info->id, | |
64 contents_val->call_data); | |
65 | |
66 widget_val = lw_get_widget_value_for_widget (instance, w); | |
67 widget_arg = widget_val ? widget_val->call_data : NULL; | |
68 if (instance->info->post_activate_cb) | |
69 instance->info->post_activate_cb (w, instance->info->id, widget_arg); | |
70 | |
71 } | |
72 | |
73 /* creation functions */ | |
5993
5feb28cb62c8
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5983
diff
changeset
|
74 |
5626 | 75 static Widget |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
76 xlw_create_menubar (instance) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
77 widget_instance* instance; |
5626 | 78 { |
5951
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
79 Widget widget; |
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
80 |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
81 /* Don't use malloc_widget_value, because the freeing will be done by free. |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
82 (Also it wastes time calling memset). */ |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
83 widget_value *tem = (widget_value *) malloc (sizeof (widget_value)); |
5951
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
84 |
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
85 /* _XtCreate is freeing the object we passed, |
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
86 so make a copy that we free later. */ |
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
87 bcopy (instance->info->val, tem, sizeof (widget_value)); |
ddd8c555b2fc
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5708
diff
changeset
|
88 |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
89 widget |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
90 = XtVaCreateWidget (instance->info->name, xlwMenuWidgetClass, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
91 instance->parent, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
92 XtNmenu, tem, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
93 0); |
5952
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
94 |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
95 #if 0 /* XtVaCreateWidget frees this, at least in the X11R4 |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
96 version that is running on mole.gnu.ai.mit.edu. */ |
5993
5feb28cb62c8
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5983
diff
changeset
|
97 free_widget_value (tem); |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
98 #endif |
5952
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
99 |
5626 | 100 XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance); |
101 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance); | |
102 return widget; | |
103 } | |
104 | |
105 static Widget | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
106 xlw_create_popup_menu (instance) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
107 widget_instance* instance; |
5626 | 108 { |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
109 Widget popup_shell |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
110 = XtCreatePopupShell (instance->info->name, overrideShellWidgetClass, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
111 instance->parent, NULL, 0); |
5626 | 112 |
5952
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
113 Widget widget; |
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
114 |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
115 /* Don't use malloc_widget_value, because the freeing will be done by free. |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
116 (Also it wastes time calling memset). */ |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
117 widget_value *tem = (widget_value *) malloc (sizeof (widget_value)); |
5952
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
118 |
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
119 /* _XtCreate is freeing the object we passed, |
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
120 so make a copy that we free later. */ |
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
121 bcopy (instance->info->val, tem, sizeof (widget_value)); |
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
122 |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
123 widget |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
124 = XtVaCreateManagedWidget ("popup", xlwMenuWidgetClass, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
125 popup_shell, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
126 XtNmenu, tem, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
127 XtNhorizontal, False, |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
128 0); |
5626 | 129 |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
130 #if 0 |
5993
5feb28cb62c8
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5983
diff
changeset
|
131 free_widget_value (tem); |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
132 #endif |
5952
908e36c0235d
*** empty log message ***
Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
parents:
5951
diff
changeset
|
133 |
5626 | 134 XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance); |
135 | |
136 return popup_shell; | |
137 } | |
138 | |
139 widget_creation_entry | |
140 xlw_creation_table [] = | |
141 { | |
142 {"menubar", xlw_create_menubar}, | |
143 {"popup", xlw_create_popup_menu}, | |
144 {NULL, NULL} | |
145 }; | |
146 | |
147 Boolean | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
148 lw_lucid_widget_p (widget) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
149 Widget widget; |
5626 | 150 { |
151 WidgetClass the_class = XtClass (widget); | |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
152 |
5626 | 153 if (the_class == xlwMenuWidgetClass) |
154 return True; | |
155 if (the_class == overrideShellWidgetClass) | |
6009
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
156 return (XtClass (((CompositeWidget)widget)->composite.children [0]) |
f68004daa523
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5993
diff
changeset
|
157 == xlwMenuWidgetClass); |
5626 | 158 return False; |
159 } | |
160 | |
161 void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
162 xlw_update_one_widget (instance, widget, val, deep_p) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
163 widget_instance* instance; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
164 Widget widget; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
165 widget_value* val; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
166 Boolean deep_p; |
5626 | 167 { |
168 XlwMenuWidget mw; | |
169 | |
170 if (XtIsShell (widget)) | |
171 mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0]; | |
172 else | |
173 mw = (XlwMenuWidget)widget; | |
174 XtVaSetValues (widget, XtNmenu, val, 0); | |
175 } | |
176 | |
177 void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
178 xlw_update_one_value (instance, widget, val) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
179 widget_instance* instance; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
180 Widget widget; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
181 widget_value* val; |
5626 | 182 { |
183 return; | |
184 } | |
185 | |
186 void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
187 xlw_pop_instance (instance, up) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
188 widget_instance* instance; |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
189 Boolean up; |
5626 | 190 { |
191 } | |
192 | |
193 void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
194 xlw_popup_menu (widget) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
195 Widget widget; |
5626 | 196 { |
197 XButtonPressedEvent dummy; | |
198 XlwMenuWidget mw; | |
199 | |
200 if (!XtIsShell (widget)) | |
201 return; | |
202 | |
203 mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0]; | |
204 | |
205 dummy.type = ButtonPress; | |
206 dummy.serial = 0; | |
207 dummy.send_event = 0; | |
208 dummy.display = XtDisplay (widget); | |
209 dummy.window = XtWindow (XtParent (widget)); | |
210 dummy.time = CurrentTime; | |
211 dummy.button = 0; | |
212 XQueryPointer (dummy.display, dummy.window, &dummy.root, | |
213 &dummy.subwindow, &dummy.x_root, &dummy.y_root, | |
214 &dummy.x, &dummy.y, &dummy.state); | |
215 | |
216 pop_up_menu (mw, &dummy); | |
217 } | |
218 | |
219 /* Destruction of instances */ | |
220 void | |
5708
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
221 xlw_destroy_instance (instance) |
4870efc489ea
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5626
diff
changeset
|
222 widget_instance* instance; |
5626 | 223 { |
224 if (instance->widget) | |
225 XtDestroyWidget (instance->widget); | |
226 } | |
227 |