1/*
2
3Copyright (c) 1993, Oracle and/or its affiliates.
4
5Permission is hereby granted, free of charge, to any person obtaining a
6copy of this software and associated documentation files (the "Software"),
7to deal in the Software without restriction, including without limitation
8the rights to use, copy, modify, merge, publish, distribute, sublicense,
9and/or sell copies of the Software, and to permit persons to whom the
10Software is furnished to do so, subject to the following conditions:
11
12The above copyright notice and this permission notice (including the next
13paragraph) shall be included in all copies or substantial portions of the
14Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22DEALINGS IN THE SOFTWARE.
23
24*/
25
26/*
27
28Copyright 1885, 1986, 1987, 1988, 1989, 1994, 1998  The Open Group
29
30Permission to use, copy, modify, distribute, and sell this software and its
31documentation for any purpose is hereby granted without fee, provided that
32the above copyright notice appear in all copies and that both that
33copyright notice and this permission notice appear in supporting
34documentation.
35
36The above copyright notice and this permission notice shall be included in
37all copies or substantial portions of the Software.
38
39THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
40IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
41FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
42OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
43AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
44CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
45
46Except as contained in this notice, the name of The Open Group shall not be
47used in advertising or otherwise to promote the sale, use or other dealings
48in this Software without prior written authorization from The Open Group.
49
50*/
51
52#ifdef HAVE_CONFIG_H
53#include <config.h>
54#endif
55#include "IntrinsicI.h"
56#include "StringDefs.h"
57#include "Shell.h"
58#include "VarargsI.h"
59#include "CreateI.h"
60
61static Widget
62_XtVaCreateWidget(String name,
63                  WidgetClass widget_class,
64                  Widget parent,
65                  va_list var,
66                  int count)
67{
68    register Widget widget;
69    XtTypedArgList typed_args = NULL;
70    Cardinal num_args;
71
72    _XtVaToTypedArgList(var, count, &typed_args, &num_args);
73
74    widget = _XtCreateWidget(name, widget_class, parent, (ArgList) NULL,
75                             (Cardinal) 0, typed_args, num_args);
76
77    XtFree((XtPointer) typed_args);
78
79    return widget;
80}
81
82Widget
83XtVaCreateWidget(_Xconst char *name,
84                 WidgetClass widget_class,
85                 Widget parent,
86                 ...)
87{
88    va_list var;
89    register Widget widget;
90    int total_count, typed_count;
91
92    WIDGET_TO_APPCON(parent);
93
94    LOCK_APP(app);
95    va_start(var, parent);
96    _XtCountVaList(var, &total_count, &typed_count);
97    va_end(var);
98
99    va_start(var, parent);
100    widget = _XtVaCreateWidget((String) name, widget_class, parent, var,
101                               total_count);
102    va_end(var);
103    UNLOCK_APP(app);
104    return widget;
105}
106
107Widget
108XtVaCreateManagedWidget(_Xconst char *name,
109                        WidgetClass widget_class,
110                        Widget parent,
111                        ...)
112{
113    va_list var;
114    register Widget widget;
115    int total_count, typed_count;
116
117    WIDGET_TO_APPCON(parent);
118
119    LOCK_APP(app);
120    va_start(var, parent);
121    _XtCountVaList(var, &total_count, &typed_count);
122    va_end(var);
123
124    va_start(var, parent);
125    widget = _XtVaCreateWidget((String) name, widget_class, parent, var,
126                               total_count);
127    XtManageChild(widget);
128    va_end(var);
129    UNLOCK_APP(app);
130    return widget;
131}
132
133Widget
134XtVaAppCreateShell(_Xconst char *name,
135                   _Xconst char *class,
136                   WidgetClass widget_class,
137                   Display *display,
138                   ...)
139{
140    va_list var;
141    register Widget widget;
142    XtTypedArgList typed_args = NULL;
143    Cardinal num_args;
144    int total_count, typed_count;
145    DPY_TO_APPCON(display);
146
147    LOCK_APP(app);
148    va_start(var, display);
149
150    _XtCountVaList(var, &total_count, &typed_count);
151    va_end(var);
152
153    va_start(var, display);
154
155    _XtVaToTypedArgList(var, total_count, &typed_args, &num_args);
156    widget = _XtAppCreateShell((String) name, (String) class, widget_class,
157                               display, (ArgList) NULL, (Cardinal) 0,
158                               typed_args, num_args);
159
160    XtFree((XtPointer) typed_args);
161
162    va_end(var);
163    UNLOCK_APP(app);
164    return widget;
165}
166
167Widget
168XtVaCreatePopupShell(_Xconst char *name,
169                     WidgetClass widget_class,
170                     Widget parent,
171                     ...)
172{
173    va_list var;
174    register Widget widget;
175    XtTypedArgList typed_args = NULL;
176    Cardinal num_args;
177    int total_count, typed_count;
178
179    WIDGET_TO_APPCON(parent);
180
181    LOCK_APP(app);
182    va_start(var, parent);
183    _XtCountVaList(var, &total_count, &typed_count);
184    va_end(var);
185
186    va_start(var, parent);
187
188    _XtVaToTypedArgList(var, total_count, &typed_args, &num_args);
189    widget = _XtCreatePopupShell((String) name, widget_class, parent,
190                                 (ArgList) NULL, (Cardinal) 0, typed_args,
191                                 num_args);
192
193    XtFree((XtPointer) typed_args);
194
195    va_end(var);
196    UNLOCK_APP(app);
197    return widget;
198}
199
200void
201XtVaSetValues(Widget widget, ...)
202{
203    va_list var;
204    ArgList args = NULL;
205    Cardinal num_args;
206    int total_count, typed_count;
207
208    WIDGET_TO_APPCON(widget);
209
210    LOCK_APP(app);
211    va_start(var, widget);
212    _XtCountVaList(var, &total_count, &typed_count);
213    va_end(var);
214
215    va_start(var, widget);
216
217    _XtVaToArgList(widget, var, total_count, &args, &num_args);
218    XtSetValues(widget, args, num_args);
219    _XtFreeArgList(args, total_count, typed_count);
220
221    UNLOCK_APP(app);
222    va_end(var);
223}
224
225void
226XtVaSetSubvalues(XtPointer base,
227                 XtResourceList resources,
228                 Cardinal num_resources,
229                 ...)
230{
231    va_list var;
232    ArgList args;
233    Cardinal num_args;
234    int total_count, typed_count;
235
236    va_start(var, num_resources);
237    _XtCountVaList(var, &total_count, &typed_count);
238    va_end(var);
239
240    if (typed_count != 0) {
241        XtWarning("XtVaTypedArg is not valid in XtVaSetSubvalues()\n");
242    }
243
244    va_start(var, num_resources);
245    _XtVaToArgList((Widget) NULL, var, total_count, &args, &num_args);
246
247    XtSetSubvalues(base, resources, num_resources, args, num_args);
248
249    XtFree((XtPointer) args);
250
251    va_end(var);
252}
253
254Widget
255_XtVaOpenApplication(XtAppContext *app_context_return,
256                     _Xconst char *application_class,
257                     XrmOptionDescList options,
258                     Cardinal num_options,
259                     int *argc_in_out,
260                     _XtString *argv_in_out,
261                     String *fallback_resources,
262                     WidgetClass widget_class,
263                     va_list var_args)
264{
265    XtAppContext app_con;
266    Display *dpy;
267    register int saved_argc = *argc_in_out;
268    Widget root;
269    String attr;
270    int count = 0;
271    XtTypedArgList typed_args;
272
273    XtToolkitInitialize();      /* cannot be moved into _XtAppInit */
274
275    dpy = _XtAppInit(&app_con, (String) application_class, options, num_options,
276                     argc_in_out, &argv_in_out, fallback_resources);
277
278    typed_args = (XtTypedArgList) __XtMalloc((unsigned) sizeof(XtTypedArg));
279    attr = va_arg(var_args, String);
280    for (; attr != NULL; attr = va_arg(var_args, String)) {
281        if (strcmp(attr, XtVaTypedArg) == 0) {
282            typed_args[count].name = va_arg(var_args, String);
283            typed_args[count].type = va_arg(var_args, String);
284            typed_args[count].value = va_arg(var_args, XtArgVal);
285            typed_args[count].size = va_arg(var_args, int);
286        }
287        else {
288            typed_args[count].name = attr;
289            typed_args[count].type = NULL;
290            typed_args[count].value = va_arg(var_args, XtArgVal);
291            typed_args[count].size = 0;
292        }
293        count++;
294        typed_args = XtReallocArray(typed_args, (Cardinal) count + 1,
295                                    (Cardinal) sizeof(XtTypedArg));
296    }
297    typed_args[count].name = NULL;
298
299    va_end(var_args);
300
301    root =
302        XtVaAppCreateShell(NULL, application_class,
303                           widget_class, dpy,
304                           XtNscreen, (XtArgVal) DefaultScreenOfDisplay(dpy),
305                           XtNargc, (XtArgVal) saved_argc,
306                           XtNargv, (XtArgVal) argv_in_out,
307                           XtVaNestedList, (XtVarArgsList) typed_args, NULL);
308
309    if (app_context_return != NULL)
310        *app_context_return = app_con;
311
312    XtFree((XtPointer) typed_args);
313    XtFree((XtPointer) argv_in_out);
314    return (root);
315}
316
317Widget
318_XtVaAppInitialize(XtAppContext *app_context_return,
319                   _Xconst char *application_class,
320                   XrmOptionDescList options,
321                   Cardinal num_options,
322                   int *argc_in_out,
323                   _XtString *argv_in_out,
324                   String *fallback_resources,
325                   va_list var_args)
326{
327    return _XtVaOpenApplication(app_context_return, application_class,
328                                options, num_options,
329                                argc_in_out, argv_in_out, fallback_resources,
330                                applicationShellWidgetClass, var_args);
331}
332
333/*
334 * If not used as a shared library, we still need a front end to
335 * _XtVaOpenApplication and to _XtVaAppInitialize.
336 */
337
338Widget
339XtVaOpenApplication(XtAppContext *app_context_return,
340                    _Xconst char *application_class,
341                    XrmOptionDescList options,
342                    Cardinal num_options,
343                    int *argc_in_out,
344                    _XtString *argv_in_out,
345                    String *fallback_resources,
346                    WidgetClass widget_class,
347                    ...)
348{
349    Widget code;
350    va_list var;
351
352    va_start(var, widget_class);
353    code = _XtVaOpenApplication(app_context_return, (String) application_class,
354                                options, num_options, argc_in_out, argv_in_out,
355                                fallback_resources, widget_class, var);
356    va_end(var);
357    return code;
358}
359
360Widget
361XtVaAppInitialize(XtAppContext *app_context_return,
362                  _Xconst char *application_class,
363                  XrmOptionDescList options,
364                  Cardinal num_options,
365                  int *argc_in_out,
366                  _XtString *argv_in_out,
367                  String *fallback_resources,
368                  ...)
369{
370    Widget code;
371    va_list var;
372
373    va_start(var, fallback_resources);
374    code = _XtVaOpenApplication(app_context_return, (String) application_class,
375                                options, num_options, argc_in_out, argv_in_out,
376                                fallback_resources,
377                                applicationShellWidgetClass, var);
378    va_end(var);
379    return code;
380}
381