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