sundar@WHEATIES.AI.MIT.EDU (Sundar Narasimhan) (07/12/88)
The styles of XtSetArg suggested in the ToolKit documentation are all
fine. But for those of us that have <varargs.h>, and have used
SunView, and like less cluttered code, the following should make it a
little easier to create and add widgets (it is also less error prone,
believe me): (I'd like to suggest that
something like the following be added to the toolkit)
Example of usage:
wid_status_form = (Widget)
xt_add_widget("statusform", wid_frame, formWidgetClass,
XtNfromVert, wid_status,
XtNresizable, TRUE,
NULL);
wid_commands = (Widget)
xt_add_widget("commands", wid_frame, formWidgetClass,
XtNfromVert, wid_status_form,
XtNresizable, FALSE,
NULL);
I leave similar interfaces for the XtSetValues and XtGetValues
functions, and ways of implementing this without using a fixed-size
array on the stack as exercises for the reader.
-Sundar
-----------------
#include <X11/Intrinsic.h>
#include <varargs.h>
#include <stdio.h>
#define MAXARGS 20
/* Varargs passed one down */
xt_set_listargs(args, i, maxval, list)
Arg args[];
int *i;
int maxval;
va_list *list;
{
va_list var = *list;
int argno;
String argstr;
XtArgVal argval;
argstr = va_arg(var, char *);
if(i != NULL) argno = *i;
else argno = 0;
while(argstr) {
argval = va_arg(var, XtArgVal);
if((argno + 1) > maxval) {
fprintf(stderr, "xt_set_args: Arg array overflowed!\n");
va_end(var);
return -1;
}
XtSetArg(args[argno], argstr, argval);
if(i != NULL)
*i = ++argno;
argstr = va_arg(var, char *);
}
return 0;
}
/*VARARGS*/
Widget
xt_add_widget(name, parent, class, va_alist)
char *name;
Widget parent;
WidgetClass class;
va_dcl
{
va_list var;
Arg args[MAXARGS];
int i = 0;
/* First take care of any additional arguments */
va_start(var);
xt_set_listargs(args, &i, MAXARGS, &var);
va_end(var);
return(XtCreateManagedWidget(name, class, parent, args, i));
}