Mercurial > emacs
annotate lwlib/lwlib-Xm.c @ 35926:d2997845573f
(hi-lock-mode): Toggling hi-lock-mode now affects all
buffers. When hi-lock turned on rather than only checking current
buffer for regexps, all buffers are checked. Moved activation of
font-lock to hi-lock-refontify. When font-lock turned off rather
than removing added highlighting just in current buffer, remove it
in all buffers. Changed edit menu text from "Automatic
Highlighting" to "Regexp Highlighting" Documentation for
highlighting phrases, minor documentation changes.
(hi-lock-set-file-patterns): Execute only if there are new or
existing file patterns.
(hi-lock-refontify): Assume font-lock-fontify-buffer will first
unfontify and, if a support mode is active, will not refontify the
whole buffer. If necessary, turn on font lock. (Removed
font-lock-unfontify and font-lock support-mode-specific calls,
such as lazy-lock-fontify-window.)
(hi-lock-find-patterns): Do not turn on hi-lock-mode even if
patterns are found. Not useful now since find-file-hook is removed
if hi-lock is off, but may be needed for per-buffer hi-lock
activation.
(hi-lock-face-phrase-buffer): New function. Also added related
menu item and keybinding.
(highlight-phrase): New alias, to hi-lock-face-phrase-buffer.
(hi-lock-process-phrase): New function.
(hi-lock-line-face-buffer): Doc fixes.
(hi-lock-face-buffer): Doc fixes.
(hi-lock-unface-buffer): Doc fixes.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 06 Feb 2001 15:43:37 +0000 |
parents | 8a6f81835a8d |
children | d45267642a42 |
rev | line source |
---|---|
5626 | 1 /* The lwlib interface to Motif widgets. |
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 | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14018
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14018
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
5626 | 20 |
26087
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25885
diff
changeset
|
21 #ifdef HAVE_CONFIG_H |
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25885
diff
changeset
|
22 #include <config.h> |
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25885
diff
changeset
|
23 #endif |
e0d966fb548f
Add support for large files, plus some locale improvements.
Paul Eggert <eggert@twinsun.com>
parents:
25885
diff
changeset
|
24 |
5626 | 25 #include <unistd.h> |
26 #include <stdio.h> | |
27 | |
28 #include <X11/StringDefs.h> | |
29 #include <X11/IntrinsicP.h> | |
30 #include <X11/ObjectP.h> | |
31 #include <X11/CoreP.h> | |
32 #include <X11/CompositeP.h> | |
33 | |
34 #include "lwlib-Xm.h" | |
35 #include "lwlib-utils.h" | |
36 | |
37 #include <Xm/BulletinB.h> | |
38 #include <Xm/CascadeB.h> | |
14931
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
39 #include <Xm/CascadeBG.h> |
5626 | 40 #include <Xm/DrawingA.h> |
41 #include <Xm/FileSB.h> | |
42 #include <Xm/Label.h> | |
43 #include <Xm/List.h> | |
8784 | 44 #include <Xm/MainW.h> |
5626 | 45 #include <Xm/MenuShell.h> |
46 #include <Xm/MessageB.h> | |
8784 | 47 #include <Xm/PanedW.h> |
5626 | 48 #include <Xm/PushB.h> |
49 #include <Xm/PushBG.h> | |
50 #include <Xm/ArrowB.h> | |
51 #include <Xm/SelectioB.h> | |
52 #include <Xm/Text.h> | |
53 #include <Xm/TextF.h> | |
54 #include <Xm/ToggleB.h> | |
55 #include <Xm/ToggleBG.h> | |
56 #include <Xm/RowColumn.h> | |
57 #include <Xm/ScrolledW.h> | |
58 #include <Xm/Separator.h> | |
59 #include <Xm/DialogS.h> | |
60 #include <Xm/Form.h> | |
61 | |
29467 | 62 #if defined __STDC__ || defined PROTOTYPES |
25037 | 63 #define P_(X) X |
64 #else | |
65 #define P_(X) () | |
66 #endif | |
5626 | 67 |
25037 | 68 enum do_call_type { pre_activate, selection, no_selection, post_activate }; |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
69 |
5626 | 70 |
71 /* Structures to keep destroyed instances */ | |
72 typedef struct _destroyed_instance | |
73 { | |
74 char* name; | |
75 char* type; | |
76 Widget widget; | |
77 Widget parent; | |
78 Boolean pop_up_p; | |
79 struct _destroyed_instance* next; | |
80 } destroyed_instance; | |
81 | |
25037 | 82 static destroyed_instance *make_destroyed_instance P_ ((char *, char *, |
83 Widget, Widget, | |
84 Boolean)); | |
85 static void free_destroyed_instance P_ ((destroyed_instance*)); | |
86 Widget first_child P_ ((Widget)); | |
87 Boolean lw_motif_widget_p P_ ((Widget)); | |
88 static XmString resource_motif_string P_ ((Widget, char *)); | |
89 static void destroy_all_children P_ ((Widget, int)); | |
90 static void xm_update_label P_ ((widget_instance *, Widget, widget_value *)); | |
91 static void xm_update_list P_ ((widget_instance *, Widget, widget_value *)); | |
92 static void xm_update_pushbutton P_ ((widget_instance *, Widget, | |
93 widget_value *)); | |
94 static void xm_update_cascadebutton P_ ((widget_instance *, Widget, | |
95 widget_value *)); | |
96 static void xm_update_toggle P_ ((widget_instance *, Widget, widget_value *)); | |
97 static void xm_update_radiobox P_ ((widget_instance *, Widget, widget_value *)); | |
98 static void make_menu_in_widget P_ ((widget_instance *, Widget, | |
99 widget_value *, int)); | |
100 static void update_one_menu_entry P_ ((widget_instance *, Widget, | |
101 widget_value *, Boolean)); | |
102 static void xm_update_menu P_ ((widget_instance *, Widget, widget_value *, | |
103 Boolean)); | |
104 static void xm_update_text P_ ((widget_instance *, Widget, widget_value *)); | |
105 static void xm_update_text_field P_ ((widget_instance *, Widget, | |
106 widget_value *)); | |
107 void xm_update_one_value P_ ((widget_instance *, Widget, widget_value *)); | |
108 static void activate_button P_ ((Widget, XtPointer, XtPointer)); | |
109 static Widget make_dialog P_ ((char *, Widget, Boolean, char *, char *, | |
110 Boolean, Boolean, Boolean, int, int)); | |
111 static destroyed_instance* find_matching_instance P_ ((widget_instance*)); | |
112 static void mark_dead_instance_destroyed P_ ((Widget, XtPointer, XtPointer)); | |
113 static void recenter_widget P_ ((Widget)); | |
114 static Widget recycle_instance P_ ((destroyed_instance*)); | |
115 Widget xm_create_dialog P_ ((widget_instance*)); | |
116 static Widget make_menubar P_ ((widget_instance*)); | |
117 static void remove_grabs P_ ((Widget, XtPointer, XtPointer)); | |
118 static Widget make_popup_menu P_ ((widget_instance*)); | |
119 static Widget make_main P_ ((widget_instance*)); | |
120 void xm_destroy_instance P_ ((widget_instance*)); | |
121 void xm_popup_menu P_ ((Widget, XEvent *)); | |
122 static void set_min_dialog_size P_ ((Widget)); | |
123 static void do_call P_ ((Widget, XtPointer, enum do_call_type)); | |
124 static void xm_generic_callback P_ ((Widget, XtPointer, XtPointer)); | |
125 static void xm_nosel_callback P_ ((Widget, XtPointer, XtPointer)); | |
126 static void xm_pull_down_callback P_ ((Widget, XtPointer, XtPointer)); | |
127 static void xm_pop_down_callback P_ ((Widget, XtPointer, XtPointer)); | |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
128 static void xm_unmap_callback P_ ((Widget, XtPointer, XtPointer)); |
25037 | 129 void xm_set_keyboard_focus P_ ((Widget, Widget)); |
130 void xm_set_main_areas P_ ((Widget, Widget, Widget)); | |
131 static void xm_internal_update_other_instances P_ ((Widget, XtPointer, | |
132 XtPointer)); | |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
133 static void xm_arm_callback P_ ((Widget, XtPointer, XtPointer)); |
25037 | 134 |
135 #if 0 | |
136 void xm_update_one_widget P_ ((widget_instance *, Widget, widget_value *, | |
137 Boolean)); | |
138 void xm_pop_instance P_ ((widget_instance*, Boolean)); | |
139 void xm_manage_resizing P_ ((Widget, Boolean)); | |
140 #endif | |
141 | |
142 | |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
143 static destroyed_instance *all_destroyed_instances = NULL; |
5626 | 144 |
145 static destroyed_instance* | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
146 make_destroyed_instance (name, type, widget, parent, pop_up_p) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
147 char* name; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
148 char* type; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
149 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
150 Widget parent; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
151 Boolean pop_up_p; |
5626 | 152 { |
153 destroyed_instance* instance = | |
154 (destroyed_instance*)malloc (sizeof (destroyed_instance)); | |
8784 | 155 instance->name = safe_strdup (name); |
156 instance->type = safe_strdup (type); | |
5626 | 157 instance->widget = widget; |
158 instance->parent = parent; | |
159 instance->pop_up_p = pop_up_p; | |
160 instance->next = NULL; | |
161 return instance; | |
162 } | |
163 | |
164 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
165 free_destroyed_instance (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
166 destroyed_instance* instance; |
5626 | 167 { |
168 free (instance->name); | |
169 free (instance->type); | |
170 free (instance); | |
171 } | |
172 | |
173 /* motif utility functions */ | |
174 Widget | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
175 first_child (widget) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
176 Widget widget; |
5626 | 177 { |
178 return ((CompositeWidget)widget)->composite.children [0]; | |
179 } | |
180 | |
181 Boolean | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
182 lw_motif_widget_p (widget) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
183 Widget widget; |
5626 | 184 { |
185 return | |
186 XtClass (widget) == xmDialogShellWidgetClass | |
187 || XmIsPrimitive (widget) || XmIsManager (widget) || XmIsGadget (widget); | |
188 } | |
189 | |
190 static XmString | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
191 resource_motif_string (widget, name) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
192 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
193 char* name; |
5626 | 194 { |
195 XtResource resource; | |
196 XmString result = 0; | |
197 | |
198 resource.resource_name = name; | |
199 resource.resource_class = XmCXmString; | |
200 resource.resource_type = XmRXmString; | |
201 resource.resource_size = sizeof (XmString); | |
202 resource.resource_offset = 0; | |
203 resource.default_type = XtRImmediate; | |
204 resource.default_addr = 0; | |
205 | |
206 XtGetSubresources (widget, (XtPointer)&result, "dialogString", | |
207 "DialogString", &resource, 1, NULL, 0); | |
208 return result; | |
209 } | |
210 | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
211 /* Destroy all of the children of WIDGET |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
212 starting with number FIRST_CHILD_TO_DESTROY. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
213 |
5626 | 214 static void |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
215 destroy_all_children (widget, first_child_to_destroy) |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
216 Widget widget; |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
217 int first_child_to_destroy; |
5626 | 218 { |
219 Widget* children; | |
220 unsigned int number; | |
221 int i; | |
222 | |
223 children = XtCompositeChildren (widget, &number); | |
224 if (children) | |
225 { | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
226 XtUnmanageChildren (children + first_child_to_destroy, |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
227 number - first_child_to_destroy); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
228 |
5626 | 229 /* Unmanage all children and destroy them. They will only be |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
230 really destroyed when we get out of DispatchEvent. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
231 for (i = first_child_to_destroy; i < number; i++) |
14931
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
232 { |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
233 Arg al[2]; |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
234 Widget submenu = 0; |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
235 /* Cascade buttons have submenus,and these submenus |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
236 need to be freed. But they are not included in |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
237 XtCompositeChildren. So get it out of the cascade button |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
238 and free it. If this child is not a cascade button, |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
239 then submenu should remain unchanged. */ |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
240 XtSetArg (al[0], XmNsubMenuId, &submenu); |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
241 XtGetValues (children[i], al, 1); |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
242 if (submenu) |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
243 XtDestroyWidget (submenu); |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
244 XtDestroyWidget (children[i]); |
0706926a11cb
(destroy_all_children): When freeing a cascade button, free its submenu too.
Richard M. Stallman <rms@gnu.org>
parents:
14877
diff
changeset
|
245 } |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
246 |
5626 | 247 XtFree ((char *) children); |
248 } | |
249 } | |
250 | |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
251 |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
252 |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
253 /* Callback XmNarmCallback and XmNdisarmCallback for buttons in a |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
254 menu. CLIENT_DATA contains a pointer to the widget_value |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
255 corresponding to widget W. CALL_DATA contains a |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
256 XmPushButtonCallbackStruct containing the reason why the callback |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
257 is called. */ |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
258 |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
259 static void |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
260 xm_arm_callback (w, client_data, call_data) |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
261 Widget w; |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
262 XtPointer client_data, call_data; |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
263 { |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
264 XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *) call_data; |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
265 widget_value *wv = (widget_value *) client_data; |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
266 widget_instance *instance; |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
267 |
34335
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
268 /* Get the id of the menu bar or popup menu this widget is in. */ |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
269 while (w != None) |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
270 { |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
271 if (XmIsRowColumn (w)) |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
272 { |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
273 unsigned char type = 0xff; |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
274 |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
275 XtVaGetValues (w, XmNrowColumnType, &type, NULL); |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
276 if (type == XmMENU_BAR || type == XmMENU_POPUP) |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
277 break; |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
278 } |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
279 |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
280 w = XtParent (w); |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
281 } |
8a6f81835a8d
(xm_arm_callback): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
34039
diff
changeset
|
282 |
34039
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
283 if (w != None) |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
284 { |
34039
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
285 instance = lw_get_widget_instance (w); |
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
286 if (instance && instance->info->highlight_cb) |
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
287 { |
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
288 call_data = cbs->reason == XmCR_DISARM ? NULL : wv; |
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
289 instance->info->highlight_cb (w, instance->info->id, call_data); |
88c42020e441
(xm_arm_callback): Handle case that W is null;
Gerd Moellmann <gerd@gnu.org>
parents:
30571
diff
changeset
|
290 } |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
291 } |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
292 } |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
293 |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
294 |
25037 | 295 |
296 /* Update the label of widget WIDGET. WIDGET must be a Label widget | |
297 or a subclass of Label. WIDGET_INSTANCE is unused. VAL contains | |
298 the value to update. | |
299 | |
300 Menus: | |
301 | |
302 Emacs fills VAL->name with the text to display in the menu, and | |
303 sets VAL->value to null. Function make_menu_in_widget creates | |
304 widgets with VAL->name as resource name. This works because the | |
305 Label widget uses its resource name for display if no | |
306 XmNlabelString is set. | |
307 | |
308 Dialogs: | |
309 | |
310 VAL->name is again set to the resource name, but VAL->value is | |
311 not null, and contains the label string to display. */ | |
312 | |
5626 | 313 static void |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
314 xm_update_label (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
315 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
316 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
317 widget_value* val; |
5626 | 318 { |
319 XmString res_string = 0; | |
320 XmString built_string = 0; | |
321 XmString key_string = 0; | |
322 Arg al [256]; | |
323 int ac; | |
25037 | 324 |
5626 | 325 ac = 0; |
326 | |
327 if (val->value) | |
328 { | |
25037 | 329 /* A label string is specified, i.e. we are in a dialog. First |
330 see if it is overridden by something from the resource file. */ | |
5626 | 331 res_string = resource_motif_string (widget, val->value); |
332 | |
333 if (res_string) | |
334 { | |
335 XtSetArg (al [ac], XmNlabelString, res_string); ac++; | |
336 } | |
337 else | |
338 { | |
339 built_string = | |
340 XmStringCreateLtoR (val->value, XmSTRING_DEFAULT_CHARSET); | |
341 XtSetArg (al [ac], XmNlabelString, built_string); ac++; | |
342 } | |
25037 | 343 |
5626 | 344 XtSetArg (al [ac], XmNlabelType, XmSTRING); ac++; |
345 } | |
346 | |
347 if (val->key) | |
348 { | |
349 key_string = XmStringCreateLtoR (val->key, XmSTRING_DEFAULT_CHARSET); | |
350 XtSetArg (al [ac], XmNacceleratorText, key_string); ac++; | |
351 } | |
352 | |
353 if (ac) | |
354 XtSetValues (widget, al, ac); | |
355 | |
356 if (built_string) | |
357 XmStringFree (built_string); | |
358 | |
359 if (key_string) | |
360 XmStringFree (key_string); | |
361 } | |
362 | |
363 /* update of list */ | |
364 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
365 xm_update_list (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
366 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
367 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
368 widget_value* val; |
5626 | 369 { |
370 widget_value* cur; | |
371 int i; | |
372 XtRemoveAllCallbacks (widget, XmNsingleSelectionCallback); | |
373 XtAddCallback (widget, XmNsingleSelectionCallback, xm_generic_callback, | |
374 instance); | |
375 for (cur = val->contents, i = 0; cur; cur = cur->next) | |
376 if (cur->value) | |
377 { | |
378 XmString xmstr = XmStringCreate (cur->value, XmSTRING_DEFAULT_CHARSET); | |
379 i += 1; | |
380 XmListAddItem (widget, xmstr, 0); | |
381 if (cur->selected) | |
382 XmListSelectPos (widget, i, False); | |
383 XmStringFree (xmstr); | |
384 } | |
385 } | |
386 | |
387 /* update of buttons */ | |
388 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
389 xm_update_pushbutton (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
390 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
391 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
392 widget_value* val; |
5626 | 393 { |
30571 | 394 XtVaSetValues (widget, XmNalignment, XmALIGNMENT_CENTER, NULL); |
5626 | 395 XtRemoveAllCallbacks (widget, XmNactivateCallback); |
396 XtAddCallback (widget, XmNactivateCallback, xm_generic_callback, instance); | |
397 } | |
398 | |
399 static void | |
11862
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
400 xm_update_cascadebutton (instance, widget, val) |
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
401 widget_instance* instance; |
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
402 Widget widget; |
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
403 widget_value* val; |
5626 | 404 { |
405 /* Should also rebuild the menu by calling ...update_menu... */ | |
406 XtRemoveAllCallbacks (widget, XmNcascadingCallback); | |
407 XtAddCallback (widget, XmNcascadingCallback, xm_pull_down_callback, | |
408 instance); | |
409 } | |
410 | |
411 /* update toggle and radiobox */ | |
412 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
413 xm_update_toggle (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
414 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
415 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
416 widget_value* val; |
5626 | 417 { |
418 XtRemoveAllCallbacks (widget, XmNvalueChangedCallback); | |
419 XtAddCallback (widget, XmNvalueChangedCallback, | |
25037 | 420 xm_generic_callback, instance); |
5626 | 421 XtVaSetValues (widget, XmNset, val->selected, |
30571 | 422 XmNalignment, XmALIGNMENT_BEGINNING, NULL); |
5626 | 423 } |
424 | |
425 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
426 xm_update_radiobox (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
427 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
428 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
429 widget_value* val; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
430 |
5626 | 431 { |
432 Widget toggle; | |
433 widget_value* cur; | |
434 | |
435 /* update the callback */ | |
436 XtRemoveAllCallbacks (widget, XmNentryCallback); | |
437 XtAddCallback (widget, XmNentryCallback, xm_generic_callback, instance); | |
438 | |
439 /* first update all the toggles */ | |
440 /* Energize kernel interface is currently bad. It sets the selected widget | |
441 with the selected flag but returns it by its name. So we currently | |
442 have to support both setting the selection with the selected slot | |
443 of val contents and setting it with the "value" slot of val. The latter | |
444 has a higher priority. This to be removed when the kernel is fixed. */ | |
445 for (cur = val->contents; cur; cur = cur->next) | |
446 { | |
447 toggle = XtNameToWidget (widget, cur->value); | |
448 if (toggle) | |
449 { | |
30571 | 450 XtVaSetValues (toggle, XmNsensitive, cur->enabled, NULL); |
5626 | 451 if (!val->value && cur->selected) |
30571 | 452 XtVaSetValues (toggle, XmNset, cur->selected, NULL); |
5626 | 453 if (val->value && strcmp (val->value, cur->value)) |
30571 | 454 XtVaSetValues (toggle, XmNset, False, NULL); |
5626 | 455 } |
456 } | |
457 | |
458 /* The selected was specified by the value slot */ | |
459 if (val->value) | |
460 { | |
461 toggle = XtNameToWidget (widget, val->value); | |
462 if (toggle) | |
30571 | 463 XtVaSetValues (toggle, XmNset, True, NULL); |
5626 | 464 } |
465 } | |
466 | |
25037 | 467 |
468 /* update a popup menu, pulldown menu or a menubar */ | |
5626 | 469 |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
470 /* KEEP_FIRST_CHILDREN gives the number of initial children to keep. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
471 |
5626 | 472 static void |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
473 make_menu_in_widget (instance, widget, val, keep_first_children) |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
474 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
475 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
476 widget_value* val; |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
477 int keep_first_children; |
5626 | 478 { |
479 Widget* children = 0; | |
480 int num_children; | |
481 int child_index; | |
482 widget_value* cur; | |
483 Widget button = 0; | |
25037 | 484 Widget title = 0; |
5626 | 485 Widget menu; |
486 Arg al [256]; | |
487 int ac; | |
488 Boolean menubar_p; | |
25037 | 489 unsigned char type; |
5626 | 490 |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
491 Widget* old_children; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
492 unsigned int old_num_children; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
493 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
494 old_children = XtCompositeChildren (widget, &old_num_children); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
495 |
5626 | 496 /* Allocate the children array */ |
497 for (num_children = 0, cur = val; cur; num_children++, cur = cur->next); | |
498 children = (Widget*)XtMalloc (num_children * sizeof (Widget)); | |
499 | |
25037 | 500 /* WIDGET should be a RowColumn. */ |
501 if (!XmIsRowColumn (widget)) | |
502 abort (); | |
503 | |
504 /* Determine whether WIDGET is a menu bar. */ | |
505 type = -1; | |
506 XtSetArg (al[0], XmNrowColumnType, &type); | |
5626 | 507 XtGetValues (widget, al, 1); |
25037 | 508 if (type != XmMENU_BAR && type != XmMENU_PULLDOWN && type != XmMENU_POPUP) |
509 abort (); | |
510 menubar_p = type == XmMENU_BAR; | |
5626 | 511 |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
512 #if 0 /* This can't be used in LessTif as of 2000-01-24 because it's |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
513 impossible to decide from this plus the cascading callback if a |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
514 popup is still posted or not. When selecting cascade button A, |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
515 then B, then clicking on the frame, the sequence of callbacks is |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
516 `cascading A', cascading B', `popdown for all cascade buttons in |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
517 the menu bar. */ |
25037 | 518 /* Add a callback to popups and pulldowns that is called when |
519 it is made invisible again. */ | |
5626 | 520 if (!menubar_p) |
521 XtAddCallback (XtParent (widget), XmNpopdownCallback, | |
522 xm_pop_down_callback, (XtPointer)instance); | |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
523 #endif |
5626 | 524 |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
525 /* Preserve the first KEEP_FIRST_CHILDREN old children. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
526 for (child_index = 0, cur = val; child_index < keep_first_children; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
527 child_index++, cur = cur->next) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
528 children[child_index] = old_children[child_index]; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
529 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
530 /* Check that those are all we have |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
531 (the caller should have deleted the rest). */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
532 if (old_num_children != keep_first_children) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
533 abort (); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
534 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
535 /* Create the rest. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
536 for (child_index = keep_first_children; cur; child_index++, cur = cur->next) |
25037 | 537 { |
538 enum menu_separator separator; | |
539 | |
5626 | 540 ac = 0; |
25037 | 541 XtSetArg (al[ac], XmNsensitive, cur->enabled); ac++; |
542 XtSetArg (al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; | |
543 XtSetArg (al[ac], XmNuserData, cur->call_data); ac++; | |
5626 | 544 |
9835
d2250d1b0f48
(make_menu_in_widget): Differentiate a separator entry ("--") from a
Paul Reilly <pmr@pajato.com>
parents:
9825
diff
changeset
|
545 if (instance->pop_up_p && !cur->contents && !cur->call_data |
25037 | 546 && !lw_separator_p (cur->name, &separator, 1)) |
9224
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
547 { |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
548 ac = 0; |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
549 XtSetArg (al[ac], XmNalignment, XmALIGNMENT_CENTER); ac++; |
25037 | 550 title = button = XmCreateLabel (widget, cur->name, al, ac); |
9224
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
551 } |
25037 | 552 else if (lw_separator_p (cur->name, &separator, 1)) |
5626 | 553 { |
25037 | 554 ac = 0; |
555 XtSetArg (al[ac], XmNseparatorType, separator); ++ac; | |
556 button = XmCreateSeparator (widget, cur->name, al, ac); | |
5626 | 557 } |
558 else if (!cur->contents) | |
559 { | |
560 if (menubar_p) | |
561 button = XmCreateCascadeButton (widget, cur->name, al, ac); | |
562 else if (!cur->call_data) | |
563 button = XmCreateLabel (widget, cur->name, al, ac); | |
25037 | 564 else if (cur->button_type == BUTTON_TYPE_TOGGLE |
565 || cur->button_type == BUTTON_TYPE_RADIO) | |
566 { | |
567 XtSetArg (al[ac], XmNset, cur->selected); ++ac; | |
568 XtSetArg (al[ac], XmNvisibleWhenOff, True); ++ac; | |
569 XtSetArg (al[ac], XmNindicatorType, | |
570 (cur->button_type == BUTTON_TYPE_TOGGLE | |
571 ? XmN_OF_MANY : XmONE_OF_MANY)); | |
572 ++ac; | |
25885
6a0fe1278e4d
(make_menu_in_widget, update_one_menu_entry): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25037
diff
changeset
|
573 button = XmCreateToggleButton (widget, cur->name, al, ac); |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
574 XtAddCallback (button, XmNarmCallback, xm_arm_callback, cur); |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
575 XtAddCallback (button, XmNdisarmCallback, xm_arm_callback, cur); |
25037 | 576 } |
5626 | 577 else |
27333
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
578 { |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
579 button = XmCreatePushButton (widget, cur->name, al, ac); |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
580 XtAddCallback (button, XmNarmCallback, xm_arm_callback, cur); |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
581 XtAddCallback (button, XmNdisarmCallback, xm_arm_callback, cur); |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
582 } |
a5bceda5d689
(xm_arm_callback): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
26087
diff
changeset
|
583 |
5626 | 584 xm_update_label (instance, button, cur); |
25037 | 585 |
586 /* Add a callback that is called when the button is | |
587 selected. Toggle buttons don't support | |
588 XmNactivateCallback, we use XmNvalueChangedCallback in | |
589 that case. Don't add a callback to a simple label. */ | |
590 if (cur->button_type) | |
591 xm_update_toggle (instance, button, cur); | |
592 else if (cur->call_data) | |
5626 | 593 XtAddCallback (button, XmNactivateCallback, xm_generic_callback, |
594 (XtPointer)instance); | |
595 } | |
596 else | |
597 { | |
11435
efaaecd960ae
(update_one_menu_entry, make_menu_in_widget):
Richard M. Stallman <rms@gnu.org>
parents:
11299
diff
changeset
|
598 menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0); |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
599 |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
600 /* XmNpopdownCallback is working strangely under LessTif. |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
601 Using XmNunmapCallback is the only way to go there. */ |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
602 if (menubar_p) |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
603 XtAddCallback (menu, XmNunmapCallback, xm_unmap_callback, |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
604 (XtPointer) instance); |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
605 |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
606 make_menu_in_widget (instance, menu, cur->contents, 0); |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
607 XtSetArg (al[ac], XmNsubMenuId, menu); ac++; |
25885
6a0fe1278e4d
(make_menu_in_widget, update_one_menu_entry): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25037
diff
changeset
|
608 button = XmCreateCascadeButton (widget, cur->name, al, ac); |
5626 | 609 |
610 xm_update_label (instance, button, cur); | |
611 | |
612 XtAddCallback (button, XmNcascadingCallback, xm_pull_down_callback, | |
613 (XtPointer)instance); | |
614 } | |
615 | |
25037 | 616 children[child_index] = button; |
5626 | 617 } |
618 | |
25037 | 619 /* Last entry is the help button. The original comment read "Has to |
620 be done after managing the buttons otherwise the menubar is only | |
621 4 pixels high." This is no longer true, and to make | |
622 XmNmenuHelpWidget work, we need to set it before managing the | |
623 children.. --gerd. */ | |
5626 | 624 if (button) |
30571 | 625 XtVaSetValues (widget, XmNmenuHelpWidget, button, NULL); |
25037 | 626 |
627 /* LessTif apparently doesn't recompute centered text when more | |
628 widgets are added. So, do it after all widgets have been | |
629 created. */ | |
630 if (title) | |
30571 | 631 XtVaSetValues (title, XmNalignment, XmALIGNMENT_CENTER, NULL); |
25037 | 632 |
633 if (num_children) | |
634 XtManageChildren (children, num_children); | |
5626 | 635 |
636 XtFree ((char *) children); | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
637 if (old_children) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
638 XtFree ((char *) old_children); |
5626 | 639 } |
640 | |
641 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
642 update_one_menu_entry (instance, widget, val, deep_p) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
643 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
644 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
645 widget_value* val; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
646 Boolean deep_p; |
5626 | 647 { |
648 Arg al [256]; | |
649 int ac; | |
650 Widget menu; | |
651 widget_value* contents; | |
652 | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
653 if (val->this_one_change == NO_CHANGE) |
5626 | 654 return; |
655 | |
656 /* update the sensitivity and userdata */ | |
657 /* Common to all widget types */ | |
658 XtVaSetValues (widget, | |
659 XmNsensitive, val->enabled, | |
660 XmNuserData, val->call_data, | |
30571 | 661 NULL); |
5626 | 662 |
663 /* update the menu button as a label. */ | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
664 if (val->this_one_change >= VISIBLE_CHANGE) |
25037 | 665 { |
666 xm_update_label (instance, widget, val); | |
667 if (val->button_type) | |
668 xm_update_toggle (instance, widget, val); | |
669 } | |
5626 | 670 |
671 /* update the pulldown/pullaside as needed */ | |
672 ac = 0; | |
673 menu = NULL; | |
674 XtSetArg (al [ac], XmNsubMenuId, &menu); ac++; | |
675 XtGetValues (widget, al, ac); | |
676 | |
677 contents = val->contents; | |
678 | |
679 if (!menu) | |
680 { | |
681 if (contents) | |
682 { | |
15853
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
683 unsigned int old_num_children, i; |
15859
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
684 Widget parent; |
15853
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
685 Widget *widget_list; |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
686 |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
687 parent = XtParent (widget); |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
688 widget_list = XtCompositeChildren (parent, &old_num_children); |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
689 |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
690 /* Find the widget position within the parent's widget list. */ |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
691 for (i = 0; i < old_num_children; i++) |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
692 if (strcmp (XtName (widget_list[i]), XtName (widget)) == 0) |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
693 break; |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
694 if (i == old_num_children) |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
695 abort (); |
15859
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
696 if (XmIsCascadeButton (widget_list[i])) |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
697 { |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
698 menu = XmCreatePulldownMenu (parent, XtName(widget), NULL, 0); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
699 make_menu_in_widget (instance, menu, contents, 0); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
700 ac = 0; |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
701 XtSetArg (al [ac], XmNsubMenuId, menu); ac++; |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
702 XtSetValues (widget, al, ac); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
703 } |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
704 else |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
705 { |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
706 Widget button; |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
707 |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
708 /* The current menuitem is a XmPushButtonGadget, it |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
709 needs to be replaced by a CascadeButtonGadget */ |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
710 XtDestroyWidget (widget_list[i]); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
711 menu = XmCreatePulldownMenu (parent, val->name, NULL, 0); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
712 make_menu_in_widget (instance, menu, contents, 0); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
713 ac = 0; |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
714 XtSetArg (al [ac], XmNsubMenuId, menu); ac++; |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
715 /* Non-zero values don't work reliably in |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
716 conjunction with Emacs' event loop */ |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
717 XtSetArg (al [ac], XmNmappingDelay, 0); ac++; |
20471
d4e514328333
(update_one_menu_entry): Add conditional in case XmNpositionIndex is missing.
Richard M. Stallman <rms@gnu.org>
parents:
15859
diff
changeset
|
718 #ifdef XmNpositionIndex /* This is undefined on SCO ODT 2.0. */ |
15859
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
719 /* Tell Motif to put it in the right place */ |
20471
d4e514328333
(update_one_menu_entry): Add conditional in case XmNpositionIndex is missing.
Richard M. Stallman <rms@gnu.org>
parents:
15859
diff
changeset
|
720 XtSetArg (al [ac], XmNpositionIndex , i); ac++; |
d4e514328333
(update_one_menu_entry): Add conditional in case XmNpositionIndex is missing.
Richard M. Stallman <rms@gnu.org>
parents:
15859
diff
changeset
|
721 #endif |
25885
6a0fe1278e4d
(make_menu_in_widget, update_one_menu_entry): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25037
diff
changeset
|
722 button = XmCreateCascadeButton (parent, val->name, al, ac); |
15859
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
723 xm_update_label (instance, button, val); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
724 |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
725 XtAddCallback (button, XmNcascadingCallback, xm_pull_down_callback, |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
726 (XtPointer)instance); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
727 XtManageChild (button); |
2cb422e2d16c
(update_one_menu_entry): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
15853
diff
changeset
|
728 } |
5626 | 729 } |
730 } | |
731 else if (!contents) | |
732 { | |
733 ac = 0; | |
734 XtSetArg (al [ac], XmNsubMenuId, NULL); ac++; | |
735 XtSetValues (widget, al, ac); | |
736 XtDestroyWidget (menu); | |
737 } | |
738 else if (deep_p && contents->change != NO_CHANGE) | |
739 xm_update_menu (instance, menu, val, 1); | |
740 } | |
741 | |
742 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
743 xm_update_menu (instance, widget, val, deep_p) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
744 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
745 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
746 widget_value* val; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
747 Boolean deep_p; |
5626 | 748 { |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
749 Widget* children; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
750 unsigned int num_children; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
751 int num_children_to_keep = 0; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
752 int i; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
753 widget_value* cur; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
754 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
755 children = XtCompositeChildren (widget, &num_children); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
756 |
5626 | 757 /* Widget is a RowColumn widget whose contents have to be updated |
758 * to reflect the list of items in val->contents */ | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
759 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
760 /* See how many buttons we can keep, and how many we |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
761 must completely replace. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
762 if (val->contents == 0) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
763 num_children_to_keep = 0; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
764 else if (val->contents->change == STRUCTURAL_CHANGE) |
5626 | 765 { |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
766 if (children) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
767 { |
15665
432750098147
(xm_update_menu): Fix loop termination test.
Karl Heuer <kwzh@gnu.org>
parents:
15630
diff
changeset
|
768 for (i = 0, cur = val->contents; |
432750098147
(xm_update_menu): Fix loop termination test.
Karl Heuer <kwzh@gnu.org>
parents:
15630
diff
changeset
|
769 (i < num_children |
432750098147
(xm_update_menu): Fix loop termination test.
Karl Heuer <kwzh@gnu.org>
parents:
15630
diff
changeset
|
770 && cur); /* how else to ditch unwanted children ?? - mgd */ |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
771 i++, cur = cur->next) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
772 { |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
773 if (cur->this_one_change == STRUCTURAL_CHANGE) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
774 break; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
775 } |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
776 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
777 num_children_to_keep = i; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
778 } |
5626 | 779 } |
780 else | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
781 num_children_to_keep = num_children; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
782 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
783 /* Update all the buttons of the RowColumn, in order, |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
784 except for those we are going to replace entirely. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
785 if (children) |
5626 | 786 { |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
787 for (i = 0, cur = val->contents; i < num_children_to_keep; i++) |
5626 | 788 { |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
789 if (!cur) |
15853
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
790 { |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
791 num_children_to_keep = i; |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
792 break; |
1ca5c3c9853a
(update_one_menu_entry): When creating a pulldown
Richard M. Stallman <rms@gnu.org>
parents:
15816
diff
changeset
|
793 } |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
794 if (children [i]->core.being_destroyed |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
795 || strcmp (XtName (children [i]), cur->name)) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
796 continue; |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
797 update_one_menu_entry (instance, children [i], cur, deep_p); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
798 cur = cur->next; |
5626 | 799 } |
800 } | |
14877
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
801 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
802 /* Now replace from scratch all the buttons after the last |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
803 place that the top-level structure changed. */ |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
804 if (val->contents->change == STRUCTURAL_CHANGE) |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
805 { |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
806 destroy_all_children (widget, num_children_to_keep); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
807 make_menu_in_widget (instance, widget, val->contents, |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
808 num_children_to_keep); |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
809 } |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
810 |
62fc4d7a846f
(destroy_all_children): New arg first_child_to_destroy.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
811 XtFree ((char *) children); |
5626 | 812 } |
813 | |
814 | |
815 /* update text widgets */ | |
816 | |
817 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
818 xm_update_text (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
819 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
820 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
821 widget_value* val; |
5626 | 822 { |
823 XmTextSetString (widget, val->value ? val->value : ""); | |
824 XtRemoveAllCallbacks (widget, XmNactivateCallback); | |
825 XtAddCallback (widget, XmNactivateCallback, xm_generic_callback, instance); | |
826 XtRemoveAllCallbacks (widget, XmNvalueChangedCallback); | |
827 XtAddCallback (widget, XmNvalueChangedCallback, | |
828 xm_internal_update_other_instances, instance); | |
829 } | |
830 | |
831 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
832 xm_update_text_field (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
833 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
834 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
835 widget_value* val; |
5626 | 836 { |
837 XmTextFieldSetString (widget, val->value ? val->value : ""); | |
838 XtRemoveAllCallbacks (widget, XmNactivateCallback); | |
839 XtAddCallback (widget, XmNactivateCallback, xm_generic_callback, instance); | |
840 XtRemoveAllCallbacks (widget, XmNvalueChangedCallback); | |
841 XtAddCallback (widget, XmNvalueChangedCallback, | |
842 xm_internal_update_other_instances, instance); | |
843 } | |
844 | |
845 | |
846 /* update a motif widget */ | |
847 | |
848 void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
849 xm_update_one_widget (instance, widget, val, deep_p) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
850 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
851 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
852 widget_value* val; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
853 Boolean deep_p; |
5626 | 854 { |
855 WidgetClass class; | |
856 | |
857 /* Mark as not edited */ | |
858 val->edited = False; | |
859 | |
860 /* Common to all widget types */ | |
861 XtVaSetValues (widget, | |
862 XmNsensitive, val->enabled, | |
863 XmNuserData, val->call_data, | |
30571 | 864 NULL); |
5626 | 865 |
866 /* Common to all label like widgets */ | |
867 if (XtIsSubclass (widget, xmLabelWidgetClass)) | |
868 xm_update_label (instance, widget, val); | |
869 | |
870 class = XtClass (widget); | |
871 /* Class specific things */ | |
872 if (class == xmPushButtonWidgetClass || | |
873 class == xmArrowButtonWidgetClass) | |
874 { | |
875 xm_update_pushbutton (instance, widget, val); | |
876 } | |
877 else if (class == xmCascadeButtonWidgetClass) | |
878 { | |
879 xm_update_cascadebutton (instance, widget, val); | |
880 } | |
881 else if (class == xmToggleButtonWidgetClass | |
882 || class == xmToggleButtonGadgetClass) | |
883 { | |
884 xm_update_toggle (instance, widget, val); | |
885 } | |
886 else if (class == xmRowColumnWidgetClass) | |
887 { | |
888 Boolean radiobox = 0; | |
889 int ac = 0; | |
890 Arg al [1]; | |
891 | |
892 XtSetArg (al [ac], XmNradioBehavior, &radiobox); ac++; | |
893 XtGetValues (widget, al, ac); | |
894 | |
895 if (radiobox) | |
896 xm_update_radiobox (instance, widget, val); | |
897 else | |
898 xm_update_menu (instance, widget, val, deep_p); | |
899 } | |
900 else if (class == xmTextWidgetClass) | |
901 { | |
902 xm_update_text (instance, widget, val); | |
903 } | |
904 else if (class == xmTextFieldWidgetClass) | |
905 { | |
906 xm_update_text_field (instance, widget, val); | |
907 } | |
908 else if (class == xmListWidgetClass) | |
909 { | |
910 xm_update_list (instance, widget, val); | |
911 } | |
912 } | |
913 | |
914 /* getting the value back */ | |
915 void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
916 xm_update_one_value (instance, widget, val) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
917 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
918 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
919 widget_value* val; |
5626 | 920 { |
921 WidgetClass class = XtClass (widget); | |
922 widget_value *old_wv; | |
923 | |
924 /* copy the call_data slot into the "return" widget_value */ | |
925 for (old_wv = instance->info->val->contents; old_wv; old_wv = old_wv->next) | |
926 if (!strcmp (val->name, old_wv->name)) | |
927 { | |
928 val->call_data = old_wv->call_data; | |
929 break; | |
930 } | |
931 | |
932 if (class == xmToggleButtonWidgetClass || class == xmToggleButtonGadgetClass) | |
933 { | |
30571 | 934 XtVaGetValues (widget, XmNset, &val->selected, NULL); |
5626 | 935 val->edited = True; |
936 } | |
937 else if (class == xmTextWidgetClass) | |
938 { | |
939 if (val->value) | |
940 free (val->value); | |
941 val->value = XmTextGetString (widget); | |
942 val->edited = True; | |
943 } | |
944 else if (class == xmTextFieldWidgetClass) | |
945 { | |
946 if (val->value) | |
947 free (val->value); | |
948 val->value = XmTextFieldGetString (widget); | |
949 val->edited = True; | |
950 } | |
951 else if (class == xmRowColumnWidgetClass) | |
952 { | |
953 Boolean radiobox = 0; | |
954 int ac = 0; | |
955 Arg al [1]; | |
956 | |
957 XtSetArg (al [ac], XmNradioBehavior, &radiobox); ac++; | |
958 XtGetValues (widget, al, ac); | |
959 | |
960 if (radiobox) | |
961 { | |
962 CompositeWidget radio = (CompositeWidget)widget; | |
963 int i; | |
964 for (i = 0; i < radio->composite.num_children; i++) | |
965 { | |
966 int set = False; | |
967 Widget toggle = radio->composite.children [i]; | |
968 | |
30571 | 969 XtVaGetValues (toggle, XmNset, &set, NULL); |
5626 | 970 if (set) |
971 { | |
972 if (val->value) | |
973 free (val->value); | |
8784 | 974 val->value = safe_strdup (XtName (toggle)); |
5626 | 975 } |
976 } | |
977 val->edited = True; | |
978 } | |
979 } | |
980 else if (class == xmListWidgetClass) | |
981 { | |
982 int pos_cnt; | |
983 int* pos_list; | |
984 if (XmListGetSelectedPos (widget, &pos_list, &pos_cnt)) | |
985 { | |
986 int i; | |
987 widget_value* cur; | |
988 for (cur = val->contents, i = 0; cur; cur = cur->next) | |
989 if (cur->value) | |
990 { | |
991 int j; | |
992 cur->selected = False; | |
993 i += 1; | |
994 for (j = 0; j < pos_cnt; j++) | |
995 if (pos_list [j] == i) | |
996 { | |
997 cur->selected = True; | |
8784 | 998 val->value = safe_strdup (cur->name); |
5626 | 999 } |
1000 } | |
1001 val->edited = 1; | |
1002 XtFree ((char *) pos_list); | |
1003 } | |
1004 } | |
1005 } | |
1006 | |
1007 | |
1008 /* This function is for activating a button from a program. It's wrong because | |
1009 we pass a NULL argument in the call_data which is not Motif compatible. | |
1010 This is used from the XmNdefaultAction callback of the List widgets to | |
14018 | 1011 have a double-click put down a dialog box like the button would do. |
5626 | 1012 I could not find a way to do that with accelerators. |
1013 */ | |
1014 static void | |
11862
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
1015 activate_button (widget, closure, call_data) |
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
1016 Widget widget; |
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
1017 XtPointer closure; |
10a973a88e87
(activate_button, xm_update_cascadebutton): Don't use prototype.
Karl Heuer <kwzh@gnu.org>
parents:
11435
diff
changeset
|
1018 XtPointer call_data; |
5626 | 1019 { |
1020 Widget button = (Widget)closure; | |
1021 XtCallCallbacks (button, XmNactivateCallback, NULL); | |
1022 } | |
1023 | |
1024 /* creation functions */ | |
1025 | |
1026 /* dialogs */ | |
1027 static Widget | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1028 make_dialog (name, parent, pop_up_p, shell_title, icon_name, text_input_slot, |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1029 radio_box, list, left_buttons, right_buttons) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1030 char* name; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1031 Widget parent; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1032 Boolean pop_up_p; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1033 char* shell_title; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1034 char* icon_name; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1035 Boolean text_input_slot; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1036 Boolean radio_box; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1037 Boolean list; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1038 int left_buttons; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1039 int right_buttons; |
5626 | 1040 { |
1041 Widget result; | |
1042 Widget form; | |
1043 Widget row; | |
1044 Widget icon; | |
1045 Widget icon_separator; | |
1046 Widget message; | |
1047 Widget value = 0; | |
1048 Widget separator; | |
1049 Widget button = 0; | |
1050 Widget children [16]; /* for the final XtManageChildren */ | |
1051 int n_children; | |
1052 Arg al[64]; /* Arg List */ | |
1053 int ac; /* Arg Count */ | |
1054 int i; | |
1055 | |
1056 if (pop_up_p) | |
1057 { | |
1058 ac = 0; | |
1059 XtSetArg(al[ac], XmNtitle, shell_title); ac++; | |
1060 XtSetArg(al[ac], XtNallowShellResize, True); ac++; | |
1061 XtSetArg(al[ac], XmNdeleteResponse, XmUNMAP); ac++; | |
1062 result = XmCreateDialogShell (parent, "dialog", al, ac); | |
1063 ac = 0; | |
1064 XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++; | |
1065 /* XtSetArg(al[ac], XmNautoUnmanage, TRUE); ac++; */ /* ####is this ok? */ | |
1066 XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP); ac++; | |
1067 form = XmCreateForm (result, shell_title, al, ac); | |
1068 } | |
1069 else | |
1070 { | |
1071 ac = 0; | |
1072 XtSetArg(al[ac], XmNautoUnmanage, FALSE); ac++; | |
1073 XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP); ac++; | |
1074 form = XmCreateForm (parent, shell_title, al, ac); | |
1075 result = form; | |
1076 } | |
1077 | |
8884 | 1078 n_children = left_buttons + right_buttons + 1; |
5626 | 1079 ac = 0; |
8884 | 1080 XtSetArg(al[ac], XmNpacking, n_children == 3? |
1081 XmPACK_COLUMN: XmPACK_TIGHT); ac++; | |
1082 XtSetArg(al[ac], XmNorientation, n_children == 3? | |
1083 XmVERTICAL: XmHORIZONTAL); ac++; | |
5626 | 1084 XtSetArg(al[ac], XmNnumColumns, left_buttons + right_buttons + 1); ac++; |
1085 XtSetArg(al[ac], XmNmarginWidth, 0); ac++; | |
1086 XtSetArg(al[ac], XmNmarginHeight, 0); ac++; | |
1087 XtSetArg(al[ac], XmNspacing, 13); ac++; | |
1088 XtSetArg(al[ac], XmNadjustLast, False); ac++; | |
1089 XtSetArg(al[ac], XmNalignment, XmALIGNMENT_CENTER); ac++; | |
1090 XtSetArg(al[ac], XmNisAligned, True); ac++; | |
1091 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; | |
1092 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; | |
1093 XtSetArg(al[ac], XmNbottomOffset, 13); ac++; | |
1094 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; | |
1095 XtSetArg(al[ac], XmNleftOffset, 13); ac++; | |
1096 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; | |
1097 XtSetArg(al[ac], XmNrightOffset, 13); ac++; | |
1098 row = XmCreateRowColumn (form, "row", al, ac); | |
1099 | |
1100 n_children = 0; | |
1101 for (i = 0; i < left_buttons; i++) | |
1102 { | |
1103 char button_name [16]; | |
1104 sprintf (button_name, "button%d", i + 1); | |
1105 ac = 0; | |
1106 if (i == 0) | |
1107 { | |
1108 XtSetArg(al[ac], XmNhighlightThickness, 1); ac++; | |
1109 XtSetArg(al[ac], XmNshowAsDefault, TRUE); ac++; | |
1110 } | |
8884 | 1111 XtSetArg(al[ac], XmNmarginWidth, 10); ac++; |
5626 | 1112 XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP); ac++; |
1113 children [n_children] = XmCreatePushButton (row, button_name, al, ac); | |
1114 | |
1115 if (i == 0) | |
1116 { | |
1117 button = children [n_children]; | |
1118 ac = 0; | |
1119 XtSetArg(al[ac], XmNdefaultButton, button); ac++; | |
1120 XtSetValues (row, al, ac); | |
1121 } | |
1122 | |
1123 n_children++; | |
1124 } | |
1125 | |
14018 | 1126 /* invisible separator button */ |
5626 | 1127 ac = 0; |
1128 XtSetArg (al[ac], XmNmappedWhenManaged, FALSE); ac++; | |
1129 children [n_children] = XmCreateLabel (row, "separator_button", al, ac); | |
1130 n_children++; | |
1131 | |
1132 for (i = 0; i < right_buttons; i++) | |
1133 { | |
1134 char button_name [16]; | |
1135 sprintf (button_name, "button%d", left_buttons + i + 1); | |
1136 ac = 0; | |
8884 | 1137 XtSetArg(al[ac], XmNmarginWidth, 10); ac++; |
5626 | 1138 XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP); ac++; |
1139 children [n_children] = XmCreatePushButton (row, button_name, al, ac); | |
1140 if (! button) button = children [n_children]; | |
1141 n_children++; | |
1142 } | |
1143 | |
1144 XtManageChildren (children, n_children); | |
1145 | |
1146 ac = 0; | |
1147 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; | |
1148 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; | |
1149 XtSetArg(al[ac], XmNbottomOffset, 13); ac++; | |
1150 XtSetArg(al[ac], XmNbottomWidget, row); ac++; | |
1151 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; | |
1152 XtSetArg(al[ac], XmNleftOffset, 0); ac++; | |
1153 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; | |
1154 XtSetArg(al[ac], XmNrightOffset, 0); ac++; | |
1155 separator = XmCreateSeparator (form, "", al, ac); | |
1156 | |
1157 ac = 0; | |
1158 XtSetArg(al[ac], XmNlabelType, XmPIXMAP); ac++; | |
1159 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; | |
1160 XtSetArg(al[ac], XmNtopOffset, 13); ac++; | |
1161 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; | |
1162 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; | |
1163 XtSetArg(al[ac], XmNleftOffset, 13); ac++; | |
1164 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; | |
1165 icon = XmCreateLabel (form, icon_name, al, ac); | |
1166 | |
1167 ac = 0; | |
1168 XtSetArg(al[ac], XmNmappedWhenManaged, FALSE); ac++; | |
1169 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; | |
1170 XtSetArg(al[ac], XmNtopOffset, 6); ac++; | |
1171 XtSetArg(al[ac], XmNtopWidget, icon); ac++; | |
1172 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; | |
1173 XtSetArg(al[ac], XmNbottomOffset, 6); ac++; | |
1174 XtSetArg(al[ac], XmNbottomWidget, separator); ac++; | |
1175 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_NONE); ac++; | |
1176 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; | |
1177 icon_separator = XmCreateLabel (form, "", al, ac); | |
1178 | |
1179 if (text_input_slot) | |
1180 { | |
1181 ac = 0; | |
1182 XtSetArg(al[ac], XmNcolumns, 50); ac++; | |
1183 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; | |
1184 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; | |
1185 XtSetArg(al[ac], XmNbottomOffset, 13); ac++; | |
1186 XtSetArg(al[ac], XmNbottomWidget, separator); ac++; | |
1187 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; | |
1188 XtSetArg(al[ac], XmNleftOffset, 13); ac++; | |
1189 XtSetArg(al[ac], XmNleftWidget, icon); ac++; | |
1190 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; | |
1191 XtSetArg(al[ac], XmNrightOffset, 13); ac++; | |
1192 value = XmCreateTextField (form, "value", al, ac); | |
1193 } | |
1194 else if (radio_box) | |
1195 { | |
1196 Widget radio_butt; | |
1197 ac = 0; | |
1198 XtSetArg(al[ac], XmNmarginWidth, 0); ac++; | |
1199 XtSetArg(al[ac], XmNmarginHeight, 0); ac++; | |
1200 XtSetArg(al[ac], XmNspacing, 13); ac++; | |
1201 XtSetArg(al[ac], XmNalignment, XmALIGNMENT_CENTER); ac++; | |
1202 XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++; | |
1203 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; | |
1204 XtSetArg(al[ac], XmNbottomOffset, 13); ac++; | |
1205 XtSetArg(al[ac], XmNbottomWidget, separator); ac++; | |
1206 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; | |
1207 XtSetArg(al[ac], XmNleftOffset, 13); ac++; | |
1208 XtSetArg(al[ac], XmNleftWidget, icon); ac++; | |
1209 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; | |
1210 XtSetArg(al[ac], XmNrightOffset, 13); ac++; | |
1211 value = XmCreateRadioBox (form, "radiobutton1", al, ac); | |
1212 ac = 0; | |
1213 i = 0; | |
1214 radio_butt = XmCreateToggleButtonGadget (value, "radio1", al, ac); | |
1215 children [i++] = radio_butt; | |
1216 radio_butt = XmCreateToggleButtonGadget (value, "radio2", al, ac); | |
1217 children [i++] = radio_butt; | |
1218 radio_butt = XmCreateToggleButtonGadget (value, "radio3", al, ac); | |
1219 children [i++] = radio_butt; | |
1220 XtManageChildren (children, i); | |
1221 } | |
1222 else if (list) | |
1223 { | |
1224 ac = 0; | |
1225 XtSetArg(al[ac], XmNvisibleItemCount, 5); ac++; | |
1226 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; | |
1227 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; | |
1228 XtSetArg(al[ac], XmNbottomOffset, 13); ac++; | |
1229 XtSetArg(al[ac], XmNbottomWidget, separator); ac++; | |
1230 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; | |
1231 XtSetArg(al[ac], XmNleftOffset, 13); ac++; | |
1232 XtSetArg(al[ac], XmNleftWidget, icon); ac++; | |
1233 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; | |
1234 XtSetArg(al[ac], XmNrightOffset, 13); ac++; | |
1235 value = XmCreateScrolledList (form, "list", al, ac); | |
1236 | |
1237 /* this is the easiest way I found to have the dble click in the | |
1238 list activate the default button */ | |
1239 XtAddCallback (value, XmNdefaultActionCallback, activate_button, button); | |
1240 } | |
1241 | |
1242 ac = 0; | |
1243 XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; | |
1244 XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; | |
1245 XtSetArg(al[ac], XmNtopOffset, 13); ac++; | |
1246 XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; | |
1247 XtSetArg(al[ac], XmNbottomOffset, 13); ac++; | |
1248 XtSetArg(al[ac], XmNbottomWidget, | |
1249 text_input_slot || radio_box || list ? value : separator); ac++; | |
1250 XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; | |
1251 XtSetArg(al[ac], XmNleftOffset, 13); ac++; | |
1252 XtSetArg(al[ac], XmNleftWidget, icon); ac++; | |
1253 XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; | |
1254 XtSetArg(al[ac], XmNrightOffset, 13); ac++; | |
1255 message = XmCreateLabel (form, "message", al, ac); | |
1256 | |
1257 if (list) | |
1258 XtManageChild (value); | |
1259 | |
1260 i = 0; | |
1261 children [i] = row; i++; | |
1262 children [i] = separator; i++; | |
1263 if (text_input_slot || radio_box) | |
1264 { | |
1265 children [i] = value; i++; | |
1266 } | |
1267 children [i] = message; i++; | |
1268 children [i] = icon; i++; | |
1269 children [i] = icon_separator; i++; | |
1270 XtManageChildren (children, i); | |
1271 | |
1272 if (text_input_slot || list) | |
1273 { | |
1274 XtInstallAccelerators (value, button); | |
1275 XtSetKeyboardFocus (result, value); | |
1276 } | |
1277 else | |
1278 { | |
1279 XtInstallAccelerators (form, button); | |
1280 XtSetKeyboardFocus (result, button); | |
1281 } | |
1282 | |
1283 return result; | |
1284 } | |
1285 | |
1286 static destroyed_instance* | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1287 find_matching_instance (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1288 widget_instance* instance; |
5626 | 1289 { |
1290 destroyed_instance* cur; | |
1291 destroyed_instance* prev; | |
1292 char* type = instance->info->type; | |
1293 char* name = instance->info->name; | |
1294 | |
1295 for (prev = NULL, cur = all_destroyed_instances; | |
1296 cur; | |
1297 prev = cur, cur = cur->next) | |
1298 { | |
1299 if (!strcmp (cur->name, name) | |
1300 && !strcmp (cur->type, type) | |
1301 && cur->parent == instance->parent | |
1302 && cur->pop_up_p == instance->pop_up_p) | |
1303 { | |
1304 if (prev) | |
1305 prev->next = cur->next; | |
1306 else | |
1307 all_destroyed_instances = cur->next; | |
1308 return cur; | |
1309 } | |
1310 /* do some cleanup */ | |
1311 else if (!cur->widget) | |
1312 { | |
1313 if (prev) | |
1314 prev->next = cur->next; | |
1315 else | |
1316 all_destroyed_instances = cur->next; | |
1317 free_destroyed_instance (cur); | |
1318 cur = prev ? prev : all_destroyed_instances; | |
1319 } | |
1320 } | |
1321 return NULL; | |
1322 } | |
1323 | |
1324 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1325 mark_dead_instance_destroyed (widget, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1326 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1327 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1328 XtPointer call_data; |
5626 | 1329 { |
1330 destroyed_instance* instance = (destroyed_instance*)closure; | |
1331 instance->widget = NULL; | |
1332 } | |
1333 | |
1334 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1335 recenter_widget (widget) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1336 Widget widget; |
5626 | 1337 { |
1338 Widget parent = XtParent (widget); | |
1339 Screen* screen = XtScreen (widget); | |
1340 Dimension screen_width = WidthOfScreen (screen); | |
1341 Dimension screen_height = HeightOfScreen (screen); | |
1342 Dimension parent_width = 0; | |
1343 Dimension parent_height = 0; | |
1344 Dimension child_width = 0; | |
1345 Dimension child_height = 0; | |
1346 Position x; | |
1347 Position y; | |
1348 | |
30571 | 1349 XtVaGetValues (widget, XtNwidth, &child_width, XtNheight, &child_height, NULL); |
5626 | 1350 XtVaGetValues (parent, XtNwidth, &parent_width, XtNheight, &parent_height, |
30571 | 1351 NULL); |
5626 | 1352 |
1353 x = (((Position)parent_width) - ((Position)child_width)) / 2; | |
1354 y = (((Position)parent_height) - ((Position)child_height)) / 2; | |
1355 | |
1356 XtTranslateCoords (parent, x, y, &x, &y); | |
1357 | |
1358 if (x + child_width > screen_width) | |
1359 x = screen_width - child_width; | |
1360 if (x < 0) | |
1361 x = 0; | |
1362 | |
1363 if (y + child_height > screen_height) | |
1364 y = screen_height - child_height; | |
1365 if (y < 0) | |
1366 y = 0; | |
1367 | |
30571 | 1368 XtVaSetValues (widget, XtNx, x, XtNy, y, NULL); |
5626 | 1369 } |
1370 | |
1371 static Widget | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1372 recycle_instance (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1373 destroyed_instance* instance; |
5626 | 1374 { |
1375 Widget widget = instance->widget; | |
1376 | |
1377 /* widget is NULL if the parent was destroyed. */ | |
1378 if (widget) | |
1379 { | |
1380 Widget focus; | |
1381 Widget separator; | |
1382 | |
1383 /* Remove the destroy callback as the instance is not in the list | |
1384 anymore */ | |
1385 XtRemoveCallback (instance->parent, XtNdestroyCallback, | |
1386 mark_dead_instance_destroyed, | |
1387 (XtPointer)instance); | |
1388 | |
1389 /* Give the focus to the initial item */ | |
1390 focus = XtNameToWidget (widget, "*value"); | |
1391 if (!focus) | |
1392 focus = XtNameToWidget (widget, "*button1"); | |
1393 if (focus) | |
1394 XtSetKeyboardFocus (widget, focus); | |
1395 | |
1396 /* shrink the separator label back to their original size */ | |
1397 separator = XtNameToWidget (widget, "*separator_button"); | |
1398 if (separator) | |
30571 | 1399 XtVaSetValues (separator, XtNwidth, 5, XtNheight, 5, NULL); |
5626 | 1400 |
1401 /* Center the dialog in its parent */ | |
1402 recenter_widget (widget); | |
1403 } | |
1404 free_destroyed_instance (instance); | |
1405 return widget; | |
1406 } | |
1407 | |
1408 Widget | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1409 xm_create_dialog (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1410 widget_instance* instance; |
5626 | 1411 { |
1412 char* name = instance->info->type; | |
1413 Widget parent = instance->parent; | |
1414 Widget widget; | |
1415 Boolean pop_up_p = instance->pop_up_p; | |
1416 char* shell_name = 0; | |
1417 char* icon_name; | |
1418 Boolean text_input_slot = False; | |
1419 Boolean radio_box = False; | |
1420 Boolean list = False; | |
1421 int total_buttons; | |
1422 int left_buttons = 0; | |
1423 int right_buttons = 1; | |
1424 destroyed_instance* dead_one; | |
1425 | |
1426 /* try to find a widget to recycle */ | |
1427 dead_one = find_matching_instance (instance); | |
1428 if (dead_one) | |
1429 { | |
1430 Widget recycled_widget = recycle_instance (dead_one); | |
1431 if (recycled_widget) | |
1432 return recycled_widget; | |
1433 } | |
1434 | |
1435 switch (name [0]){ | |
1436 case 'E': case 'e': | |
1437 icon_name = "dbox-error"; | |
1438 shell_name = "Error"; | |
1439 break; | |
1440 | |
1441 case 'I': case 'i': | |
1442 icon_name = "dbox-info"; | |
1443 shell_name = "Information"; | |
1444 break; | |
1445 | |
1446 case 'L': case 'l': | |
1447 list = True; | |
1448 icon_name = "dbox-question"; | |
1449 shell_name = "Prompt"; | |
1450 break; | |
1451 | |
1452 case 'P': case 'p': | |
1453 text_input_slot = True; | |
1454 icon_name = "dbox-question"; | |
1455 shell_name = "Prompt"; | |
1456 break; | |
1457 | |
1458 case 'Q': case 'q': | |
1459 icon_name = "dbox-question"; | |
1460 shell_name = "Question"; | |
1461 break; | |
1462 } | |
1463 | |
1464 total_buttons = name [1] - '0'; | |
1465 | |
1466 if (name [3] == 'T' || name [3] == 't') | |
1467 { | |
1468 text_input_slot = False; | |
1469 radio_box = True; | |
1470 } | |
1471 else if (name [3]) | |
1472 right_buttons = name [4] - '0'; | |
1473 | |
1474 left_buttons = total_buttons - right_buttons; | |
1475 | |
1476 widget = make_dialog (name, parent, pop_up_p, | |
1477 shell_name, icon_name, text_input_slot, radio_box, | |
1478 list, left_buttons, right_buttons); | |
1479 | |
1480 XtAddCallback (widget, XmNpopdownCallback, xm_nosel_callback, | |
1481 (XtPointer) instance); | |
1482 return widget; | |
1483 } | |
1484 | |
15816
e1e9df8a862e
(make_menubar): Turn off menu accelerator.
Richard M. Stallman <rms@gnu.org>
parents:
15665
diff
changeset
|
1485 /* Create a menu bar. We turn off the f10 key |
e1e9df8a862e
(make_menubar): Turn off menu accelerator.
Richard M. Stallman <rms@gnu.org>
parents:
15665
diff
changeset
|
1486 because we have not yet managed to make it work right in Motif. */ |
e1e9df8a862e
(make_menubar): Turn off menu accelerator.
Richard M. Stallman <rms@gnu.org>
parents:
15665
diff
changeset
|
1487 |
5626 | 1488 static Widget |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1489 make_menubar (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1490 widget_instance* instance; |
5626 | 1491 { |
27345
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1492 Arg al[3]; |
15816
e1e9df8a862e
(make_menubar): Turn off menu accelerator.
Richard M. Stallman <rms@gnu.org>
parents:
15665
diff
changeset
|
1493 int ac; |
e1e9df8a862e
(make_menubar): Turn off menu accelerator.
Richard M. Stallman <rms@gnu.org>
parents:
15665
diff
changeset
|
1494 |
e1e9df8a862e
(make_menubar): Turn off menu accelerator.
Richard M. Stallman <rms@gnu.org>
parents:
15665
diff
changeset
|
1495 ac = 0; |
27345
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1496 XtSetArg(al[ac], XmNmenuAccelerator, 0); ++ac; |
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1497 |
28116
25edeaccc41f
(make_menubar) [LESSTIF_VERSION]: Don't set
Gerd Moellmann <gerd@gnu.org>
parents:
28015
diff
changeset
|
1498 #if 0 |
27345
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1499 /* As of 2000-01-17, the LessTif menu bar resizes to height 0 when |
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1500 all its children are removed, causing an annoying flickering |
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1501 behavior. Prevent that by not allowing resizing. */ |
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1502 XtSetArg(al[ac], XmNresizeHeight, False); ++ac; |
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1503 XtSetArg(al[ac], XmNresizeWidth, False); ++ac; |
28015
0794d93da030
(make_menubar): Set XmNresizeHeight and
Gerd Moellmann <gerd@gnu.org>
parents:
27998
diff
changeset
|
1504 #endif |
27345
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1505 |
15a661269a09
(make_menubar): Set XmNresizeHeight and XmNresizeWidth to False.
Gerd Moellmann <gerd@gnu.org>
parents:
27333
diff
changeset
|
1506 return XmCreateMenuBar (instance->parent, instance->info->name, al, ac); |
5626 | 1507 } |
1508 | |
1509 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1510 remove_grabs (shell, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1511 Widget shell; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1512 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1513 XtPointer call_data; |
5626 | 1514 { |
11245
5fdf816307c6
(remove_grabs): Use type Widget for `menu'.
Richard M. Stallman <rms@gnu.org>
parents:
9835
diff
changeset
|
1515 Widget menu = (Widget) closure; |
5fdf816307c6
(remove_grabs): Use type Widget for `menu'.
Richard M. Stallman <rms@gnu.org>
parents:
9835
diff
changeset
|
1516 XmRemoveFromPostFromList (menu, XtParent (XtParent (menu))); |
5626 | 1517 } |
1518 | |
1519 static Widget | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1520 make_popup_menu (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1521 widget_instance* instance; |
5626 | 1522 { |
1523 Widget parent = instance->parent; | |
1524 Window parent_window = parent->core.window; | |
1525 Widget result; | |
1526 | |
1527 /* sets the parent window to 0 to fool Motif into not generating a grab */ | |
1528 parent->core.window = 0; | |
1529 result = XmCreatePopupMenu (parent, instance->info->name, NULL, 0); | |
1530 XtAddCallback (XtParent (result), XmNpopdownCallback, remove_grabs, | |
1531 (XtPointer)result); | |
1532 parent->core.window = parent_window; | |
1533 return result; | |
1534 } | |
25037 | 1535 |
8784 | 1536 static Widget |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1537 make_main (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1538 widget_instance* instance; |
8784 | 1539 { |
1540 Widget parent = instance->parent; | |
1541 Widget result; | |
1542 Arg al[2]; | |
1543 int ac; | |
1544 | |
1545 ac = 0; | |
1546 XtSetArg (al[ac], XtNborderWidth, 0); ac++; | |
1547 XtSetArg (al[ac], XmNspacing, 0); ac++; | |
1548 result = XmCreateMainWindow (parent, instance->info->name, al, ac); | |
1549 return result; | |
1550 } | |
5626 | 1551 |
1552 /* Table of functions to create widgets */ | |
1553 | |
1554 #ifdef ENERGIZE | |
1555 | |
1556 /* interface with the XDesigner generated functions */ | |
1557 typedef Widget (*widget_maker) (Widget); | |
1558 extern Widget create_project_p_sheet (Widget parent); | |
1559 extern Widget create_debugger_p_sheet (Widget parent); | |
1560 extern Widget create_breaklist_p_sheet (Widget parent); | |
1561 extern Widget create_le_browser_p_sheet (Widget parent); | |
1562 extern Widget create_class_browser_p_sheet (Widget parent); | |
1563 extern Widget create_call_browser_p_sheet (Widget parent); | |
1564 extern Widget create_build_dialog (Widget parent); | |
1565 extern Widget create_editmode_dialog (Widget parent); | |
1566 extern Widget create_search_dialog (Widget parent); | |
1567 extern Widget create_project_display_dialog (Widget parent); | |
1568 | |
1569 static Widget | |
1570 make_one (widget_instance* instance, widget_maker fn) | |
1571 { | |
1572 Widget result; | |
1573 Arg al [64]; | |
1574 int ac = 0; | |
1575 | |
1576 if (instance->pop_up_p) | |
1577 { | |
1578 XtSetArg (al [ac], XmNallowShellResize, TRUE); ac++; | |
1579 result = XmCreateDialogShell (instance->parent, "dialog", NULL, 0); | |
1580 XtAddCallback (result, XmNpopdownCallback, &xm_nosel_callback, | |
1581 (XtPointer) instance); | |
1582 (*fn) (result); | |
1583 } | |
1584 else | |
1585 { | |
1586 result = (*fn) (instance->parent); | |
1587 XtRealizeWidget (result); | |
1588 } | |
1589 return result; | |
1590 } | |
1591 | |
1592 static Widget | |
1593 make_project_p_sheet (widget_instance* instance) | |
1594 { | |
1595 return make_one (instance, create_project_p_sheet); | |
1596 } | |
1597 | |
1598 static Widget | |
1599 make_debugger_p_sheet (widget_instance* instance) | |
1600 { | |
1601 return make_one (instance, create_debugger_p_sheet); | |
1602 } | |
1603 | |
1604 static Widget | |
1605 make_breaklist_p_sheet (widget_instance* instance) | |
1606 { | |
1607 return make_one (instance, create_breaklist_p_sheet); | |
1608 } | |
1609 | |
1610 static Widget | |
1611 make_le_browser_p_sheet (widget_instance* instance) | |
1612 { | |
1613 return make_one (instance, create_le_browser_p_sheet); | |
1614 } | |
1615 | |
1616 static Widget | |
1617 make_class_browser_p_sheet (widget_instance* instance) | |
1618 { | |
1619 return make_one (instance, create_class_browser_p_sheet); | |
1620 } | |
1621 | |
1622 static Widget | |
1623 make_call_browser_p_sheet (widget_instance* instance) | |
1624 { | |
1625 return make_one (instance, create_call_browser_p_sheet); | |
1626 } | |
1627 | |
1628 static Widget | |
1629 make_build_dialog (widget_instance* instance) | |
1630 { | |
1631 return make_one (instance, create_build_dialog); | |
1632 } | |
1633 | |
1634 static Widget | |
1635 make_editmode_dialog (widget_instance* instance) | |
1636 { | |
1637 return make_one (instance, create_editmode_dialog); | |
1638 } | |
1639 | |
1640 static Widget | |
1641 make_search_dialog (widget_instance* instance) | |
1642 { | |
1643 return make_one (instance, create_search_dialog); | |
1644 } | |
1645 | |
1646 static Widget | |
1647 make_project_display_dialog (widget_instance* instance) | |
1648 { | |
1649 return make_one (instance, create_project_display_dialog); | |
1650 } | |
1651 | |
1652 #endif /* ENERGIZE */ | |
1653 | |
1654 widget_creation_entry | |
1655 xm_creation_table [] = | |
1656 { | |
1657 {"menubar", make_menubar}, | |
1658 {"popup", make_popup_menu}, | |
8784 | 1659 {"main", make_main}, |
5626 | 1660 #ifdef ENERGIZE |
1661 {"project_p_sheet", make_project_p_sheet}, | |
1662 {"debugger_p_sheet", make_debugger_p_sheet}, | |
1663 {"breaklist_psheet", make_breaklist_p_sheet}, | |
1664 {"leb_psheet", make_le_browser_p_sheet}, | |
1665 {"class_browser_psheet", make_class_browser_p_sheet}, | |
1666 {"ctree_browser_psheet", make_call_browser_p_sheet}, | |
1667 {"build", make_build_dialog}, | |
1668 {"editmode", make_editmode_dialog}, | |
1669 {"search", make_search_dialog}, | |
1670 {"project_display", make_project_display_dialog}, | |
1671 #endif /* ENERGIZE */ | |
1672 {NULL, NULL} | |
1673 }; | |
1674 | |
1675 /* Destruction of instances */ | |
1676 void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1677 xm_destroy_instance (instance) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1678 widget_instance* instance; |
5626 | 1679 { |
1680 Widget widget = instance->widget; | |
1681 /* recycle the dialog boxes */ | |
1682 /* Disable the recycling until we can find a way to have the dialog box | |
1683 get reasonable layout after we modify its contents. */ | |
1684 if (0 | |
1685 && XtClass (widget) == xmDialogShellWidgetClass) | |
1686 { | |
1687 destroyed_instance* dead_instance = | |
1688 make_destroyed_instance (instance->info->name, | |
1689 instance->info->type, | |
1690 instance->widget, | |
1691 instance->parent, | |
1692 instance->pop_up_p); | |
1693 dead_instance->next = all_destroyed_instances; | |
1694 all_destroyed_instances = dead_instance; | |
1695 XtUnmanageChild (first_child (instance->widget)); | |
1696 XFlush (XtDisplay (instance->widget)); | |
1697 XtAddCallback (instance->parent, XtNdestroyCallback, | |
1698 mark_dead_instance_destroyed, (XtPointer)dead_instance); | |
1699 } | |
1700 else | |
1701 { | |
1702 /* This might not be necessary now that the nosel is attached to | |
1703 popdown instead of destroy, but it can't hurt. */ | |
1704 XtRemoveCallback (instance->widget, XtNdestroyCallback, | |
1705 xm_nosel_callback, (XtPointer)instance); | |
1706 XtDestroyWidget (instance->widget); | |
1707 } | |
1708 } | |
1709 | |
1710 /* popup utility */ | |
1711 void | |
12746
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1712 xm_popup_menu (widget, event) |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1713 Widget widget; |
12746
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1714 XEvent *event; |
5626 | 1715 { |
1716 XButtonPressedEvent dummy; | |
1717 | |
12746
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1718 if (event == 0) |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1719 { |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1720 dummy.type = ButtonPress; |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1721 dummy.serial = 0; |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1722 dummy.send_event = 0; |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1723 dummy.display = XtDisplay (widget); |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1724 dummy.window = XtWindow (XtParent (widget)); |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1725 dummy.time = 0; |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1726 dummy.button = 0; |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1727 XQueryPointer (dummy.display, dummy.window, &dummy.root, |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1728 &dummy.subwindow, &dummy.x_root, &dummy.y_root, |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1729 &dummy.x, &dummy.y, &dummy.state); |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1730 event = (XEvent *) &dummy; |
23cd08c6dd2a
(xm_popup_menu): New arg `event'.
Richard M. Stallman <rms@gnu.org>
parents:
11862
diff
changeset
|
1731 } |
5626 | 1732 |
1733 if (event->type == ButtonPress || event->type == ButtonRelease) | |
1734 { | |
1735 /* This is so totally ridiculous: there's NO WAY to tell Motif | |
1736 that *any* button can select a menu item. Only one button | |
1737 can have that honor. | |
1738 */ | |
1739 char *trans = 0; | |
1740 if (event->xbutton.state & Button5Mask) trans = "<Btn5Down>"; | |
1741 else if (event->xbutton.state & Button4Mask) trans = "<Btn4Down>"; | |
1742 else if (event->xbutton.state & Button3Mask) trans = "<Btn3Down>"; | |
1743 else if (event->xbutton.state & Button2Mask) trans = "<Btn2Down>"; | |
1744 else if (event->xbutton.state & Button1Mask) trans = "<Btn1Down>"; | |
30571 | 1745 if (trans) XtVaSetValues (widget, XmNmenuPost, trans, NULL); |
5626 | 1746 XmMenuPosition (widget, (XButtonPressedEvent *) event); |
1747 } | |
1748 XtManageChild (widget); | |
1749 } | |
1750 | |
1751 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1752 set_min_dialog_size (w) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1753 Widget w; |
5626 | 1754 { |
1755 short width; | |
1756 short height; | |
30571 | 1757 XtVaGetValues (w, XmNwidth, &width, XmNheight, &height, NULL); |
1758 XtVaSetValues (w, XmNminWidth, width, XmNminHeight, height, NULL); | |
5626 | 1759 } |
1760 | |
1761 void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1762 xm_pop_instance (instance, up) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1763 widget_instance* instance; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1764 Boolean up; |
5626 | 1765 { |
1766 Widget widget = instance->widget; | |
1767 | |
1768 if (XtClass (widget) == xmDialogShellWidgetClass) | |
1769 { | |
1770 Widget widget_to_manage = first_child (widget); | |
1771 if (up) | |
1772 { | |
1773 XtManageChild (widget_to_manage); | |
1774 set_min_dialog_size (widget); | |
1775 XtSetKeyboardFocus (instance->parent, widget); | |
1776 } | |
1777 else | |
1778 XtUnmanageChild (widget_to_manage); | |
1779 } | |
1780 else | |
1781 { | |
1782 if (up) | |
1783 XtManageChild (widget); | |
1784 else | |
1785 XtUnmanageChild (widget); | |
1786 } | |
1787 } | |
1788 | |
1789 | |
1790 /* motif callback */ | |
1791 | |
1792 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1793 do_call (widget, closure, type) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1794 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1795 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1796 enum do_call_type type; |
5626 | 1797 { |
1798 Arg al [256]; | |
1799 int ac; | |
1800 XtPointer user_data; | |
1801 widget_instance* instance = (widget_instance*)closure; | |
1802 Widget instance_widget; | |
1803 LWLIB_ID id; | |
1804 | |
1805 if (!instance) | |
1806 return; | |
1807 if (widget->core.being_destroyed) | |
1808 return; | |
1809 | |
1810 instance_widget = instance->widget; | |
1811 if (!instance_widget) | |
1812 return; | |
1813 | |
1814 id = instance->info->id; | |
1815 ac = 0; | |
1816 user_data = NULL; | |
1817 XtSetArg (al [ac], XmNuserData, &user_data); ac++; | |
1818 XtGetValues (widget, al, ac); | |
1819 switch (type) | |
1820 { | |
1821 case pre_activate: | |
1822 if (instance->info->pre_activate_cb) | |
1823 instance->info->pre_activate_cb (widget, id, user_data); | |
1824 break; | |
1825 case selection: | |
1826 if (instance->info->selection_cb) | |
1827 instance->info->selection_cb (widget, id, user_data); | |
1828 break; | |
1829 case no_selection: | |
1830 if (instance->info->selection_cb) | |
1831 instance->info->selection_cb (widget, id, (XtPointer) -1); | |
1832 break; | |
1833 case post_activate: | |
1834 if (instance->info->post_activate_cb) | |
1835 instance->info->post_activate_cb (widget, id, user_data); | |
1836 break; | |
1837 default: | |
1838 abort (); | |
1839 } | |
1840 } | |
1841 | |
1842 /* Like lw_internal_update_other_instances except that it does not do | |
1843 anything if its shell parent is not managed. This is to protect | |
1844 lw_internal_update_other_instances to dereference freed memory | |
1845 if the widget was ``destroyed'' by caching it in the all_destroyed_instances | |
1846 list */ | |
1847 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1848 xm_internal_update_other_instances (widget, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1849 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1850 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1851 XtPointer call_data; |
5626 | 1852 { |
1853 Widget parent; | |
1854 for (parent = widget; parent; parent = XtParent (parent)) | |
1855 if (XtIsShell (parent)) | |
1856 break; | |
1857 else if (!XtIsManaged (parent)) | |
1858 return; | |
1859 lw_internal_update_other_instances (widget, closure, call_data); | |
1860 } | |
1861 | |
1862 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1863 xm_generic_callback (widget, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1864 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1865 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1866 XtPointer call_data; |
5626 | 1867 { |
1868 lw_internal_update_other_instances (widget, closure, call_data); | |
1869 do_call (widget, closure, selection); | |
1870 } | |
1871 | |
1872 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1873 xm_nosel_callback (widget, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1874 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1875 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1876 XtPointer call_data; |
5626 | 1877 { |
1878 /* This callback is only called when a dialog box is dismissed with the wm's | |
1879 destroy button (WM_DELETE_WINDOW.) We want the dialog box to be destroyed | |
1880 in that case, not just unmapped, so that it releases its keyboard grabs. | |
1881 But there are problems with running our callbacks while the widget is in | |
1882 the process of being destroyed, so we set XmNdeleteResponse to XmUNMAP | |
1883 instead of XmDESTROY and then destroy it ourself after having run the | |
1884 callback. | |
1885 */ | |
1886 do_call (widget, closure, no_selection); | |
1887 XtDestroyWidget (widget); | |
1888 } | |
1889 | |
1890 static void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1891 xm_pull_down_callback (widget, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1892 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1893 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1894 XtPointer call_data; |
5626 | 1895 { |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1896 Widget parent = XtParent (widget); |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1897 |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1898 if (XmIsRowColumn (parent)) |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1899 { |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1900 unsigned char type = 0xff; |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1901 XtVaGetValues (parent, XmNrowColumnType, &type, NULL); |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1902 if (type == XmMENU_BAR) |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1903 do_call (widget, closure, pre_activate); |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1904 } |
5626 | 1905 } |
1906 | |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1907 |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1908 /* XmNpopdownCallback for MenuShell widgets. WIDGET is the MenuShell, |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1909 CLOSURE is a pointer to the widget_instance of the shell, CALL_DATA |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1910 is always null under LessTif. |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1911 |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1912 2000-01-23: This callback is called for each cascade button in |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1913 a menu, whether or not its submenu is visible. */ |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1914 |
5626 | 1915 static void |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1916 xm_pop_down_callback (widget, closure, call_data) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1917 Widget widget; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1918 XtPointer closure; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1919 XtPointer call_data; |
5626 | 1920 { |
9835
d2250d1b0f48
(make_menu_in_widget): Differentiate a separator entry ("--") from a
Paul Reilly <pmr@pajato.com>
parents:
9825
diff
changeset
|
1921 widget_instance *instance = (widget_instance *) closure; |
d2250d1b0f48
(make_menu_in_widget): Differentiate a separator entry ("--") from a
Paul Reilly <pmr@pajato.com>
parents:
9825
diff
changeset
|
1922 |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1923 if ((!instance->pop_up_p && (XtParent (widget) == instance->widget)) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1924 || (XtParent (widget) == instance->parent)) |
9835
d2250d1b0f48
(make_menu_in_widget): Differentiate a separator entry ("--") from a
Paul Reilly <pmr@pajato.com>
parents:
9825
diff
changeset
|
1925 do_call (widget, closure, post_activate); |
5626 | 1926 } |
1927 | |
27422
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1928 static void |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1929 xm_unmap_callback (widget, closure, call_data) |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1930 Widget widget; |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1931 XtPointer closure; |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1932 XtPointer call_data; |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1933 { |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1934 widget_instance *instance = (widget_instance *) closure; |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1935 if (!instance->pop_up_p) |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1936 do_call (widget, closure, post_activate); |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1937 } |
5c5bb4b1ff45
(make_menu_in_widget): Don't add XmNpopdownCallback,
Gerd Moellmann <gerd@gnu.org>
parents:
27345
diff
changeset
|
1938 |
5626 | 1939 |
1940 /* set the keyboard focus */ | |
1941 void | |
11299
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1942 xm_set_keyboard_focus (parent, w) |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1943 Widget parent; |
f82f4e93e523
(*): remove function prototypes.
Paul Reilly <pmr@pajato.com>
parents:
11245
diff
changeset
|
1944 Widget w; |
5626 | 1945 { |
1946 XmProcessTraversal (w, 0); | |
1947 XtSetKeyboardFocus (parent, w); | |
1948 } | |
9224
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1949 |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1950 /* Motif hack to set the main window areas. */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1951 void |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1952 xm_set_main_areas (parent, menubar, work_area) |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1953 Widget parent; |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1954 Widget menubar; |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1955 Widget work_area; |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1956 { |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1957 XmMainWindowSetAreas (parent, |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1958 menubar, /* menubar (maybe 0) */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1959 0, /* command area (psheets) */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1960 0, /* horizontal scroll */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1961 0, /* vertical scroll */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1962 work_area); /* work area */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1963 } |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1964 |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1965 /* Motif hack to control resizing on the menubar. */ |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1966 void |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1967 xm_manage_resizing (w, flag) |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1968 Widget w; |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1969 Boolean flag; |
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1970 { |
27998
e61be6a5e321
(xm_manage_resizing): Rewritten.
Gerd Moellmann <gerd@gnu.org>
parents:
27422
diff
changeset
|
1971 XtVaSetValues (w, XtNallowShellResize, flag, NULL); |
9224
b4563001d783
(make_menu_in_widget): Add support for displaying a title in pop up
Paul Reilly <pmr@pajato.com>
parents:
8884
diff
changeset
|
1972 } |